본문 바로가기
프레임워크/스프링

[스프링] BindingResult

by Yikanghee 2022. 2. 21.
  • 웹에서 값을 입력 받을때 오류 메시지를 띄워주는 것은 사용자에게 편의를 제공하는 중요한 일이다
  • BindingResult
    • 스프링이 제공하는 검증 오류를 보관하는 객체
    • 검증 오류가 발생하면 여기에 보관하면 된다
    • BindingResult가 있으면 @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출된다
    • 원래는 400오류로 페이지를 띄우주지 않는다
    • BindingResult의 객체에 타입 오류 등으로 바인딩에 실패하는 경우 스프링이 지원하는 FiedError를 생성해서 BindingResult에 넣어준다
    public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult,
    RedirectAttributes redirectAttributes) {
    
    	 if (!StringUtils.hasText(item.getItemName())) {
    			bindingResult.addError(new FieldError("item", "itemName",
    			item.getItemName(), false, null, null, "상품 이름은 필수입니다."));
    }
    }
    
    • 위와 같이 FieldError에 값을 넣어줘서 BindingResult 에 넣어준다
    • BindingResult를 사용하기 위해서는 앞에 ModelAttribute가 와야 사용 가능
    • FieldError 생성자에서 제공하는 파라미터 목록
      • objectName : 오류가 발생한 객체 이름
      • field : 오류 필드
      • rejectedValue : 사용자가 입력한 값 (거절된 값)
      • bindingFailure : 타입 오류 같은 바인딩 실패인지,검증 실패인지 구분 값
      • codes : 메시지 코드
      • arguments : 메시지에서 사용하는 인자
      • defaultMessage : 기본 오류 메시지
    • 오류 메시지 파일을 인식할 수 있게 다음 설정을 추가
    • spring.messages.basename=messages,errors
    • resources파일에 errors.properties를 추가
    required.item.itemName=상품 이름은 필수입니다.
    range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
    max.item.quantity=수량은 최대 {0} 까지 허용합니다.
    totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}
    
    • 프로퍼티를 사용해서 값을 입력해줄 수 있음설정해준 range.item.price를 사용해서 값을 string[]에 값을 넣어줌
    • new FieldError("item", "price", item.getPrice(), false, new String[] {"range.item.price"}, new Object[]{1000, 1000000}

본 글은 김영한님의 스프링 MVC 2편을 보고 참고했습니다

댓글