Hyun's Wonderwall

[Spring TIL] nullable=false, @NotNull, @NonNull의 차이는? (+@Nonnull은 또 뭐지?) 본문

Study/Java, Spring

[Spring TIL] nullable=false, @NotNull, @NonNull의 차이는? (+@Nonnull은 또 뭐지?)

Hyun_! 2024. 7. 4. 18:29

ERD를 설계할 때 컬럼을 NOT NULL로 설정하고, 엔티티 매핑을 위해 도메인 코드를 작성하다가 이것과 관련해 선택지가 많음을  알게 되었다. (사실 알게 된 지가 세 번은 넘었을 텐데, 정리를 해놓지 않았더니 헷갈려서 이번에 정리하게 되었다.)

1. nullable=false

컬럼을 NOT NULL로 설정하는 것. 엔티티와 매핑되는 테이블 생성을 위한 DDL 쿼리(create table)가 나갈 때, 컬럼에 NOT NULL 제약조건(constraints)를 걸어준다.

이것은 데이터베이스 테이블 컬럼에 NULL 값이 삽입되는 것을 막는 것이어서, 서비스 로직에서 엔티티에 NULL이 들어오는 것은 아무런 에러를 발생시키지 않는다.

2. @NotNull

Spring Boot Validation 라이브러리(build.gradle에 추가해서 사용)를 써서 유효성 검증을 수행하는 방법.

런타임 시 확인을 수행하여 엔티티에 NULL이 들어오는 것을 막는다.

NULL이 들어오면 RuntimeException인 IllegalArgumentException을 던진다.

이 어노테이션을 붙일 때에도 nullable=false와 마찬가지로 테이블 생성 시 컬럼에 NOT NULL 제약조건을 걸어준다.

3. Lombok의 @NonNull

같은 이름을 가진 애노테이션을 Spring에서도 제공하는데 보통 @NonNull을 이야기하면 Lombok 라이브러리가 제공하는 @NonNull을 말하는 것 같다. 이 애노테이션을 달면 NULL 체크 로직을 자동으로 생성하여 런타임 체크를 수행한다. NULL이 들어오면 RuntimeException인 NullPointerException을 던진다.

하지만 이는 애플리케이션 레벨에서의 NULL 체크여서 DB 스키마 생성에는 영향을 끼치지 않는다고 한다. 따라서 엔티티 필드 컬럼을 NOT NULL로 지정하는 역할로는 쓸 수 없다. 

결론: 엔티티 필드는 @NotNull을 쓰자 (DDL 컬럼 설정이 필요하고 서비스 로직에서도 NULL값이 들어가는지 확인 필요)

@NonNull은 NPE을 확인해야 할 때, 예를 들어 메소드 파라미터에 쓸 때 유용한 것 같다.

 

+ jakarta.annotation의 @Nonnull, springframework의 @NonNull

n, N 대소문자만 다른 애노테이션이 존재한다는 것을 알고 적잖이 충격을 받았었는데... @Nonnull과 스프링의 @NonNull은 컴파일 시에 null 체크를 수행하는 애노테이션으로 정적 코드 분석에 쓰일 수 있다고 한다. 요즘에는 잘 쓰이지 않는 것 같다.

 

이해에 참고한 글들:

https://kafcamus.tistory.com/15

 

[JPA] nullable=false와 @NotNull 비교, Hibernate Validation

오늘은 다음의 고민 때문에 글을 작성하게 되었다. JPA에서 DDL을 자동으로 생성할 수 있는데, 이 때 not null 옵션은 어떻게 붙이나? JPA의 엔티티 객체에 @NotNull 검증 어노테이션을 주면 어떻게 되나

kafcamus.tistory.com

https://better-tomorrow-than-today.tistory.com/m/98

 

@NonNull, @Nonnull, @NotNull, @NotEmpty, @NotBlank 비교

1. 정리하게된 배경초기 도메인 필드의 유효성을 검증하고자, 아래와 같이 @NonNull을 이용해서 구현했다. 초기 프로젝트 환경에서 validation 의존성이 추가되지 않아서, Spring 에서 제공되는 @NonNull

better-tomorrow-than-today.tistory.com

https://hyeon9mak.github.io/not-null-annotation-exception-handling/

 

@NotNull 어노테이션 예외처리 핸들링

📓 summary lombok에서 지원하는 @NonNull 어노테이션을 통해 엔티티의 필드를 검증하던 중, @NonNull 어노테이션이 필드에 Null 값이 주입될 경우 NullPointerException이 던져지는 것을 발견했다. 프로젝트의

hyeon9mak.github.io

https://velog.io/@e1psycongr00/data-jpa%EC%99%80-Lombok%EC%9D%98-NonNull-%EC%82%AC%EC%9A%A9%EA%B8%B0

 

data-jpa와 Lombok의 @NonNull 사용기

API 개발중 카테고리 ID를 입력하면 이를 바탕으로 해당 카테고리 내부의 카드를 페이징 조회하는 쿼리를 만들어야 했다. 이 때문에 categoryId 인자가 반드시 필요하다.보통 NPE 문제를 막고 인자에

velog.io