반응형
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의 차이점을 확실히 이해했을 거예요! 🚀
어떤 애너테이션을 사용할지 고민될 때, 이 글을 참고하세요. 🙌
반응형
'개발 > Java' 카테고리의 다른 글
Atomic Reference란? (1) | 2025.03.18 |
---|---|
Java 14 Record Keyword (0) | 2024.11.22 |
[Lombok][Warning] @Builder will ignore the initializing expression entirely. (0) | 2023.01.15 |
[Lombok][Warning] 상속받은 클래스에 @Data만 사용하면 Warning이 뜨는 이유 (0) | 2023.01.14 |
[Java] AssertJ 사용법 (0) | 2022.10.23 |