Post

(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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@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, 빈값 관련

주의해야 할 점

annotation resolve?
  • @Size같은건, 직접 new로 객체를 생성할 때는 동작하는게 아니다.
  • controller에서 @Valid매핑할 때 동작하거나, 직접 validator를 불러주어 annotation을 resolve하도록 해야 한다.
javax.validation.constraints 와 org.hibernate.validator.constraints

@Email 애너테이션을 사용하는데, 다음과 같은 에러가 발생함

1
2
3
4
5

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.