일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 라피신
- 개발공부
- 프로그래밍
- 체크인미팅
- 자바개발자
- UNICON2023
- CICD
- 42서울
- AWS
- 스프링
- 온라인테스트
- 배포
- EC2
- 오블완
- 인프라
- UNIDEV
- RDS
- 전국대학생게임개발동아리연합회
- 스프링부트
- 위키북스
- 게임개발동아리
- 티스토리챌린지
- 프리티어
- Developer
- 생활코딩
- 인디게임
- 백엔드
- 백엔드개발자
- 도커
- UNICON
- Today
- Total
Hyun's Wonderwall
[Spring TIL] nullable=false, @NotNull, @NonNull의 차이는? (+@Nonnull은 또 뭐지?) 본문
[Spring TIL] nullable=false, @NotNull, @NonNull의 차이는? (+@Nonnull은 또 뭐지?)
Hyun_! 2024. 7. 4. 18:29ERD를 설계할 때 컬럼을 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 체크를 수행하는 애노테이션으로 정적 코드 분석에 쓰일 수 있다고 한다. 요즘에는 잘 쓰이지 않는 것 같다.
+ NotEmpty, NotBlank
validation에 있는 애노테이션들인데 각각 "", " "을 막는다. 그런데 컬럼에 NOT NULL 설정은 안해주어서 Dto에서 필요할 때 사용하고 있다.
이해에 참고한 글들:
https://kafcamus.tistory.com/15
https://better-tomorrow-than-today.tistory.com/m/98
https://hyeon9mak.github.io/not-null-annotation-exception-handling/
https://velog.io/@e1psycongr00/data-jpa%EC%99%80-Lombok%EC%9D%98-NonNull-%EC%82%AC%EC%9A%A9%EA%B8%B0
'Study > Java, Spring' 카테고리의 다른 글
[AWS] EC2, 탄력적 IP, RDS 옮기기! (1) | 2024.10.01 |
---|---|
[Spring Boot] 백엔드 서버 배포방법 총정리 - AWS EC2, RDS + Docker + GitHub Actions로 CI/CD🌿 (5) | 2024.09.22 |
[도서리뷰] 자바/스프링 개발자를 위한 실용주의 프로그래밍 (0) | 2024.07.03 |
[EFUB 4기 BE Lead] 도메인 주도 개발 시작하기 - 11장. CQRS (0) | 2024.05.13 |
[EFUB 4기 BE Lead] 도메인 주도 개발 시작하기 - 10장. 이벤트 (0) | 2024.05.13 |