1. 스프링 검증 Validation 기능
1) Bean Validation (빈 검증기)
- 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것을 Bean Validation 이라고 한다.
- Bean Validation은 검증 애노테이션과 여러 인터페이스의 모음이며, 이를 구현한 기술중에 일반적으로 사용하는 구현체는 하이버네이트 Validator이다.
implementation("org.springframework.boot:spring-boot-starter-validation")
- Bean Validation을 사용하려면 의존관계를 추가해야 한다.
- 스프링 부트는 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합한다.
- 스프링 부트는 이를 자동으로 글로벌 Validator로 등록한다. 이 Validator는 검증 애노테이션을 보고 검증을 수행한다. 글로벌 Validator가 적용되면, 어떤 컨트롤러에서든 @Valid , @Validated 만 적용하면 된다.
- 실제로 검증 오류가 발생하면, FieldError , ObjectError 라는 객체를 생성해서 BindingResult 에 담아준다.
2) BindingResult
- BinidingResult는 스프링이 제공하는 검증 오류를 보관하는 객체이다.
- BindingResult 파라미터는 순서가 중요하다. 검증할 대상인 target 객체의 바로 다음에 와야한다. BindingResult 는 이미 본인이 검증해야 할 객체인 target 을 알고 있다.
- BinidingResult가 없으면 → 400 오류가 발생하면서 컨트롤러가 호출되지 않고 에러처리가 된다.
- BinidingResult가 있으면 → 오류 정보를 BindingResult에 담아서 컨트롤러를 호출한다.
- BindingResult가 가진 파라미터 목록은 다음과 같다.
- objectName : 오류가 발생한 객체 이름
- field : 오류 필드
- rejectedValue : 사용자가 입력한 값(거절된 값)
- bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값
- codes : 메시지 코드
- arguments : 메시지에서 사용하는 인자
- defaultMessage : 기본 오류 메시지
- BindingResult 파라미터 응답 예시
if (bindingResult.hasErrors()) {
return bindingResult.allErrors
}
[
{
"codes": [
"Length.loginRequestDto.password",
"Length.password",
"Length.java.lang.String",
"Length"
],
"arguments": [
{
"codes": [
"loginRequestDto.password",
"password"
],
"arguments": null,
"defaultMessage": "password",
"code": "password"
},
12,
4
],
"defaultMessage": "4자 이상 12자 이하여야 합니다.",
"objectName": "loginRequestDto",
"field": "password",
"rejectedValue": "",
"bindingFailure": false,
"code": "Length"
},
]
- 우선 allErrors를 반환해보면, 검증 에러가 발생했을 때 bindingResult가 가진 필드 정보를 그대로 JSON 형태로 받아볼 수가 있다.
3) Validation 프로젝트 예시 코드