Spring Boot/Spring mvc

Spring mvc Validation(검증) / bindingResult rejectedValue

테토 2023. 11. 6. 22:55
반응형

 

Spring mvc에서 검증을 하는 방법 중 하나로 bindingResult를 사용한다.

Controller가 실행될 때 메서드에 파라미터로 BindingResult를 생성하고 거기에 검증오류를 저장해서 View에 전달해준다. View는 이 정보를 전달받아 오류를 보여주는데에 활용한다 

 

if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
    bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, null, null, "가격은 1,000 ~ 1,000,000 까지 허용합니다."));
}

 

이 코드의 경우 item객체의 price가 null이거나, 1,000보다 작거나, 1,000,000보다 클 때 오류를 발생하게 한다. 

여기서 bindingResult.addError로 에러를 추가해주는데 여기서는 price라는 필드에 검증오류가 난 것이기 때문에 FeildError를 만들어서 넣어준다. 

FeildError 생성자 파라미터중 세번째 item.getPrice()가 rejectedValue의 자리이다. 이 rejectedValue값이 있어야 오류가 나도 입력폼의 값이 사라지지 않고 남아있게 된다.

 

View에 사용된 내용은 다음과 같다

 

<input type="text" id="price" th:field="*{price}"
       th:errorclass="field-error" class="form-control" placeholder="가격을 입력하세요">

 

 

여기서 th:field를 사용했기 때문에 value가 자동으로 item.price가 되는데 (이 폼의 th:object가 item이기 때문) 이 값이 아니라 rejectedValue에 있는 값이 보여지는 것이 이해가 안됐다.

 

이 이유는 타임리프가 정상 상황에는 모델 객체의 값을 사용하지만, 오류가 발생하면 FieldError 에서 보관한 값을 사용해서 값을 출력하기 때문이다.

 

만약 int자리에 String이 전달되는 등의 오류가 생겼다면 bindingResult가 컨트롤러를 호출하기 전에 자동으로 FieldError를 생성한 후 잘못입력된 값을 저장해놓고 컨트롤러를 호출한다. 이런 에러는 데이터를 바인딩할 때 발생했기 때문에 데이터바인딩 오류라고 한다.

 만약 int자리에 문자열 "potato"를 입력해서 오류가 났다고 해보자. 그럼 rejectedValue자리에 price가 아니라 "potato"라는 문자열이 들어가게 된다.

 

 

반응형