-
JPA Column의 null 제약 조건JPA 2023. 2. 7. 15:48test
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;
이렇게 해도 원하는 동작을 한다.
'JPA' 카테고리의 다른 글
@Transactional(readOnly = true) 는 Flush 가 동작안할꺼라 믿었다 (0) 2024.04.23 QueryDSL에서 SubQuery 에는 limit 를 사용 할 수 없다. (0) 2023.11.15 QueryDSL-JPA에서 인라인뷰를 써야 한다면 도망치자 (0) 2023.10.18 JPA 에서 GeneratedValue 를 하지않는다는것은 (0) 2022.09.03 [JPA] JPA 란 (0) 2020.12.08