TIL(Today I Learned)

[Today I Learned - 3] @Nonnull(jakarta.annotation) 과 @NotNull(jakarta.validation.constraints)

lazy man 2023. 12. 22. 12:00

개발하다보면 메서드의 파라미터의 유효성을 검사하기 위해 null 체크를 하게됩니다. 이러한 체크 과정이 번거로워서 알아보던 중에 @Nonnull 어노테이션과 @NotNull 어노테이션에 대해 알게되어서 정리하려고 합니다.

 

1. @Nonnull 과 @NotNull

메소드의 파라미터에 사용할 수 어노테이션으로 해당 어노테이션을 사용하면 null을 넘기는 것에 대해 주의할 수 있도록 메세지를 주는 어노테이션입니다.

 

2. @Nonnull vs @NotNull

두 어노테이션은 메소드로 null을 파라미터로 전달했을 때 NULL 객체를 참조하면서 NPE가 터지기 전에 예외가 발생하는지에 대한 차이가 있습니다.

 

테스트 결과 @Nonnull은 예외가 발생하지 않으며 @NotNull에 경우는 컴포넌트로 등록된 클래스의 메소드의 경우에만 ContraintViolationException이 발생하는 것을 확인하였습니다.

 

먼저 컴포넌트의 메소드가 아닐 때 @NotNull을 테스트 해보겠습니다. NormalClass는 컴포넌트가 아니며, NomarlClass의 printNotNull 메소드는 @NotNull 어노테이션이 붙어있지만 null을 파라미터로 전달해도 테스트가 정상적으로 통과하는 것을 확인할 수 있습니다.

 

반면 컴포넌트의 메소드인 경우 @NotNull 어노테이션이 붙은 메소드에 null을 전달하면 ConstraintViolationException이 발생하는 것을 확인할 수 있습니다.