상품 관리 시스템에 검증 로직을 추가해보자!
✔ 검증 로직 추가
- 타입 검증: 가격, 수량에 문자가 들어가면 검증 오류 처리
- 필드 검증
- 상품명: 필수. 공백❌
- 가격: 1000원 이상, 1백만원 이하
- 수량: 최대 9999개
- 특정 필드의 범위를 넘어서는 검증: 가격 * 수량의 합은 10,000원 이상
컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다.
검증(Validation
) 기능 구현에 집중하기 위해서 새로운 프로젝트를 만들었다!
🔗 코드 확인하기
사용자가 상품 등록 폼에서 정상 범위의 데이터를 입력하면,
서버에서는 검증 로직이 통과되어 상품을 저장하고, 상품 상세 화면으로 redirect한다.
서버 검증 로직이 실패해야 한다!
이렇게 검증에 실패한 경우, 고객에게 다시 상품 등록 폼을 보여주고, 어떤 값을 잘못 입력했는지 알려줘야 한다.
이제 요구사항에 맞춰서 검증 로직을 직접 개발해보자!
Map<String, String> errors = new HashMap<>();
검증시 오류가 발생하면, 어떤 검증에서 오류가 발생했는지 파악하기 위해 errors
에 저장해둔다.
if (!StringUtils.hasText(item.getItemName())) {
errors.put("itemName", "상품 이름은 필수입니다.");
}
어떤 필드에서 오류가 발생했는지 구분하기 위해 오류가 발생한 필드명을 key
로 사용한다.
이후 뷰에서 이 데이터를 사용해서 고객에게 친절한 오류 메시지를 출력할 수 있다.
if (item.getPrice() != null && item.getQuantity() != null) {
int resultPrice = item.getPrice() * item.getQuantity();
if (resultPrice < 10000) {
errors.put("globalError", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice);
}
}
특정 필드의 범위를 넘어서는 오류를 처리해야 할 수도 있다.
이때는 필드 이름을 넣을 수 없으므로 globalError
라는 key
를 사용한다.
if (!errors.isEmpty()) {
log.info("errors = {} ", errors);
model.addAttribute("errors", errors);
return "validation/v1/addForm";
}
검증 실패시 오류 메시지를 출력하기 위해 model
에 errors
를 담고, 입력 폼이 있는 뷰 템플릿으로 보낸다.
V1
의 문제점Item
의 price
, quantity
같은 숫자 필드는 Integer
타입!400
예외가 발생하면서 오류 페이지를 띄워준다.앞서 만든 기능을 유지하기 위해서 V1 파일을 그대로 가져와서 V2로 바꿔주자!
모든 페이지가 잘 출력되는 것을 확인!