쌓고 쌓다

typeMismatch 처리와 에러 코드 관리 - 26 본문

프로그래밍/spring

typeMismatch 처리와 에러 코드 관리 - 26

승민아 2023. 9. 1. 13:19

MessageCodesResolver 메시지 생성 규칙

MessageCodesResolver는 에러 코드를 가지고 에러 메시지 코드들을 생성해준다.

규칙은 아래와 같다.

ObjectError
1. code.object name
2. code

FieldError
1. code.object name.field
2. code.field
3. code.field type
4. code

 

rejectValue()와 reject()는 MessgeCodesResolver를 이용한다.

 

rejectValue, reject가

FieldError, ObjectError를 생성해주는데 FieldError, ObjectError는 에러 코드들을 여러개 가질 수 있다.

그래서 MessageCodesResolver를 통해 생성된 오류 코드들을 저장할 수 있다.

 

rejectValue(), reject() 적용

@PostMapping("/posters/{category}")
public String write(@PathVariable("category") Category category, @RequestParam(required = false) List<MultipartFile> files, @ModelAttribute Poster poster , BindingResult bindingResult) throws IOException {

    if(poster.getHeight()!=null && poster.getWeight()!=null) {
        Long height = poster.getHeight();
        Long weight = poster.getWeight();
        
        if(height+weight<150) {
            bindingResult.reject("heightWeightSumMin", new Object[]{150, height+weight}, null);
        }
    }

    ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "title", "require");
    ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult, "writer","require");

    if(!StringUtils.hasText(poster.getContent()))
        bindingResult.rejectValue("content", "require");

    if(poster.getHeight()==null||poster.getHeight()<100)
        bindingResult.rejectValue("height", "min", new Object[]{100}, null);

    if(poster.getWeight()==null||poster.getWeight()<40) {
        bindingResult.rejectValue("weight", "min", new Object[]{40}, null);
    }
 
    if(bindingResult.hasErrors()) {
        return "posters/createPosterForm";
    }
    
}

ObjectError 같은 경우 reject() 메서드를 사용하며 에러코드를 넘겨준다.

오브젝트 명은 안넘겨줘도 될까? 싶지만

BindingResult의 위치는 @ModelAttribute의 뒤에 위치하기 때문에 오브젝트명을 작성할 필요 없다.

 

최소값 검증의 에러 코드는 min

미입력 검증의 에러 코드는 require로 잡았다.

 

 

이제 에러 메시지를 작성해보자.

 

먼저 스프링 부트 메시지 설정 추가를 해주자.

application.properties

spring.messages.basename=errors
//spring.messages.basename=messages, errors

기본값은 messages이다.

 

errors.properties

#ObjectError
heightWeightSumMin.poster=작성자의 키, 몸무게 합은 {0}이상이여야합니다. 현재 {1}입니다.
heightWeightSumMin=키와 몸무게 합은 {0}이상이여야합니다.

# FieldError - errorCode=require, min #

#Level1 - errorCode.objectName.field
require.poster.title=게시글 제목을 입력해주세요.
require.poster.writer=게시글 작성자를 입력해주세요.
require.poster.content=게시글 내용을 입력해주세요.
min.poster.weight=작성자 무게는 {0} 이상이여야합니다..
min.poster.height=작성자 키는 {0} 이상이여야합니다.

#Level2 - errorCode.field
require.title=제목을 입력해주세요.

#Level3 - errorCode.fieldType
min.java.lang.Long={0}이상의 숫자를 입력해주세요.

#level4 - errorCode
require=필수 값입니다.
min=최소값 확인해주세요.

# typeMismatch
typeMismatch.java.lang.Long=정수를 입력하세요.
typeMismatch=형식을 확인해주세요.

# typeMismatch와 오류 코드 관리

MessageCodesResolver의 생성 규칙에 따라 에러 코드 메시지들을 작성해주자.

이렇게 작성해두면 에러 코드와 필드 등을 이용해

상세한 에러 코드 메시지부터 덜 구체적인 메시지로 순차적으로 일치하는 메시지를 찾아 출력한다.

 

typeMismatch 처리

<span th:errors="*{height}">

현재 정수 타입을 입력하는 폼에 문자열을 입력하면 에러 메시지가 그대로 출력이 된다.

아니?? 만들지도 않은 메시지가 출력이 된다?

그렇다 스프링이 직접 검증 오류를 추가하기도한다. 주로 타입 정보에 관해서이다.

 

타입이 맞지 않는 에러도 FieldError에 속하므로 아래의 규칙을 갖는다.

1. code.object name.field
2. code.field
3. code.field type
4. code

EX)
1. typeMismatch.user.age
2. typeMismatch.age
3. typeMismatch.int
4. typeMismatch

에러 코드는 typeMismatch를 갖는다.

 

그러므로 errors.properties에 아래의 메시지를 추가해줄 수 있다.

typeMismatch.java.lang.Long=정수를 입력하세요.
typeMismatch=형식을 확인해주세요.
Comments