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로 하여 테스트 실행을 해보자.
아래의 실행 결과를 보면 javax.persistence.RollBackException과 javax.validation.ConstraintViolationExcept 예외가 발생하였음
그리고 중요한 점은 Hibernate가 Insert 쿼리를 보내지 않았다는 것이다. 즉, DB에 쿼리 날리기 전에 유효성 검사를 통해서 먼저 예외를 발생한 것임.
아래의 그림 5를 보면 DDL 쿼리는 Not null로 하여 나간 것을 볼 수 있다.(bitrhday 필드를 @NotNull 매핑하였음)필드에 @NotNull 매핑을 하여도 DB의 컬럼에 Notnull을 반영하고 싶지 않으면 spring.jpa.properties.hibernate.validator.apply_to_ddl=false 옵션을 주면 됨
@Column(nullable = false)
위 그림 처럼 설정 후 테스트 코드를 돌리면 아래의 그림(6.1, 6.2) 처럼 오류가 발생하게 됨.예외를 보면 org.hibernate.PropertyValueException 예외가 발생하였고 그 이유는, birthday 컬럼이 null이기 때문이다.
여기서 중요한 점은 hibernate가 DB에 insert 쿼리를 보내지 않은 것이다!
실제 DDL은 not null로 나가 DB에 반영된 것을 볼 수 있음.
정리
두 매핑 다 유효성을 검사 하고 나서 DB에 null 값을 들어가는것을 방지하지만 @NotNull 매핑은 DB가 유효성 검사를 하기에 의존하기 보다 Bean Validation을 통한 유효성 검사를 통해 DB에 쿼리가 가기 전 미리 예외를 터트려 null값을 들어가는것을 방지한다.
그래서 DB에 유효성 검사를 의존하는 방식이 아닌 Bean Validation 규칙을 통한 유효성 검사를 하는 @NotNull 매핑이 더 효율적이다.
(하지만, 상황과 개발 환경에 따라 달라질 것 같음)
참고 자료 : https://www.baeldung.com/hibernate-notnull-vs-nullable
'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 |