BindingResult
스프링 검증하면 뺴놓을 수 없는 것이 BindingResult입니다.
BindingResult는 스프링이 제공하는 검증 오류를 보관하는 객체입니다. 또한 Erros 인터페이스를 상속합니다.
BindingResult를 쓸 떄 주의점은 검증 대상인 @ModelAttribute 바로 뒤에 작성해야 하는 것입니다.
@PostMapping("/add")
public String addItemV6(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
if (bindingResult.hasErrors()) {
log.info("errors = {} ", bindingResult);
return "validation/v2/addForm";
}
}
다음과 같이 작성하면 사용자 입력 값에 따라 item 객체에 데이터를 넣어줍니다. 만약 BindingResult를 쓰지 않고
에러를 담는 객체를 map형식으로 생성하여 사용하게 된다면, type mismatch 오류가 생길 시 스프링이 예외 페이지를
보여주게 됩니다. 다시 말해 BindingResult를 type mismatch 에러도 자체적으로 처리해줍니다.
public class Item {
private String name;
private Integer price;
}
예를 들어 BindingResult 객체가 없는 상황에서
클라이언트가 데이터 요청을 밑에와 같이 String자리에 Integer을 Integer자리에 String을 요청한다면
{
"name" : 1234,
"price" : "1234"
}
@ModelAttribute 만으로 해당 에러를 처리하지 못하여 예외를 발생하게 됩니다. 이렇게 되면 정상적으로
"가격은 숫자만 입력해주세요" 와 같은 에러 메세지를 클라이언트에게 출력하지 못하게 됩니다.
BindingResult는 이런 TypeMismatch와 관련된 문제들을 처리해줍니다.
BindingResut에는 다음과 같은 메서드들이 존재합니다.
- boolean hasErrors() : 에러의 유무를 파악합니다.
- boolean hasGlobalErrors() : 필드 에러가 아닌 글로벌 에러의 유무를 파악합니다.
- void addError(ObjectError error) : ObjectError의 객체를 파라미터로 하여 에러 정보를 담습니다.
파라미터로 new FieldError를 해도 상관이 없습니다. FieldError는 ObjectError를 상속했기 때문입니다.
정리하자면 BindingResult는 컨트롤러 단에서 데이터 타입과 검증과 관련된 로직들을
서비스 레이어 까지 내려가지 않고 검증 내용을 view에 보내주는 역할을 수행합니다.
이를 활용하여 검증 로직을 수월하게 구현할 수 있습니다.
'Spring' 카테고리의 다른 글
스프링 시큐리티 아키텍처에 대하여 (0) | 2023.01.29 |
---|---|
@Transaction에 대하여 (0) | 2023.01.06 |
스프링 빈 스코프란? (0) | 2022.12.23 |
Reflection 이란? (0) | 2022.12.16 |
스프링부트에서의 API예외 처리 방법 (1) | 2022.12.02 |