[TIL] #4. 검증1 - Validation ①

kiteB·2021년 9월 24일
0

TIL-Spring4

목록 보기
6/17
post-thumbnail

검증 요구사항

상품 관리 시스템에 검증 로직을 추가해보자!

✔ 검증 로직 추가

  • 타입 검증: 가격, 수량에 문자가 들어가면 검증 오류 처리
  • 필드 검증
    • 상품명: 필수. 공백❌
    • 가격: 1000원 이상, 1백만원 이하
    • 수량: 최대 9999개
  • 특정 필드의 범위를 넘어서는 검증: 가격 * 수량의 합은 10,000원 이상

컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다.


프로젝트 설정 V1

검증(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";
}

검증 실패시 오류 메시지를 출력하기 위해 modelerrors를 담고, 입력 폼이 있는 뷰 템플릿으로 보낸다.


실행 결과

✔ 상품명 ❌


✔ 모든 에러 발생


✔ 코드 확인

🔗 전체 코드 확인하기


V1의 문제점

  • 뷰 템플릿에서 중복되는 처리가 많다.
  • 타입 오류 처리가 안된다.
    • Itemprice, quantity 같은 숫자 필드는 Integer 타입!
      → 문자가 들어오면 오류가 발생한다!
    • 이러한 오류는 스프링 MVC에서 컨트롤러에 진입하기도 전에 예외가 발생
      컨트롤러가 호출되지도 않고, 400 예외가 발생하면서 오류 페이지를 띄워준다.
    • 고객은 본인이 어떤 내용을 입력해서 오류가 발생했는지 이해하기 어렵다.
      → 결국 고객이 입력한 값도 어딘가에 별도로 관리가 되어야 한다.

프로젝트 준비 V2

앞서 만든 기능을 유지하기 위해서 V1 파일을 그대로 가져와서 V2로 바꿔주자!

🔗 전체 코드 확인하기

실행결과

모든 페이지가 잘 출력되는 것을 확인!

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글