@NotNull 그리고 더 이상 사용되지 않는 @NotEmpty, @NotBlank
구글에서 null 체크해주는 어노테이션을 찾아보면
@NotNull, @NotEmpty, @NotBlank이 나오는데 각 어노테이션 마다 허용해주는 범위는 아래와 같다,
@NotNull : null
@NotEmpty : null, ""
@NotBlank : null, "", " "(공백)
하지만 @NotEmpty, @NotBlank은 Bean Validation 2.0부턴 더 이상 사용되지 않는다.
그렇기 때문에 Hibernate Validator 6.x이상 쓴다면 @NotEmpty, @NotBlank을 사용 할 수 없다.
deprecated 이전에는 @NotEmpty, @NotBlank에 @NotNull이 포함되어 있으므로 DDL을 생성할 때 열에 "not null"이 입력 되었다.
Jakatra Bean Validation(Bean Validation 2.0, JSR 380)부터는 @NotEmpty 및 @NotBlank에 @NotNull 주석이 포함되어 있지 않아 DDL을 생성 할 때 not null 제약 조건이 추가되지 않는다
만약 null, "", " "과 not null 제약 조건을 추가해야 한다면
@NotNull, @Size을 해야한다
아래는 hibernate 문서 소스이다
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(2)
private int seatCount;
// ...
}
DDL에 제약 조건 not null이 생성되게 하는 @Column(nullable = false)
javax.persistence Annotation @Column에 nullable=false 속성을 추가하면 @NotNull과 마찬 가지로 자동 생성되는 DDL에 제약 조건 not null이 생성된다.
@Entity
public class Item {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private BigDecimal price;
}
@NotNull과 @Column(nullable = false)
둘 다 데이터베이스에 null값을 저장하는 것을 방지하지만 서로 다른 접근 방식을 취하게 된다.
@Column(nullable = false)은 DB에 넘어간 뒤 예외가 발생하고
@NotNull은 Hibernate가 삽입 또는 수정 SQL 쿼리를 데이터베이스로 보내기 전에 유효성 검사가 수행된다.
그래서 일반적으로 @Column(nullable=false)보단 @NotNull 선호되는데
그 이유는 데이터베이스에서 유효성 검사 로직을 처리하지 않고 빈 유효성 검사에 정의된 표준 규칙에 의존하는 것이 좋기 때문이다.
다만, @NotNull로 데이터베이스 제약 조건을 거는 경우 주의해야 할 점이 있는데
hibernate.validator.apply_to_ddl 속성이 true로 되어야 @NotNull 주석이 데이터베이스 제약 조건으로 변환된다.
[참고]
[JPA] nullable=false와 @NotNull 비교, Hibernate Validation
Hibernate - Released under the ASL v2 Application layer agnostic validation
'IT > 기록' 카테고리의 다른 글
[Flutter] 첫 앱 게시 삽질기 #1 잘 게시 되길 바라며 (0) | 2022.06.07 |
---|---|
[Flutter] 화면 전환 (0) | 2022.06.02 |
[Flutter] ColorScheme class - 주요 색상만 지정하면 색깔을 알아서 뚝딱? (0) | 2022.05.20 |
Spring Data JPA 간단하게 알아보기 (0) | 2022.05.19 |
VSCODE 단축키 (0) | 2022.05.19 |