오봉이와 함께하는 개발 블로그

스프링 MVC 2 - 오류 코드와 메시지 처리 part.2 본문

BE/Spring

스프링 MVC 2 - 오류 코드와 메시지 처리 part.2

오봉봉이 2022. 8. 23. 03:07
728x90

오류 코드와 메시지 처리 3

오류 코드를 만들 때 다음과 같이 자세히 만들 수 있다.

  • required.item.itemName : 상품 이름은 필수 입니다.
  • range.item.price : 상품의 가격 범위 오류 입니다.

또는 다음과 같이 단순하게 만들 수도 있다.

  • required : 필수 값 입니다.
  • range : 범위 오류 입니다.

단순하게 만들면 범용성이 좋아 여러 곳에서 사용할 수 있지만, 메시지를 세밀하게 작성하기 어렵다.
반대로 너무 자세하게 만들면 범용성이 떨어지는 문제가 있다.
가장 좋은 방법은 범용성으로 사용하다가, 세밀하게 작성해야 하는 경우 세밀한 내용이 적용되도록 메시지에 단계를 두는 방법이다.

예를 들어 required라고 오류 코드를 사용한다고 가정할 때 required라는 메시지만 있으면 이 메시지를 선택해서 사용하는 것이다.

그런데 오류 메시지에 required.item.itemName와 같이 객체와 필드명을 조합한 세밀한 메시지 코드가 있으면 이 메시지를 높은 우선순위로 사용하는 것이다.

#Level1
required.item.itemName: 상품 이름은 필수 입니다.
#Level2
required: 필수 값 입니다.

물론 세밀한 메시지가 있는지 우선 확인하고, 없으면 좀 더 범용적인 메시지를 선택하도록 추가 개발을 해야겠지만, 범용성 있게 잘 개발해두면 메시지의 추가만으로 편리하게 오류 메시지를 관리할 수 있다.

오류 코드와 메시지 처리 4

우선 테스트 코드로 MessageCodesResolver를 알아보자.

MessageCodesResolver

public class MessageCodesResolverTest {

    MessageCodesResolver codesResolver = new DefaultMessageCodesResolver();

    @Test
    void messagesCodesResolverObject() {
        String[] messageCodes = codesResolver.resolveMessageCodes("required", "item");

        Assertions.assertThat(messageCodes).containsExactly("required.item", "required");
    }

    @Test
    void messageCodesResolverField() {
        String[] messageCodes = codesResolver.resolveMessageCodes("required", "item", "itemName", String.class);
        Assertions.assertThat(messageCodes).containsExactly("required.item.itemName", "required.itemName", "required.java.lang.String", "required");
    }

}

DefaultMessageCodesResolver의 기본 메시지 생성 규칙

객체 오류

객체 오류의 경우 다음 순서로 2가지 생성
1 : code + "." + object name
2 : code

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

필드 오류

필드 오류의 경우 다음 순서로4가지 메시지 코드 생성

1 : code + "." + object name + "." + field
2 : code + "." + field
3 : code + "." + field type
4 : code

예) 오류 코드: typeMismatch, object name "user", field "age", field type: int

1 : "typeMismatch.user.age"
2 : "typeMismatch.age"
3 :  "typeMismatch.int"
4 : "typeMismatch"

동작 방식

  • rejectValue(), reject()는 내부에서 MessageCodesResolver를 사용한다.
    • MessageCodesResolver에서 메시지 코드들을 생성함.
  • FieldError, ObjectError의 생성자를 보면 오류 코드 하나가 아니라 여러 오류 코드를 가질 수 있다.
    • MessageCodesResolver를 통해서 생성된 순서대로 오류를 보관한다.

FieldError rejectValue("itemName", "required")

4가지 오류 코드를 자동으로 생성한다.

  • required.item.itemName
  • required.itemName
  • required.java.lang.String
  • required

ObjectError reject("totalPriceMin")

2가지 오류 코드를 자동으로 생성한다.

  • totalPriceMin.item
  • totalPriceMin

오류 메시지 출력

타임리프 화면을 렌더링 할 때 th:errors가 실행된다.
만약 이때 오류가 있다면 생성된 오류 메시지 코드를 순서대로 돌아가면서 메시지를 찾는다.
그리고 없으면 디폴트 메시지를 출력한다.

출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
728x90
Comments