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, 빈값 관련

  • `` @NotBlank``
    • `` @NotNull`` + "", " " 허용하지 않음
  • `` @NonNull``의 전체 적용?
  • 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을 권장하고 있으니 주의 ㅡ.ㅡ

이 것 때문에 장애가 ㅜ.ㅜ