(Spring) annotation - bean constraints, validation
beanvalidation.org/2.0/spec/#builtinconstraints
https://www.baeldung.com/javax-validation
- @Size, @Past, @Min(1) @Pattern 등
- 애너테이션이 어떤 제약조건을 가지고 있는지 확인하려면 그냥 애너테이션 소스 확인해보면 된다.
참고로
@Email
애너테이션은 길이 제한도 겸하고 있다.{64}@{255}
- DB에 저장할 때도 VARCHAR2(320)으로 하면 깔끔하다.
controller에서 data class 받으면서 한 번에 조건 체크
1
2
3
4
@AssertTrue(message = "허용된 리스트 목록에 없는 코드")
private boolean isInAllowList() {
return !Arrays.asList(A, B, C).contains(code);
}
Nullability 관련 annotation, 뭘 써야 하는거야?
- https://stackoverflow.com/questions/4963300/which-notnull-java-annotation-should-i-use
- 크게 다음 두 가지 부류로 나뉜다.
- 정적 분석을 도와주는 (ide hint) 애너테이션 류
- 동적으로 해당 변수에 null이 들어오는 순간 예외를 발생시켜주는 애너테이션 류
- 원래는 해당 변수에 null이 들어오는 것 자체는 NPE가 발생하지 않지만(필드에 접근하거나 메서드 call을 해야 NPE 발생) 해당 애너테이션을 붙여주면 들어오는 그 순간 Exception 발생하도록 할 수 있음.
- 하지만 이거, @Valid 같이 컨트롤러 단에서 수행해주는 것은 지원하지만 내부 데이터 클래스를 대상으로 생성할 때 애너테이션 기반 자동 체크 하도록 하는 것은 지원하지 않는 듯 보임.
- 내부 데이터 클래스는 그냥 생성자에서 null check 하는게 나은 것 같다.
Null, 빈값 관련
@NotNull
@NotEmpty
@NotNull + @Size(min=1)
- https://javaee.github.io/javaee-spec/javadocs/javax/validation/constraints/NotEmpty.html
@NotBlank
@NotNull
+ “”, “ “ 허용하지 않음
@NonNull
의 전체 적용?- NonNullFields, NonNullApi
- https://www.baeldung.com/spring-null-safety-annotations
- int같은 primitive type에는 @NonNull 계열의 애너테이션이 의미가 없으므로(warning뜬다.) 대신 @Min(1)을 쓴다.
주의해야 할 점
annotation resolve?
@Size
같은건, 직접new
로 객체를 생성할 때는 동작하는게 아니다.- controller에서
@Valid
매핑할 때 동작하거나, 직접 validator를 불러주어 annotation을 resolve하도록 해야 한다.
javax.validation.constraints 와 org.hibernate.validator.constraints
@Email
애너테이션을 사용하는데, 다음과 같은 에러가 발생함
1
2
3
4
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
'javax.validation.constraints.Email' validating type 'java.lang.String'
이는 javax.validation 1.0.1이 @Email을 지원하지 않아 생긴 문제. 분명 해당 라이브러리 constraints 패키지 확인해보면 없는데, intelliJ에서 @Email 입력 시 import 가이드로 javax.validation을 권장하고 있으니 주의 ㅡ.ㅡ 이 것 때문에 장애가 ㅜ.ㅜ
This post is licensed under CC BY 4.0 by the author.