ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA Column의 null 제약 조건
    JPA 2023. 2. 7. 15:48
    test

    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;
    

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