Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

오류 코드와 메시지 처리 5 본문

인프런/[인프런] 스프링 MVC 2

오류 코드와 메시지 처리 5

Seung__ 2021. 9. 24. 22:36

1. 오류 코드 관리 전략


  • 핵심은 구체적인 것에서! 덜 구체적인 것으로!
    • MessageCodesResolver 는 required.item.itemName 처럼 구체적인 것을 먼저 만들어주고,
    • required 처럼 덜 구체적인 것을 가장 나중에 만든다.
    • 이렇게 하면 앞서 말한 것 처럼 메시지와 관련된 공통 전략을 편리하게 도입할 수 있다.
  • 복잡하게 사용하는 이유??
    • 모든 오류 코드에 대해서 메시지를 각각 다 정의하면 개발자 입장에서 관리하기 힘들다.
    • 크게 중요하지 않은 메시지는 범용성 있는 requried 같은 메시지로 끝내고, 
    • 정말 중요한 메시지는 꼭 필요할 때 구체적으로 적어서 사용하는 방식이 더 효과적

 

 

 

2. 메시지 추가


#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} 까지 허용합니다.

 

 

3. 동작 방식


  • itemName 의 경우 required 검증 오류 메시지가 발생하면 다음 코드 순서대로 메시지가 생성된다.
    1. required.item.itemName
    2. required.itemName
    3. required.java.lang.String
    4. required
  • 그리고 이렇게 생성된 메시지 코드를 기반으로 순서대로 MessageSource 에서 메시지에서 찾는다.
  • 구체적인 것에서 덜 구체적인 순서대로 찾는다. 
  • 메시지에 1번이 없으면 2번을 찾고, 2번이 없으면 3번을 찾는다.
  • 즉 rejectValue(), reject()내부에서 MessageCodesResolver가 돌아가는데,
    • 이 때 각 level 별 message Code를 생성하고, new FieldError()를 통해 해당 코드를 보관.
    • 생성된 Message code를 기반으로 Thymeleaf는 렌더링 시
    • MessageSource에서 우선순위에 따라 해당하는 메시지를 찾는다.

 

  • 크게  중요하지 않은 오류 메시지는 기존에 정의한 것을 재활용 가능 ㄱㅇㄷ

 

4. ValidationUtils

 


  • 사용 전
if (!StringUtils.hasText(item.getItemName())) {
bindingResult.rejectValue("itemName", "required", "기본: 상품 이름은 필수입니다.");
}
  • 사용 후
    • 제공하는 기능은 Empty , 공백 같은 단순한 기능만 제공
ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "itemName","required");

 

5. 정리


  • rejectValue() 호출
  • MessageCodesResolver 를 사용해서 검증 오류 코드로 메시지 코드들을 생성->규칙에 따라 생성.
  • new FieldError() 를 생성하면서 메시지 코드들을 보관, rejectValue()가 FieldError대신 생성함.
    • public FieldError(String objectName, String field, @Nullable Object rejectedValue, boolean bindingFailure,
      			@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {
                  ...
                  }
  • th:erros 에서 메시지 코드들로 메시지를 순서대로 메시지에서 찾고, 노출

 

6. GitHub : 210924 MessageCodesResolver


 

GitHub - bsh6463/Validation-V1

Contribute to bsh6463/Validation-V1 development by creating an account on GitHub.

github.com

 

Comments