2022. 3. 24. 13:00ㆍBackEnd(Java)/Spring Data JPA
특정 테이블의 컬럼을 Not Null으로 설정이 필요할 때 JPA에서 @Not NUll 컬럼과 @Column(nullable = false)를 지원한다. (nullable의 디폴트는 true 값이다)
그러면 어떤 차이점이 있고, 어떤 것이 더 효율적일까? @Not Null부터 알아보자
@Not null
먼저 그림 1처럼 Member 엔티티를 만들고 birthday 필드를 @NotNull로 매핑하였음
@NotNull 테스트를 위해 Member 객체를 하나 만들고 birthday를 null로 하여 테스트 실행을 해보자.
![](https://blog.kakaocdn.net/dn/bnUWWi/btrxaPZWy2N/gKY5Q4StK3CVZ5Ji75442k/img.png)
![](https://blog.kakaocdn.net/dn/blrB4C/btrw64cKFjW/Xx8HeJ2Kb2wBhkAM6fH3r0/img.png)
아래의 실행 결과를 보면 javax.persistence.RollBackException과 javax.validation.ConstraintViolationExcept 예외가 발생하였음
그리고 중요한 점은 Hibernate가 Insert 쿼리를 보내지 않았다는 것이다. 즉, DB에 쿼리 날리기 전에 유효성 검사를 통해서 먼저 예외를 발생한 것임.
![](https://blog.kakaocdn.net/dn/bvD5au/btrw5QstvfK/9thcPkwRD8wYxAMgIsnHgK/img.png)
![](https://blog.kakaocdn.net/dn/bVc2uj/btrw6gYO29s/NHOl4g27NmXeFk4inCGnM1/img.png)
아래의 그림 5를 보면 DDL 쿼리는 Not null로 하여 나간 것을 볼 수 있다.(bitrhday 필드를 @NotNull 매핑하였음)필드에 @NotNull 매핑을 하여도 DB의 컬럼에 Notnull을 반영하고 싶지 않으면 spring.jpa.properties.hibernate.validator.apply_to_ddl=false 옵션을 주면 됨
![](https://blog.kakaocdn.net/dn/40cfN/btrw45cmwgy/tq7plhzCsU1Ujr4kREVTsk/img.png)
@Column(nullable = false)
![](https://blog.kakaocdn.net/dn/I7Gbu/btrw5D7hqTB/pt6o0zKKwfv6K3FOdkRDhK/img.png)
![](https://blog.kakaocdn.net/dn/ZNxOC/btrw7Q6oExQ/TBQ5XCEgD7FdLpDEb1lZx1/img.png)
위 그림 처럼 설정 후 테스트 코드를 돌리면 아래의 그림(6.1, 6.2) 처럼 오류가 발생하게 됨.예외를 보면 org.hibernate.PropertyValueException 예외가 발생하였고 그 이유는, birthday 컬럼이 null이기 때문이다.
여기서 중요한 점은 hibernate가 DB에 insert 쿼리를 보내지 않은 것이다!
![](https://blog.kakaocdn.net/dn/SWugZ/btrw5Q66dX5/lS5KlDYMHMj24Q0v3zvktK/img.png)
![](https://blog.kakaocdn.net/dn/bGJuNz/btrxahI9ICb/FoClNQfBTCO5KjPuuCMBnk/img.png)
실제 DDL은 not null로 나가 DB에 반영된 것을 볼 수 있음.
![](https://blog.kakaocdn.net/dn/cCZWP8/btrxb0tlVMc/40JAUGcj6R6yakiI9paaP1/img.png)
![](https://blog.kakaocdn.net/dn/boGE4V/btrxaPr9klH/dWlXdpKTkl6ewWlb1pwZDk/img.png)
정리
두 매핑 다 유효성을 검사 하고 나서 DB에 null 값을 들어가는것을 방지하지만 @NotNull 매핑은 DB가 유효성 검사를 하기에 의존하기 보다 Bean Validation을 통한 유효성 검사를 통해 DB에 쿼리가 가기 전 미리 예외를 터트려 null값을 들어가는것을 방지한다.
그래서 DB에 유효성 검사를 의존하는 방식이 아닌 Bean Validation 규칙을 통한 유효성 검사를 하는 @NotNull 매핑이 더 효율적이다.
(하지만, 상황과 개발 환경에 따라 달라질 것 같음)
![](https://blog.kakaocdn.net/dn/dGco4P/btrw5QlOwwn/h85c5FCTRU8x3HheWGQxsK/img.gif)
참고 자료 : https://www.baeldung.com/hibernate-notnull-vs-nullable
Hibernate @NotNull vs @Column(nullable = false) | Baeldung
A quick and practical overview of @NotNull and @Column(nullable = false) in Java.
www.baeldung.com
'BackEnd(Java) > Spring Data JPA' 카테고리의 다른 글
생성 시간, 수정 시간 자동으로 값 넣기 (0) | 2022.03.29 |
---|---|
JPA - Mysql 컬럼명 대문자 생성이 안될 때 (0) | 2022.03.24 |
JPA - Mysql 컬럼 매핑 (0) | 2022.03.24 |
하이버네이트 자동 키 생성 전략 (0) | 2022.03.24 |
영속성 컨텍스트와 Transaction의 관계 (0) | 2022.03.23 |