본문 바로가기

JPA

JPA Column의 null 제약 조건

JPA 에서 DDL 생성시 제약 조건을 매핑하는 과정에서

해당 필드에 null이 들어올수없도록 제약을 걸고 싶을때

@Column(name = "name", nullable = false)
private String name;

위와같이 nullable 를 false 로 주어 null 이 들어올수없는 제약을 걸어둘수있다.

create table tb_library (
   id varchar(255) not null,
   **name varchar(255) not null,**
   primary key (id)
) engine=InnoDB;

실제 테이블 생성 쿼리를 보면 name 컬럼에 not null 조건이 붙은 상태로 생성하는것을 볼수있다.

이렇게되면 name 필드에 null 이 들어간 엔티티는 DB 에 들어갈수는있지만

 

그렇다고 name 가 null 인 엔티티를 못만드는것은 아니다.

해당 엔티티는 null 인 값을 가진상태로 생성될수있고

 

실제 DB 에 저장쿼리를 날리면 DB에서 예외가 발생한다.

validation으로 not null

@NotNull
private String name;

Hibernate는 엔티티에 적용된 Bean Validation 어노테이션 또한 DDL 로 변환하는 특징을 가지고있다.

따라서 위와같은 @NotNull 어노테이션을 사용하면

create table tb_library (
   id varchar(255) not null,
   **name varchar(255) not null,**
   primary key (id)
) engine=InnoDB;

not null 조건이 붙은 상태로 생성하는것을 볼수있다.

 

여기서 중요한부분은

@Column 어노테이션에서 not null을 지정한경우에는 테이블에 제약조건이 발생하고

null을 DB 에 보내면 DB에서 예외가 발생했지만

 

Bean Validation 을 아용하여 not null을 지정한경우 테이블에 제약조건은 물론

null을 DB에 보내기 전에 검증하게된다.

 

또한

@NotEmpty, @NotBlank 를 사용하여 더욱 풍성한 제약조건을 사용할수있다.

그럼 @NotBlank 도 사용가능한가?

컬림이 String 인경우 null 뿐만 아니라 빈값 조차 검사하고싶어서 @NotEmpty 혹은 @NotBlank 를 사용하고싶을수있다.

하지만

@NotEmpty
private String name;

@NotEmpty 와 @NotBlank 에서는

create table tb_library (
   id varchar(255) not null,
   name varchar(255),
****   primary key (id)
) engine=InnoDB;

not null 제약조건이 생기지않는다.

 

따라서 not null 과 추가적인 제약 조건을 사용하고싶은경우에는

@NotNull 과 함께 @Size, @Min 등을 함께 사용하는것이 좋을것 같다.

 

아니면

@NotNull
@NotEmpty
private String name;

이렇게 해도 원하는 동작을 한다.