코드 그라데이션

오류 코드와 메시지 처리 (1) 본문

Spring/Validation

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

완벽한 장면 2024. 2. 24. 12:02

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

목표

오류 메시지를 체계적으로 다루어보기.

 

FieldError 생성자

FieldError 는 두 가지 생성자를 제공한다.

 

FieldError , ObjectError 의 생성자는 codes , arguments 를 제공한다. 
이것은 오류 발생시 오류 코드로 메시지를 찾기 위해 사용된다.

 

errors 메시지 파일 생성

messages.properties 를 사용해도 되지만, 오류 메시지를 구분하기 쉽게 errors.properties 라는 별도의 파일로 관리해보자.

* 먼저 스프링 부트가 해당 메시지 파일을 인식할 수 있게 다음 설정을 추가한다.

  이렇게 하면  messages.properties , errors.properties 두 파일을 모두 인식한다. 

  (생략하면 messages.properties 를 기본으로 인식한다.)

 

스프링 부트 메시지 설정 추가

application.properties

spring.messages.basename=messages,errors

 

errors.properties 추가

src/main/resources/errors.properties

required.item.itemName=상품 이름은 필수입니다.
range.item.price=가격은 {0} ~ {1} 까지 허용합니다.
max.item.quantity=수량은 최대 {0} 까지 허용합니다.
totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}
참고: errors_en.properties 파일을 생성하면 오류 메시지도 국제화 처리를 할 수 있다.

이제 errors 에 등록한 메시지를 사용하도록 코드를 변경

 


ValidationItemControllerV2 - addItemV3() 추가

@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item,
                        BindingResult bindingResult,
                        RedirectAttributes redirectAttributes) {

    if (!StringUtils.hasText(item.getItemName())) {
        bindingResult.addError(new FieldError("item", "itemName",
                item.getItemName(), false, new String[]{"required.item.itemName"}, null,
                null));
    }

    if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
        bindingResult.addError(new FieldError("item", "price", item.getPrice(),
                false, new String[]{"range.item.price"}, new Object[]{1000, 1000000},
                null));
    }

    if (item.getQuantity() == null || item.getQuantity() > 10000) {
        bindingResult.addError(new FieldError("item", "quantity",
                item.getQuantity(), false, new String[]{"max.item.quantity"},
                new Object[]{9999}, null));
    }

    //특정 필드 예외가 아닌 전체 예외
    if (item.getPrice() != null && item.getQuantity() != null) {
        int resultPrice = item.getPrice() * item.getQuantity();
        if (resultPrice < 10000) {
            bindingResult.addError(new ObjectError("item", new String[]
                    {"totalPriceMin"}, new Object[]{10000, resultPrice}, null));
        }
    }
    if (bindingResult.hasErrors()) {
        log.info("errors={}", bindingResult);
        return "validation/v2/addForm";
    }

  • codes : required.item.itemName 를 사용해서 메시지 코드를 지정한다. 메시지 코드는 하나가 아니라                                        배열로 여러 값을 전달할 수 있는데, 순서대로 매칭해서 처음 매칭되는 메시지가 사용된다.
  • arguments : Object[]{1000, 1000000} 를 사용해서 코드의 {0} , {1} 로 치환할 값을 전달한다.

실행해보면

문제없이 잘 되고

 

만약에 배열이니까 값이 하나 없는 상황을 연출해보면

errors.properties에 이 값 추가

required.default = 기본 오류 메시지
#required.item.itemName=상품 이름은 필수입니다. (주석처리)

그리고 나서

이렇게 바꿔서 실행한 다음에 똑같이 저장을 누르면

메시지가 바뀌어서 출력

 

마지막으로 만약에 

두 메시지 다 없다 쳤을 때

(errors.properties 에 두 개 다 주석처리 후 실행)

500 에러가 나온다.

 

다시 처음 상황으로 원상복구!

728x90

'Spring > Validation' 카테고리의 다른 글

오류 코드와 메시지 처리 (3)  (0) 2024.02.25
오류 코드와 메시지 처리 (2)  (1) 2024.02.25
FieldError와 ObjectError  (0) 2024.02.23
BindingResult 두 번째  (0) 2024.02.22
BindingResult 첫 번째  (0) 2024.02.22
Comments