쌓고 쌓다

[스프링 부트] BindingResult 메시지 properties 관리 본문

프로그래밍/spring

[스프링 부트] BindingResult 메시지 properties 관리

승민아 2023. 8. 29. 13:57

굳이 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를 작성하기에 번거로움이 있는데

다음번에 더욱 효율적인 방법을 알아보자.

Comments