쌓고 쌓다
[스프링 부트] BindingResult 메시지 properties 관리 본문
굳이 BindingResult의 에러 메시지를 매번 입력하지 않고 properties로 관리하는 이유가 있다.
예를 들어. 어떤 곳에서는 "설명을 입력해주세요.", 또 어떤 곳에서는 "설명을 입력하세요", "설명은 필수입니다." 와 같이
일관성 없는 메시지를 통일하여 관리할 수 있다는 장점이 있다.
application.properties
spring.messages.basename=messages, errors
기본은 spring.messages.basename=messages이나 errors를 추가.
messages는 메시지, 국제화에 사용하는 properties이었다. 여기에 에러 메시지를 위한 properties 추가.
error.properties
required.item.itemName=상품 이름은 필수입니다.
range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
max.item.quantity=수량은 최대 {0} 까지 허용합니다.
totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}
BindingResult 사용
public String addItem(@ModelAttribute Item item, BindingResult bindingResult) {
if(item.getPrice()==null||item.getPrice()<1000||item.getPrice()>10000) {
bindingResult.addError(new FieldError("item", "price", item.getPrice(), false, new String[]{"range.item.price"}, new Object[]{1000, 10000}, "기본 메시지"));
}
if(item.getPrice()!=null&&item.getQuantity()!=null) {
int resultPrice = item.getPrice()*item.getQuantity();
if(resultPrice<10000) {
bindingResult.addError(new ObjectError("item", new String[]{"totalPriceMin"}, new Object[]{10000, resultPrice}, "기본 메시지"));
}
}
FieldError 생성자
- objectName: @ModelAttribute 이름, 오류가 발생한 객체 이름
- field: 오류 필드
- rejectedValue: 사용자가 입력한 값(에러 발생한 값)
- bindingFailure: 바인딩 에러 유무. 여기선 타입 에러 같은 바인딩 에러가 아니라 검증에 실패이므로 false 사용.
- String[] codes: error.properties에 작성한 Key 작성
- String[] 배열인 이유는 code를 찾지 못하면 다음 code로 넘어간다.
- Object[] arguments: {0}, {1}, ... error.properties의 Value에 파라미터 전달할 값
- defaultMessage: String[] codes에 일치하거나 올바른 Key를 찾지 못했을때의 기본 메시지 설정
ObjectError 생성자
매번 new ObjectError, FieldError를 작성하기에 번거로움이 있는데
다음번에 더욱 효율적인 방법을 알아보자.
'프로그래밍 > spring' 카테고리의 다른 글
BindingResult rejectValue(), reject() (0) | 2023.08.30 |
---|---|
MessageCodesResolver (0) | 2023.08.30 |
[스프링 부트] BindingResult 사용 - 25 (0) | 2023.08.29 |
유효성 검사 직접 처리 및 폼 데이터 유지 방법 (0) | 2023.08.27 |
[스프링 부트] 게시글 상단 고정(공지사항) - 24 (0) | 2023.08.22 |
Comments