티스토리 뷰

        //필드 검증
        if(StringUtils.isEmpty(item.getItemName())){
            bindingResult.addError(new FieldError("item","itemName", item.getItemName(), false , null, null, "상품명을 입력해주세요."));
            //3번의 field값을 넣으면 오류가 발생했을 때에 오류값을 html에서 표시해 줄 수 있게 모델에 넣어준다. 필드의 타입이 Integer인데 문자열이 들어가도 넣어준다. 그 이유는 item에 넣기 이전에 아닌 리퀘스트에서 넣어준다고 생각하면 된다.
            //bindingResult.addError(new FieldError("item","itemName","상품명을 입력해주세요."));
        }
        if(item.getPrice() == null || item.getPrice() <1000 || item.getPrice() >= 1000000){
            bindingResult.addError(new FieldError("item","price",item.getPrice(), false, null,null,"상품 금액은 1000원 ~  1,000,000원 까지만 입력이 가능합니다."));
        }
        if(item.getQuantity() == null || item.getQuantity() > 9999){
            bindingResult.addError(new FieldError("item","quantity",item.getQuantity(),false,null,null,"수량은 최대 9999개 까지 가능합니다."));
        }

        if(item.getPrice() !=null && item.getQuantity() != null  ) {
            int result = item.getPrice() * item.getQuantity();
            if(result <10000)
                bindingResult.addError(new ObjectError("item",null,null,"가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + result));
        }

1편에서는 오류가 날 경우 값을 유지해 주지않았다. 그 이유는 오류가 날 경우 th:field에서 값이 오류처리 된 값을 처리하는데, bindingResult에 그 값을 담지 않았기 때문이다.

 

주석 남긴 부분을 보면 3번째 매개변수에 값을 담아준다. 그래서 프론트에도 표시가 된다.

 

objectName : 오류가 발생한 객체 이름
field : 오류 필드
rejectedValue : 사용자가 입력한 값(거절된 값)
bindingFailure : 타입 오류 같은 바인딩 실패인지, 검증 실패인지 구분 값 codes : 메시지 코드
arguments : 메시지에서 사용하는 인자
defaultMessage : 기본 오류 메시지

 

bindingFailure 는 타입 오류 같은 바인딩이 실패했는지 여부를 적어주면 된다. 여기서는 바인딩이 실패한 것은 아니기 때문에 false 를 사용한다.

이 부분에서 3번째 값은 값자체가 없는 것도 아니고, item에 담기지 않는 것도 아니다. (vo에 필드가 있기 때문) 그렇기에 false가 된다.

 

타임리프의 사용자 입력 값 유지

th:field="*{price}"
타임리프의 th:field 는 매우 똑똑하게 동작하는데, 정상 상황에는 모델 객체의 값을 사용하지만, 오류가

발생하면 FieldError 에서 보관한 값을 사용해서 값을 출력한다.

스프링의 바인딩 오류 처리

타입 오류로 바인딩에 실패하면 스프링은 FieldError 를 생성하면서 사용자가 입력한 값을 넣어둔다. 그리고 해당 오류를 BindingResult 에 담아서 컨트롤러를 호출한다. 따라서 타입 오류 같은 바인딩 실패시에도 사용자의 오류 메시지를 정상 출력할 수 있다.

'dev_공부일지 > spring boot + intelliJ' 카테고리의 다른 글

MessageCodesResolver  (0) 2023.05.15
BindingResult rejectValue(), reject() thymleaf  (0) 2023.05.13
Spring LocalResolver  (0) 2023.05.08
Spring MessageSource 설정  (0) 2023.05.08
thymleaf 연산  (0) 2023.05.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함