개발/Java

Java의 @NonNull vs @Nonnull vs @NotNull 정리

nova_dev 2025. 3. 20. 23:33
반응형

Java의 @NonNull vs @Nonnull vs @NotNull 정리

Java에서 null을 방지하는 애너테이션을 사용할 때 @NonNull, @Nonnull, @NotNull 등 다양한 애너테이션이 있어서 헷갈릴 수 있습니다.

이 글에서는 Lombok의 @NonNull, Jakarta(또는 javax)의 @Nonnull, Java Bean Validation의 @NotNull 차이점을 정리하고, 최신 환경에서 올바르게 사용하는 방법을 설명하겠습니다. 😊


1. @NonNull (Lombok)

📌 소속 패키지: lombok.NonNull

📌 특징: Lombok이 제공하는 애너테이션으로, 자동으로 null 체크 코드가 삽입됩니다.

✅ 주요 기능

  • 생성자나 메서드 매개변수에 null이 들어오지 않도록 강제합니다.
  • Lombok이 자동으로 null 체크 코드를 추가해줍니다.

📌 사용 예제

💡 위 코드를 컴파일하면 자동으로 다음 코드가 추가됩니다.

따라서 setName(null)을 호출하면 NullPointerException이 발생합니다.


2. @Nonnull (Jakarta / javax)

📌 소속 패키지:

  • javax.annotation.Nonnull
  • jakarta.annotation.Nonnull

📌 특징:

  • Jakarta EE, Spring 등에서 사용되며, 코드 분석 도구(FindBugs, SpotBugs 등)에서 null 관련 경고를 제공하는 용도입니다.
  • Lombok과 달리 자동으로 null 체크 코드를 삽입하지 않습니다.

📌 사용 예제

💡 주의할 점: @Nonnull은 자동으로 null을 검사해주지 않으므로, 실행 시 null을 넣어도 예외가 발생하지 않습니다. 대신 IDE나 정적 분석 도구에서 경고를 띄웁니다.


3. @NotNull (Java Bean Validation)

📌 소속 패키지:

  • javax.validation.constraints.NotNull
  • jakarta.validation.constraints.NotNull

📌 특징:

  • Java Bean Validation에서 제공하는 애너테이션으로, 실행 시 유효성 검사를 수행합니다.
  • Spring/Hibernate에서 @Valid와 함께 사용하면 컨트롤러에서 요청 객체를 받을 때 자동으로 null 검사를 수행합니다.
  • Java 17부터는 javax.* 패키지가 jakarta.*로 변경되었으므로, 반드시 jakarta.validation.constraints.NotNull을 사용해야 합니다!

📌 사용 예제 (Spring Boot 3.x, Java 17)

📌 Controller에서 @Valid와 함께 사용

💡 Java 17 + Spring Boot 3.x에서는 javax.validation.*을 사용하면 오류가 발생하므로, jakarta.validation.*을 사용해야 합니다!


4. 어떤 애너테이션을 써야 할까?

애너테이션제공 패키지기능

@NonNull lombok.NonNull Lombok이 null 체크 코드 자동 생성
@Nonnull jakarta.annotation.Nonnull 코드 분석 도구(FindBugs 등)가 경고 표시
@NotNull jakarta.validation.constraints.NotNull Java Bean Validation (Spring/Hibernate 등에서 사용)

🔹 어떤 경우에 어떤 걸 써야 할까?

  • Lombok을 사용 중이라면?@NonNull (자동 null 체크 기능 활용)
  • Spring/Hibernate에서 검증을 원한다면?@NotNull (jakarta.validation.constraints.NotNull 사용!)
  • 코드 분석 도구에서 경고를 받고 싶다면?@Nonnull

이제 @NonNull, @Nonnull, @NotNull의 차이점을 확실히 이해했을 거예요! 🚀

어떤 애너테이션을 사용할지 고민될 때, 이 글을 참고하세요. 🙌

반응형