[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 받으면서 한 번에 조건 체크
```java
@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`` 애너테이션을 사용하는데, 다음과 같은 에러가 발생함
```
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을 권장하고 있으니 주의 ㅡ.ㅡ
이 것 때문에 장애가 ㅜ.ㅜ
'Java Stack > Spring' 카테고리의 다른 글
[Spring] DB 관련 : H2 설정 (0) | 2019.07.23 |
---|---|
RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference) (1) | 2019.07.11 |
[Spring] annotation : lombok, builder (0) | 2019.07.10 |
Spring boot security 로그인 처리 (0) | 2019.06.04 |
[Spring] DB 관련 : JdbcTemplate (0) | 2019.05.28 |