검증과 API 응답
개요
이전 게시글에서 뷰 템플릿을 통해 검증 정보를 넘겨주는 방법에 대해 설명했다. 이번에는 API 응답을 통해 검증 정보를 사용자에게 제공하는 방법을 알아보자.
API 응답에서의 검증
API의 경우 아래 3가지 경우를 나누어 생각해야 한다.
- 성공 요청: 성공
- 실패 요청: JSON을 객체로 생성하는 것 자체가 실패하는 경우 (예. TypeMismatch)
- 검증 오류 요청: JSON을 객체로 생성하는 것은 성공했지만, 검증에서 실패하는 경우
예시 코드: 컨트롤러
import ...
@RestController
public class ApiController {
@PostMapping("/api")
public Object returnToJson(@RequestBody @Validated ProductAddForm form,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return bindingResult.getAllErrors();
}
return form;
}
}
Postman 프로그램을 통해서, 요청을 해보자.
ProductAddForm
객체는 이전 게시글을 참고하자.
성공
요청
응답
실패
요청
응답
설명
HttpMessageConverter
에서 요청 JSON을ProductAddForm
객체로 생성하는데 실패한다.- 이 경우,
ProductAddForm
객체를 만들지 못하기 때문에 컨트롤러 자체가 호출되지 않고 그전에 예외가 발생한다. - Validator 도 실행되지 않는다.
검증 실패
요청
응답
설명
ProductAddForm
의private Integer productPrice
필드에 대해@Min(1000)
검증에 걸린다.
@ModelAttribute
vs @RequestBody
@ModelAttribute
- 각각의 필드 단위로 세밀하게 적용된다.
- 특정 필드에 타입이 맞지 않는 오류가 발생해도 나머지 필드는 정상 처리할 수 있다. 따라서 나머지 필드에 대해 Validator 검증도 적용할 수 있다.
- 스프링이
TypeMismatch FieldError
를 생성하여BindingResult
에 추가하여 처리한다.
- 스프링이
@RequestBody
HttpMessageConverter
단계에서 JSON 데이터를 객체로 변경하지 못하면, 이후 단계 자체가 진행되지 않고 예외가 발생한다.- 컨트롤러도 호출되지 않고, Validator도 적용할 수 없다.
- 본 게시글은 김영한님의 강의를 토대로 정리한 글입니다.
- 더 자세한 내용을 알고 싶으신 분들이 계신다면, 해당 강의를 수강하시는 것을 추천드립니다.