유효성 검증(validation)이란?
- 오류를 방지하기 위해 미리 검증을 하는 과정
유효성 검증에 대한 주의점
- 검증해야 할 값이 많은 경우 코드의 길이가 길어진다.
- 구현에 따라서 달라질 수도 있겠지만 Service Logic과의 분리가 필요하다.
- 검증하는 코드가 흩어져 있는 경우 검증 위치가 불분명하며 재사용의 한계가 생긴다.
- 구현 방식에 따라 다르겠지만 Validation Logic이 변경되면 참조하는 클래스에서 Logic이 변경되어야 하는 부분이 발생할 수 있다.
- (중요 ★) 별로의 Logic이 필요한 어노테이션들 중에서
다른 VO 객체에서도 반복되는 내용이 있다면
아예 커스텀 어노테이션과 유효성 검증 클래스를 만드는 것이 낫다.
필요 dependency
- xml
- gradle
유효성 검증 어노테이션
- 길이 측정
- @Size(min=”최솟값”, max=”최댓값”)
- 문자 길이 설정
- int Type 사용불가
- @Size(min=”최솟값”, max=”최댓값”)
- null 또는 공백 여부 확인
- @NotNull
- null 사용불가
- @NotEmpty
- null 사용불가
- ”” 사용불가
- @NotBlank
- null 사용불가
- ”” 사용불가
- ” “ 사용불가
- @NotNull
- 날짜 확인
- @Past
- 과거 날짜
- @PastOrPresent
- 과거 날짜 또는 오늘 날짜
- @Future
- 미래 날짜
- @FutureOrPresent
- 미래 날짜 또는 오늘 날짜
- @Past
- 데이터 차이 비교
- @Max(value=”숫자”)
- 최댓값
- @Min(value=”숫자”)
- 최솟값
- @Max(value=”숫자”)
- 별도 Logic에 따른 유효성 검증
- @Pattern(regexp = “정규식”)
- 정규식 적용
- @AssertTure / @AssertFalse
- 별도 Logic 적용
- @Valid
- 해당 Object Validation 실행
(= 해당 어노테이션을 붙인 객체에 대해서 검사)
- 해당 Object Validation 실행
- @Pattern(regexp = “정규식”)
- 형식
- @Email
- 이메일 형식
※ 공통 속성
- message : validation이 실패할 경우 반환되는 default 메세지
- payload : 특정 validation을 group을 지정하는 값
- groups : 사용자가 추가 정보를 위해 전달할 수 있는 값, 주로 심각도를 나타낼 때 사용
- 이메일 형식
- @Email
사용 예시
Custom Validator
- validatior용 패키지를 만든다.
- 해당 패키지에 유효성 검사용 자바 클래스를 만든다.
- 해당 클래스에 ConstraintValidator 인터페이스를 구현한다.
- ConstraintValidator에는 두 값이 필요한데
첫번째는 검증에 필요한 어노테이션의 종류고
두번째는 해당 어노테이션을 통해 들어올 값의 자료형이다. - initialize 메소드와 isValid 메소드를 오버라이딩한 다음에 필요한 코드를 작성한다.
- initialize
- 어노테이션 등록시 값을 초기화하는 메소드
- isValid
- 어노테이션 등록시 해당 값을 검증하는 메소드
- addConstraintViolation(ConstraintValidatorContext 변수, 전달할 메세지, “키 값”…)를 통해서 에러 메세지 전달 가능
- addConstraintViolation의 키 값들은 ErrorResponse의 errors[].field에 바인딩된다.
- initialize
- 해당 validatior를 사용할 어노테이션 파일에 가서 @Constraint 어노테이션의 validatedBy 속성의 {} 안에 추가해주면 된다.
- 예시) @Constraint(validatedBy = { BirthdayValidator.class })
- 해당 validatior를 연결시킨 어노테이션을 필요한 곳에 추가해서 사용하면 된다.