ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [17] Null-Safety
    Spring/Spring 핵심 기술 2020. 5. 7. 18:34
    반응형

    Spring framework 5부터 compile time에 NullPointException을 최대한 방지하기 위한 annotation이 지원되고 있습니다.

     

     

    [Null-Safety 관련 annotation]

    @NonNull : 변수나 return value에 null을 허용하지 않을 경우 사용합니다. org.springframework.lang의 @NonNull을 사용해야 합니다.

     

    @Nullable : 변수나 return value에 null을 허용하는 경우 사용합니다. @NonNull과 마찬가지로 org.springframework.lang에 해당하는 annotation을 사용합니다.

     

     

     

     

    [Null-safety annotation 사용 위치]

    변수 값의 null 허용 여부 : null을 확인할 변수 앞에 지정합니다.

    return value의 null 허용 여부 : null을 확인할 method 앞에 붙여줍니다.

     

     

     

     

    [Null-safety annotation의 사용 예]

    Null-safety annotation을 실제 사용해보도록 합시다. 우선 Null-safety annotation을 적용할 class(EventService.java)를 하나 만듭니다.

    @Service
    public class EventService {
    
        @NonNull	//	①
        public String createEvent(@NonNull String name) {	//	②
            return "hello " + name;
        }
    }

    ① createEvent()의 return value는 null을 허용하지 않으며 이를 compile time에 확인합니다.

    ② 변수 String name은 null을 허용하지 않으며 이를 compile time에 확인합니다.

     

     

    Runner class (AppRunner.java)에서 EventService type bean을 주입받아 null을 허용하지 않는 변수 값 null을 지정해 봅니다.

    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        EventService eventService;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            eventService.createEvent(null);	// ①
        }
    }
    

    ① 변수에 null을 대입하여 EventService.createEvent()를 호출하도록 code를 작성합니다.

     

    Compile time에 원하지 않는 null값이 대입됨을 걸러야 하지만 build를 해도 IDE에서는 특별히 알려주는 정보가 없습니다. 이를 해결하기 위해 다음의 순서대로 Intellij 설정을 진행합니다.

     

    1. Ctrl + Alt + S (file > setting Menu)에서 compiler를 선택

     

    2. Add runtime assertions for notnull-annotated methods and parameters Check box에 check 하고 Cofigure annotations ... button을 click 해서 Nullable/NotNull Configuration 팝업을 실행합니다.

     

    3. Nullable/NotNull Configuration 팝업의 상, 하단으로 나뉘어 있으며 각각 Nullable과 NotNull annotation 들을 등록하도록 되어있습니다. 우측에 있는 + button을 클릭하여 Choose Nullable annotation 팝업을 실행합니다.

     

    4. 먼저 Nullable annotation을 설정해보도록 하겠습니다. annotation을 검색창에 입력해보면 org.springframework.lang의 annotation이 조회되며 해당 annotation을 선택하고 OK button을 click 하여 추가합니다.

     

    5. NotNull annotation도 4번과 동일한 방법으로 추가해줍니다.

     

    Intellij를 재시작해야 null관련 annotation에 대한 변경사항이 적용됩니다.

     

     

    다시 AppRunner class를 열어 확인해보면 null을 허용하지 않는 부분에 대해 compile time check가 되고 있음을 확인할 수 있습니다.

     

     

    이 기능을 SpringData에서 하고 있어 SpringData Repository에서 위의 두 annotation을 활용할 수 있습니다.

     

     

    [Package Level에서의 Null-Safety annotation]

    @NonNullApi과 @NonNullFields annotation은 package file을 만들어 설정하는 annotation입니다. 이 annotation들을 적용할 위치는 package-info file입니다. package-info file을 만들고 package 위에 @NonNullApi 또는 @NonNullFields를 추가하시면 각각 package 이하의 모든 public method와 filed에 대해 null을 허용하지 않도록 합니다.

    @NonNullApi
    //또는 @NonNullFields
    package org.spring.dave;
    
    import org.springframework.lang.NonNullApi;
    import org.springframework.lang.NonNullFields;

     

    package 전체의 method나 field에 대해 Null을 허용하지 않도록 하고 필요한 경우만 @Nullable annotation을 사용하여 허용해주는 형태로 운영이 가능합니다.

     

     

     

    댓글

Designed by Tistory.