2024. 9. 19. 20:42ㆍSPRING
BindingResult
BindingResult는 스프링이 제공하는 검증 오류 보관 객체이다.
BindingResult는 Model 에 자동으로 포함된다. ( return 하지 않아도 된다. )
examController
@PostMapping("/item")
public String add(@ModelAttribute Item item, BindingResult bindingResult){
...
}
BindingResult 파라미터의 위치는 @ModelAttribute Item item 뒤에 와야만 한다.
form에서 전송된 데이터를 Item 객체에 바인딩하고, 그 결과를 BindingResult 에 담는다.
form 에서 전송한 데이터에서는 다양한 오류를 발생시킬 수 있다.
그 중, 필드 오류와 글로벌 오류를 간략하게 살펴보자.
필드 오류
if(!StringUtils.hasText(item.getItemName()){
bindingResult.addError(new FieldError("item", "itemName", "상품 이름 필수"));
}
상품명이 입력되지 않았을 때, 내용 검증 후 FieldError 객체를 bindingResult 에 넣어준다.
** BindingResult 의 addError() 의 파라미터 시그니처는 ( ObejctError objectError) 이며,
FieldError 는 ObejctError 의 하위 클래스로, 호환이 가능하다.
FieldError 생성자 파라미터는 (String objectName, String field, String defaultMessage) 이다.
objectName 은 데이터가 바인딩 되는 객체의 이름. 해당 예제에서는 @ModelAttribute Item item 이므로, item 되시겠다.
field 는 오류가 발생한 필드의 이름이다. itemName, price, quantity 등 바인딩 객체의 필드 이름이 적합하겠다.
요약1
BindingResult 에 error 를 담는다.
BindingResult 파라미터는 반드시 @ModelAttribute BidingObject bo 파라미터 뒤에 위치한다.
field 는 bindingObject의 필드값을 기준으로 작성된다.
BindingResult 가 없을 때, 타입 오류가 발생할 경우, 400 오류가 발생하고 오류 페이지로 이동된다.
ex)
프로그램이 정상 동작하지 않고, 오류 페이지로 이동
수량 필드에 'ㅁㄹㅇㄴㅁ1' 입력
Integer 필드에 '1,000 ,000 ,000 ,000 ,000 ,000 ,000 ,000 입력
반대로, BindingResult가 컨트롤러 메서드 시그니처에 있으면, 데이터 바인딩시 오류 발생해도 컨트롤러가 호출된다.
즉. 개발자가 원하는 값을 입력하도록 유도하는 오류코드 + BindingResult 를 사용하면 편하다.
BindingResult 에 검증 오류를 적용하는 방법
1. @ModelAttribute의 객체에 타입 오류 등으로 바인딩이 실패하는 겅유, 스프링이 FieldError를 생성해 BindingResult에 넣어준다.
2. 개발자가 직접 넣는다.
3. Validator 를 사용한다.
스프링이 FieldError 을 만들어주는 경우, html에 사용자가 입력한 값이 유지된다.
반면, 타입은 맞지만 검증 조건을 미충족한 값을 입력할 경우, 사용자가 입력한 값이 사라진다.
이유는 몹시 심플하다.
스프링이 처리해줄 때는 잘못된 값 입력 보관과 반환 작업도 해준다.
그러나, 개발자가 직접 처리할 경우, 잘못된 값을 보관, 반환하는 처리를 직접 해야 한다.
다행스럽게도, ObjectError 객체의 생성자를 통해 잘못된 값을 보관하는 것이 가능하다.
new ObjectError(
objectName "item",
field "quantity",
rejectedValue item.getPrice(),
bindingFailure false,
codes null ,
arguments null,
defaultMessage "수량 입력 필수. 최대 9999개까지 입력 가능합니다."
)
해당 필드를 통해 ObjectError에 보관되고
ObjectError 는 BindingResult에 넣어지고,
BindingResult 는 Model 에 담겨 프론트로 반환된다.
'SPRING' 카테고리의 다른 글
| 자동문서화 - Swagger (1) | 2024.10.26 |
|---|---|
| [검증]@Valid ? @Validated ? (1) | 2024.10.23 |
| 로그 (0) | 2024.08.27 |
| MVC 패턴 - FrontController? (0) | 2024.08.21 |
| Provider (0) | 2024.08.19 |