티스토리 뷰
//필드 검증
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
- 스프링공부
- exception
- 인터셉터
- ArgumentResolver
- react실행
- reject
- 향해99
- React
- jpa api
- 항해99
- 컨트
- filter
- Java
- JPA
- 예외처리
- 향해플러스
- 백엔드 개발자 공부
- 백엔드 개발자 역량
- rejectValue
- 항해플러스
- 리터럴
- HTTP
- hypertexttransferprotocol
- 스프링부트
- BindingResult
- 향해플러스백엔드
- 로그인
- thymleaf
- SpringBoot
- Intercepter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |