Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jpa
- Android
- 김영한
- java
- Proxy
- SpringBoot
- JDBC
- Spring Boot
- 알고리즘
- db
- 스프링
- 백준
- Greedy
- AOP
- spring
- Exception
- Thymeleaf
- springdatajpa
- 그리디
- 자바
- JPQL
- QueryDSL
- http
- 스프링 핵심 기능
- transaction
- Servlet
- 스프링 핵심 원리
- pointcut
- 인프런
- kotlin
Archives
- Today
- Total
개발자되기 프로젝트
오류 코드와 메시지 처리 5 본문
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
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
Validator 분리 1 (0) | 2021.09.24 |
---|---|
오류코드와 메시지 처리6 (0) | 2021.09.24 |
오류코드와 메시지 처리4, MessageCodesResolver (0) | 2021.09.24 |
오류 코드와 메시지 처리3 (0) | 2021.09.24 |
오류 코드와 메시지 처리 2 (0) | 2021.09.24 |
Comments