오류코드와 메시지처리(2)

JIWOO YUN·2024년 2월 7일
0

SpringMVC2

목록 보기
12/26
post-custom-banner

오류코드를 만들 때

  • required.item.itemName : 상품이름은 필수입니다.

와 같이 자세히 만들수도 있으며,

  • required: 필수값 입니다.

라고 만들 수 있다.

단순하게 만들경우 범용성이 좋아 여러곳에서 사용이 가능하지만 메시지를 세밀하기 작성하기 어려움.

너무 자세하게 만들경우 범용성이 떨어짐.

  • 그렇기 때문에 가장 좋은 방법
    • 범용성으로 사용하다가 세밀하게 작성해야할 때 세밀한 내용이 적용되도록 단계를 두는게 베스트

이게 가능하도록하는 방법은 메시지의 우선순위를 두는 것이다.

  1. 객체명과 필드명을 조합한 메시지가 있는지 먼저 확인 있을 경우 사용
  2. 없는 경우 범용적으로 작성해둔 메시지를 선택

위의 방법이 가능한 이유는 스프링이 MessageCodesResolver라는 것으로 이러한 기능을 지원함.

MessageCodesResolver

  • 검증 오류 코드로 메시지 코드들을 생성한다.
  • MessageCodesResolver 인터페이스이며 DefaultMessageResolver가 기본 구현체
  • 주로 FieldError와 ObjectError와 함께 사용된다.
  • 기본적으로 디테일한 순서로 들어가 있다.

기본 메시지 생성 규칙

객체 오류의 경우

다음 순서로 2가지 생성
1 : code + "." + object name
2 : code

예시) 오류코드 : required , object name : item
1 : required.item
2 : item

필드 오류 의 경우

다음 순서로 4가지 코드 생성
1 : code + "." + object name + "." + field
2 : code + "." + field
3 : code + "." + field type
4 : code

예시) 오류코드 : typeMisMatch, obejct name : "user" , field "age" , field type: int
1. "typeMisMatch.user.age"
2. "typeMisMatch.age"
3. "typeMisMatch.int"
4. "typeMisMatch"

동작방식

  1. rejectValue(), reject()는 내부에서 MessageCodesResolver를 사용 -> 여기서 메시지를 생성
  2. FieldError,ObjectError 의 생성자를 보면 여러 오류코드를 가질 수 있음.
    • MessageCodesResolver를 통해서 생성된 순서대로 오류 코드를 보관.
    • BindingResult에 쌓인 코드들을 보고 알 수있다.

오류 메시지 출력

  • 타임리프 화면 렌더링 할때 th:errors가 실행됨 -> 오류가 있다면 생성된 오류 메시지 코드를 순서대로 돌아가면서 메시지를 찾음
    • 없으면 디폴트 메시지 출력

오류 코드 관리 전략

  • 핵심은 구체적인 것에서 덜 구체적인 것으로 만들어둔다.
    • MessageCodesResolver는 구체적인 것을 먼저 만든다음 덜 구체적인 것을 나중에 만들기 때문에 이와 같은 순서로 만들게 되면 편리하게 도입이 가능해진다.

복잡하게 사용하는 이유

  • 모든 오류 코드에 대해서 메시지를 각각 다 정의하게 되면 개발자 입장에서 관리하기 힘들기 때문에
    • 크게 중요하지않은 메시지는 범용성있는 required 같은 메시지로 끝내고, 중요한 메시지는 꼭 필요할 때 구체적으로 적어서 사용하는 방식이 효과적이다.

전략에 따라서 properties를 수정하자.

#required.item.itemName=상품 이름은 필수입니다.
#range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
#max.item.quantity=수량은 최대 {0} 까지 허용합니다.
#totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}
#==ObjectError==
#Level1
totalPriceMin.item=상품의 가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}

#Level2 - 생략
totalPriceMin=전체 가격은 {0}원 이상이어야 합니다. 현재 값 = {1}

#==FieldError==
#Level1
required.item.itemName=상품 이름은 필수입니다.
range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
max.item.quantity=수량은 최대 {0} 까지 허용합니다.
#Level2 - 생략
#Level3
required.java.lang.String = 필수 문자입니다.
required.java.lang.Integer = 필수 숫자입니다.
min.java.lang.String = {0} 이상의 문자를 입력해주세요.
min.java.lang.Integer = {0} 이상의 숫자를 입력해주세요.
range.java.lang.String = {0} ~ {1} 까지의 문자를 입력해주세요.
range.java.lang.Integer = {0} ~ {1} 까지의 숫자를 입력해주세요.
max.java.lang.String = {0} 까지의 문자를 허용합니다.
max.java.lang.Integer = {0} 까지의 숫자를 허용합니다.

#Level4
required = 필수 값 입니다.
min= {0} 이상이어야 합니다.
range= {0} ~ {1} 범위를 허용합니다.
max= {0} 까지 허용합니다.
  • 구체적인 부분에서 덜 구체적인 순서로 찾기 -> 크게 중요하지 않은 오류 메시지의 경우 기존에 정의된 것을 그냥 재활용

ValidationUtils

  • org.springframework.validation.Validator
  • 제공하는 기능은 Empty, 공백 같은 단순한 기능만 제공
ValidationUtils.rejectIfEmpty(Errors e,String field,String errorCode);

ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult,"itemName","required");
  • 아예 없거나 공백인 경우
    • bindingResult에 field는 itemName이고 errorCode는 required를 넣어줌.
profile
열심히하자
post-custom-banner

0개의 댓글