본문 바로가기

BackEnd/Java&Spring

NonNull 사랑...사...사...랑... 그냥 좋아합니다.

무도 사랑해요

 

 

@NonNull은 사용자에게 null 체크 잘하십쇼 하고 알려줄 수 있는 어노테이션입니다

 

보통 사용할 수 있는 용도는 아래와 같습니다

Record component / 함수의 파라미터 / 생성자의 파라미터

 

요렇게 쓸 수 있습니다

 

public void doSomething(@NonNull String input) {
    // input은 null일 수 없음
    // 여기서 안전하게 input을 사용할 수 있음!!
}

 

 

@NonNull을 안 쓰면 아래와 같이 했겠쥬?

사실 씨쟁이는 아래의 코드가 더 익숙하지만 😒

파라미터만 보면 if 문 만들어야 직성이 풀리는 편.

 

public void doSomething(String input) {
    // input은 null이면 아니된다..
    if( input == null ) {
    	return;
    }
}

 

 

@NonNull을 쓰면 그럼 무엇이 좋을까?

위에 예시에서 보는 것처럼, 일단 가독성이 좋다.

그리고 null 관련 버그를 방지하는데 도움이 된다.

 


 

개인적인 의견으로...

나는 다른 개발자의 코드를 보면 나는 파라미터 예외 처리를 제일 먼저 보게 된다

왜냐구요?

저도 그렇게 되고 싶지 않았습니다...

올바른 output을 위해 올바른 input인지 잘 확인합시다요

 


@NonNull로 null 체크 예외 처리 방법

 

그럼 파라미터 null-check 시 어떻게 사용하느냐.

 

1. java.lang.NullPointerException 예외 발생시키기

default 예외는 NullPointerException이다

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    /* 아래 파라미터 체크를 생략해도 된다
    if (person == null) {
      throw new NullPointerException("person is marked non-null but is null");
    }
    */
    this.name = person.getName();
  }
}

 


테스트 코드 추가 첨부

 

    static public class NonNullExample {
        private String name;

        public NonNullExample(@NonNull Person person) {
            this.name = person.getName();
        }
    }

    @Data
    static public class Person {
        String name;
    }

    @Test
    @DisplayName("Person 객체가 null일 때 NPE 예외처리 확인")
    public void paramCheck_npe() {
        Throwable throwable = Assertions.assertThrows(NullPointerException.class, () -> new NonNullExample(null));
        assertEquals("person", throwable.getMessage());
    }

 

2. IllegalArgumentException으로 예외 메시지 바꾸기

IllegalArgumentException을 사용하면 예외 메시지를 다르게 설정할 수 있다고 한다

얘는 사용하려면 lombok 설정을 해줘야한당

 

lombok.nonNull.exceptionType = IllegalArgumentException

 

 

3. Assertion 사용하기

import lombok.NonNull;
import lombok.core.configuration.NonNullEx;
import lombok.core.configuration.NonNullEx.MethodName;

@NonNullEx(MethodName.ASSERT)
public class NonNullExample {
    private String name;

    public NonNullExample(@NonNull String name) {
        this.name = name;
    }
}

// 생성된 코드:
public NonNullExample(@NonNull String name) {
    assert name != null : "name is marked non-null but is null";
    this.name = name;
}

 

 

4. Objects.requireNonNull 함수 사용하기

java 7에 추가된 친구인데 Null 체크를 위한 함수다

파라미터로 입력된 값이면 NullPointerException을 발생시킨다

 

// 생성된 코드 (JDK를 사용하는 경우):
public NonNullExample(@NonNull String name) {
    java.util.Objects.requireNonNull(name, "name is marked non-null but is null");
    this.name = name;
}

 

 

5. @NonNull Flag 설정하기

아래 코드처럼 WARNING으로 설정하면 아래 경우에 경고를 활성화해서

개발자들의 실수를 줄여준다고 한다

 

- 필드/매개변수/리턴 타입에 적용 안 한 잘못된 경우

- 적절한 위치가 아닌 경우

- 규칙 위반한 경우

 

import lombok.NonNull;

@NonNullEx(FlagUsage.WARNING)
public class NonNullExample {
    private String name;

    public void processName(@NonNull String name) {
        // 이 부분에서 경고가 발생한드아
        System.out.println("Name: " + name);
    }
}

 


참고자료

 

https://projectlombok.org/features/NonNull

 

@NonNull

 

projectlombok.org