지난번 스프링에서 기본적으로 제공하는 validation 구현방법에 관해 알아보았는데 이번에는 이어서 custom validation에 대해 알아보겠습니다.
1. 스프링(Spring) Custom Validation이란
Custom Validation은 표준 검증 메커니즘을 넘어서, 특정한 비즈니스 규칙이나 로직에 맞춰서 데이터 검증을 맞춤형으로 수행하는 과정이다. 예를 들어, 기본적인 이메일 형식 검증을 넘어서 특정 도메인의 이메일만 허용하거나, 특별한 조건을 만족하는 문자열만 허용하는 등의 경우에 사용된다.
2. Custom Validation 구현 방법
(1) 어노테이션 정의
먼저 custom validation 어노테이션을 정의하는 경우 interface를 생성하여 적용하여야 한다.
그리고 아래와 같이 @Target, @Retention, @Constraint 어노테이션을 사용한다.
@Target(AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [EmailValidator::class])
annotation class ValidEmail(
val message: String = "Invalid email format",
val groups: Array<KClass<*>>=[],
val payload: Array<KClass<out Payload>>=[]
)
- @Target은 ValidEmail 어노테이션이 적용될 수 있는 위치를 지정하는 것이다. AnnotationTarget.FIELD는 이 사용자 정의 어노테이션이 필드(예: 클래스의 속성)에만 적용되도록 한다.
- @Retention는 어노테이션의 보존 정책을 정하는 것이다. AnnotationRetention.RUNTIME은 ValidEmail 어노테이션이 런타임 동안에도 유지되어야 함을 의미한다. 이는 런타임에 리플렉션을 통해 이 어노테이션에 접근할 수 있다는 것을 뜻한다.
- @Constraint는 ValidEmail이 어떤 유효성 검사기 클래스에 의해 검증될 것인지를 지정한다. 여기서는 EmailValidator 클래스가 지정되어 있다. 이 클래스는 이메일의 형식을 검증하는 실제 로직을 구현해야 한다.
(2) 유효성 검증 로직 구현
어노테이션에 지정된 validatedBy에 해당하는 클래스에서 실제 유효성 검증 로직을 구현한다.
class EmailValidator : ConstraintValidator<ValidEmail, String> {
override fun isValid(p0: String?, p1: ConstraintValidatorContext?): Boolean {
return p0 != null && p0.matches(Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"))
}
}
- p0 != null은 이메일 주소가 null이 아닌지를 확인한다. 만약 null인 경우에는 유효하지 않은 것으로 간주한다.
- p0.matches(Regex("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"))는 이메일 주소가 정규 표현식과 일치하는지를 확인한다. 이 정규 표현식은 일반적인 이메일 주소 형식을 나타낸다. 예를 들어, 사용자 이름 부분에는 영문자, 숫자, 밑줄, 점, 백분율 기호, 플러스 기호, 빼기 기호가 올 수 있으며, '@' 기호 뒤에는 도메인 이름이 와야 하고, 마지막으로 점 뒤에는 최소 2자 이상의 영문자가 와야 한다.
👉 참고글
(3) 모델에 어노테이션 적용
모델 클래스의 필드에 만든 어노테이션을 사용하여 유효성 검증을 활성화한다.
data class ItemData (
@field:NotEmpty
@field:Size(min = 2, max = 6)
var item: String?=null,
@field:PositiveOrZero
var id: Int?=null,
@field:ValidEmail
val email: String?=null
)
@field:ValidEmail 어노테이션을 사용하여 유효성 검증을 활성화하였다.
실제 응답결과는 아래와 같다.
email 검증 로직 pass 인 경우 |
email 검증 로직 fail 인 경우 |
email 유효성 검사 fail인 경우 message = Invalid email format이 잘 출력되는 것을 확인 할 수 있었다.