본문 바로가기
Spring 프레임워크/이론

[ 스프링 프레임워크 ] Null Safety

by Hwanii_ 2023. 10. 22.
728x90

Null Safety

 

널 안정성을 높이는 방법

 

1)

애초에 아래의 코드와 같은 널 체크 코드를 만들지 않고 스프링 프레임워크에서 제공 하는 어노테이션을 사용 할 수 있다.

(널을 체크 하는 로직은 단순한 유효성 검사 로직을 반복 하는 것이기 때문에 보일러 플레이트 라고 볼 수 있다)

 

2)

아래의 코드와 달리,

애초에 널 체크를 코드를 작성 하지 않았다고 할 때, 발생하는 NPE 를 어노테이션을 통해 방지 할 수 있다.

 

3)

완벽한 방법은 아니지만, IDE 에서 경고를 표시함으로써,

1차적인 널 문제를 방지하고, 정확한 에러 위치를 확인할 수 있도록 할 수 있다.

 

public void method(String request) {

	if(request == null) return;

	System.out.println(request.toUpperCase());
    
}

 

위의 method 라는 이름을 가진 메서드는 메서드의 request 라는 파라미터로 되어있는 문자열 값을 받는다.

 

request가 null이면 return 하고,

 

null이 아니면 문자열 request의 값을 대문자로 변환 하도록 한다.

 

이때,

만약에 문자열 request가 null 이면 NPE 가 발생 하겠지만, if문으로 null 체크를 하기 때문에 NPE 가 발생 하지 않는다.

 

하지만 이렇게 로직으로 널 체크를 하는게 아닌 어노테이션을 사용 해서 널체크를 하는 방법은 아래와 같다.

 

 

 

@NonNull 어노테이션

 

>> 스프링 프레임워크 에서 기본 제공 해주는 어노테이션 이다.

 

1)

해당 값이나 함수 등이 null이 아님을 나타내는 어노테이션.

 

2)

org.springframework.lang.NonNull 을 사용.

 

3)

"메서드 파라미터" 에 붙이는 경우 : null 이라는 데이터가 들어오는 것을 사전에 방지.

 

 

String request 라는 메서드의 파라미터 앞에 @NonNull을 명시.

 

그래서 만약에 파라미터의 값으로 널 값이 들어오면 메서드 호출 동시와 바로 예외 발생.

 

따라서 정확히 어디서 널이 발생했는지를 알 수 있게 되서, 널 체크를 하기도 훨씬 용이.

 

4)

"프로퍼티 (멤버변수)" 에 붙이는 경우 : null을 저장하는 경우에 경고 알림.

 

 

위의 public String request = "REQUEST"; 가 있을 때,

 

메서드 내부에서 위와 같이 변수 request에 null을 대입 하려고 하면 알림 메세지가 뜨게 된다.

 

즉, 프로퍼티 자체가 null일 수가 없다는 것을 명시해 주는 것이다.

 

5)

"메서드" 에 붙이는 경우 : null을 리턴하는 경우에 경고창이 뜨게 된다.

 

응답값을 저장하거나 활용 하는 쪽도 NonNull 이라고 신뢰하고 사용 한다.

 

 

public String method() 라는 메서드 위에 @NonNull 을 명시 한다.

 

그러면 어떤 로직을 다 수행 하고, 어찌됬던지간에 반환값이 null 이면 알림 메세지가 뜨게 된다.

 

 

 

[ 정리 ]


1)
@NonNull 을 명시하면, null이 될 수 없는 값들을 미리 알 수 있게 해줌으로써, 코드를 안전하게 짤 수 있다.

2)
에러가 혹여나 발생하더라도 예외가 발생한 시점을 정확하게 알 수 있다.

 

 

 

@Nullable 어노테이션

 

1)

@NonNull 과 반대로 해당 데이터가 null 일 수도 있음을 명시 하는 어노테이션 이다.

 

2)

해당 어노테이션이 붙은 값을 사용 하는 경우, 항상 널 체크를 수행 하도록 경고 알림이 뜨게 된다.

 

자바의 원시타입을 제외한 모든 사용자 정의 타입 (객체) 은 null을 담을 수 있기 때문에,

항상 nullable 하다고 볼 수도 있다.

 

그렇지만, @Nullable 어노테이션을 명시해줌으로써,

정말로 이 객체가 널이 될 수 있는 값인지 아닌지를 알 수 있게 해주는 역할을 하는 어노테이션 이다.

 

즉,

개발자는 이 어노테이션을 사용함으로써, '이 객체가 널이 될 수도 있고, 널이 아닐 수도 있구나' 를 생각 하게 되므로,

Null Pointer Exception 을 방지 할 수 있는 안전한 코드를 작성 할 수 있게 된다. 

 

 

 

 

 

[ Null 어노테이션 관련 참고 ]

 

@NonNull 어노테이션과 @Nullable 어노테이션은 스프링 프레임워크에서 기본적으로 제공하는 기능 이다.

 

하지만, 인텔리제이 개발 회사인 jetbrain 또는 lombok 에서 제공 하는 null 어노테이션이 존재 한다.

이것들을 활용 할 수도 있음을 참고.

 

Annotations | IntelliJ IDEA Documentation (jetbrains.com)

 

Annotations | IntelliJ IDEA

 

www.jetbrains.com

 

@NonNull (projectlombok.org)

 

@NonNull

 

projectlombok.org

 

반응형