@Not Null vs @Column(nullable = false) 차이 비교

2022. 3. 24. 13:00BackEnd(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로 하여 테스트 실행을 해보자.

그림 1 - Member 엔티티 및 멤버 테스트 코드

 

아래의 실행 결과를 보면 javax.persistence.RollBackException과 javax.validation.ConstraintViolationExcept 예외가 발생하였음

그리고 중요한 점은 Hibernate가 Insert 쿼리를 보내지 않았다는 것이다. 즉, DB에 쿼리 날리기 전에 유효성 검사를 통해서 먼저 예외를 발생한 것임.

 

그림 3 - javax.persistence.RollBackException 예외

 

그림 4- javax.validation.ConstraintViolationExcept 예외

아래의 그림 5를 보면 DDL 쿼리는 Not null로 하여 나간 것을 볼 수 있다.(bitrhday 필드를 @NotNull 매핑하였음)필드에 @NotNull 매핑을 하여도 DB의 컬럼에 Notnull을 반영하고 싶지 않으면 spring.jpa.properties.hibernate.validator.apply_to_ddl=false 옵션을 주면 됨

 

그림 5 - DDL 쿼리

@Column(nullable = false)

nullable 매핑
옵션 설정

 

위 그림 처럼 설정 후 테스트 코드를 돌리면 아래의 그림(6.1, 6.2) 처럼 오류가 발생하게 됨.예외를 보면 org.hibernate.PropertyValueException 예외가 발생하였고 그 이유는, birthday 컬럼이 null이기 때문이다.

여기서 중요한 점은 hibernate가 DB에 insert 쿼리를 보내지 않은 것이다!

 

그림 6.1 - Rollback 예외 발생

 

그림 6.2 - PropertyValueException 예외 발생
 

 실제 DDL은 not null로 나가 DB에 반영된 것을 볼 수 있음.

그림 7.1 - DDL 쿼리

 

그림 7.2 - DB birthday 컬럼 Nullable No로 설정됨

정리

두 매핑 다 유효성을 검사 하고 나서 DB에 null 값을 들어가는것을 방지하지만 @NotNull 매핑은 DB가 유효성 검사를 하기에 의존하기 보다 Bean Validation을 통한 유효성 검사를 통해 DB에 쿼리가 가기 전 미리 예외를 터트려 null값을 들어가는것을 방지한다.

그래서 DB에 유효성 검사를 의존하는 방식이 아닌 Bean Validation 규칙을 통한 유효성 검사를 하는 @NotNull 매핑이 더 효율적이다.

(하지만, 상황과 개발 환경에 따라 달라질 것 같음)

 

참고 자료 : 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

반응형