코드 그라데이션
오류 코드와 메시지 처리 (1) 본문
오류 코드와 메시지 처리 (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