[SpringBoot] @Valid로 객체 검증
Why?
웹 개발 시 입력값이 제대로 들어왔는지 확인을 하기 위해서 보통 웹 브라우저에서는 스크립트를 통해 유효성 체크를 하고, 웹 서버에서는 요청 파라미터를 검사한다. Spring에서는 서버 측의 요청 파라미터를 검사할 수 있는 기능을 제공하는데 validation, validator 인터페이스를 통해 검증이 가능하다.
현재 진행중인 프로젝트는 SpringBoot로 진행하고 있어 어노테이션을 이용해 validation하는 방법을 적어보려고 한다.
@Valid
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
테스트 API작성
- 파라미터로 @RequestBody 어노테이션 옆에 @Valid를 작성하면, RequestBody로 들어오는 객체에 대한 검증을 수행한다. 이 검증의 세부적인 사항은 객체 안에 정의를 해두어야 한다.
@RestController
public class TestApiController {
private final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@PostMapping("/check-email")
public ResponseEntity<EmailCheckResponseDto> checkEmail(
@RequestBody @Valid EmailCheckRequestDto request
) {
logger.info(request.getEmail());
return ResponseEntity.ok(new EmailCheckResponseDto(true, "이메일이 맞습니다."));
}
}
- EmailCheckRequestDto 객체를 정의해 준다.
@Getter
@Setter
public class EmailCheckRequestDto {
@Email(message = "올바른 이메일 형식을 입력해주세요")
@NotBlank(message = "값이 빈 상태로 들어왔습니다.")
private String email;
}
- @NotBlank :
null
과""
과" "
모두 허용하지 않는다. - @Email : 인자로 들어온 값을 Email 형식을 갖추어야 한다.
검증 확인
- email 요청이 제대로 들어갈 때
- email 요청이 제대로 들어가지 않았을 때
Exception Handling
BadRequest의 경우, custom 한 errorhandling도 할 수 있다.
잘못된 객체 값이 나갔을 때 Log를 읽어보면, MethodArgumentNotValidException이 발생했음을 알 수 있다. 이 Exception을 사용하여 custom한 ErrorMessage를 response로 내보낼 수도 있다.
handler 작성
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResponseEntity<MethodNotValidResponse> handleArgNotValid(MethodArgumentNotValidException e) {
FieldError fieldError = e.getBindingResult().getFieldError();
String fieldName = fieldError.getField();
String message = fieldError.getDefaultMessage();
MethodNotValidResponse body = new MethodNotValidResponse(fieldName, "400", message);
logger.warn("Input Not valid Arg {}", body);
return ResponseEntity.badRequest().body(body);
}
- error가 난 fieldName을 내려줄 수 있도록 했다.
확인
- 위 핸들러를 추가하여 아까와 동일하게 email에 빈 값을 요청해보자.
- Response값을 살펴보면, @Valid를 통과하지 못한 모든 필드 이름을 내려주는것을 볼 수 있다. 에러 내용을 커스텀하게 내려준 것이 잘 반영되었음을 알 수 있다.
정리
위 작성한 내용은 이메일만 확인해보았지만, @Valid검증에는 더 많은 내용들이 포함되어있다. 아래 문서와 책을 참조해서 필요한 부분에 사용하면 좋을 듯하다.