잘못 입력된 값을 클라이언트에게 알려주면서, 서버에서 발생할 수 있는 에러를 사전에 막을 수 있다. 처음 개발을 할 때에는 서비스 레이어에 하나하나 Null 체크, 사이즈 검사, 범위 검사를 추가하다 보니 하나의 함수에 영양가(?)가 없는 코드들이 많이 들어가 있어서, 작성한 개발자뿐만 아니라 협업하고 있는 다른 팀원들까지 보기 힘든 코드가 되어버릴 때가 있다.
Spring Framework를 사용하면서 Validator가 있는것을 알고 난 뒤에는 최대한 적용하려고 노력하고 있다. 사용하기도 편하고, 보기도 편하고, 재사용도 편한 Validator를 한번 정리해 본다
Bean Validation Dependency
자바 진영에서 많이 사용하고 있는 이 Valdation은 아래와 같이 간단하게 의존성을 추가할 수 있다(그레이들 기준)
// Starter for using Java Bean Validation with Hibernate Validator
implementation("org.springframework.boot:spring-boot-starter-validation")
예를 들어 Member에 대한 요청을 받는다고 했을 때, 다음 모델에 대해 어떻게 체크할까?
data class Member(
// 빈문자열을 허용하지 않는다
val name : String,
// 이메일 형식을 맞춰야하며, 빈 문자열을 허용하지 않는다
val email : String,
// 18~36의 범위안에 들어야한다
val age : Int,
// 5를 넘지 말아야한다
val count : Int
)
이렇게 유효성 체크를 하다보면 프로퍼티가 적은건이야 그나마 괜찮을지 몰라도, 여러개의 유효성 검사가 들어간다던지 하다보면 계속 늘어나게 될것이다. Bean Validation을 사용하여 모델을 다음과 같이 변경한다면 위의 코드의 기능이 그대로 들어간다
data class Member(
@field:NotBlank(message = "이름을 입력하세요")
val name : String,
@field:NotBlank(message = "이메일을 확인하세요")
@field:Email(message = "이메일을 확인하세요")
val email : String,
@field:Range(min = 18, max = 36, message = "나이를 확인하세요")
val age : Int,
@field:Max(value = 5, message="5를 넘을 수 없습니다")
val count : Int
)
코틀린을 사용한다면 @field:를 꼭 사용해주어야한다. 그리고 Controller에 다음과 같이 @Valid 어노테이션을 하나 추가해준다.
@PostMapping
fun createMember(@Valid @RequestBody member: Member)
이렇게 되면 컨트롤러에 해당 모델로 요청올 경우 Validation 체크를 하게 되어 다음과 같이 org.springframework.web.bind.MethodArgumentNotValidException을 던지게 된다.