[springmvc2]2. 검증 - 검증 직접 처리

이건회·2022년 10월 10일
0

springbasic

목록 보기
13/14

컨트롤러의 역할

  • 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이므로, 검증 로직을 개발하는 것은 매우 중요하다.

상품 저장 검증 실패

  • 만약 POST 요청으로 상품을 저장하려 했으나 검증이 실패할 때는(잘못된 요청 들어옴), 즉 컨트롤러에서 검증 로직을 돌렸는데 실패한 것이다. 이 때는 사용자가 입력한 값을 유지한 상태로 상품 등록 폼을 다시 보여주어야 한다. 어떤 값이 잘못되었는지 고객이 알아야 하기 때문이다. 즉 컨트롤러가 모델에 검증이 실패한 기존 데이터를 담아 보여주어야 하는 것이다.

구현

  • 먼저 검증 실패시 모델에 오류 결과를 보관해야 함으로 결과를 담을 객체(erros)를 만든다.

  • 그리고 검증 로직을 만들어 유효성을 검증한다. 먼저 특정 필드에 대한 유효성 검증이다

  • StringUtils.hastext()를 사용하면 글자가 있는지를 확인 가능하다

  • 특정 필드가 아닌 복합 룰에 대한 유효성을 검증하는 로직을 만든다

  • 검증에 실패하면 다시 입력 폼으로 이동한다

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

    //검증 오류 결과를 보관
    Map<String, String> errors = new HashMap<>();

    //필드 검증 로직
    if (!StringUtils.hasText(item.getItemName())) {
      errors.put("itemName", "상품 이름은 필수입니다");
    }
    if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
      errors.put("price", "가격은 1000이상 1000000 사이여야 합니다");
    }
    if (item.getQuantity() == null || item.getQuantity() > 9999) {
      errors.put("quantity", "수량은 최대 9999개까지 허용합니다");
    }

    //특정 필드가 아닌 복합 룰 검증
    if (item.getPrice()!=null && item.getQuantity() != null){
      int resultPrice = item.getPrice() * item.getQuantity();
      if (resultPrice<10000){
        errors.put("globalError","주문가격 합은 10000원 이상이어야 합니다. 현재 값 :" + resultPrice+ " 원");
      }
    }
    
	//검증에 실패하면 다시 입력 폼으로
    if (!errors.isEmpty()){
      model.addAttribute("errors",errors);
      return "validation/v1/addForm";
    }
    
    //성공 로직
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    return "redirect:/validation/v1/items/{itemId}";
  }

현재 문제점

  • 타입 오류는 아직 검증이 안된다(int에 string이 들어오는 경우) -> 스프링에서 컨트롤러에 진입 전에 들어오므로 컨트롤러 호출도 전에 터져버린다.
  • 타입 오류가 발생해도 입력한 값이 화면에 남아야 한다. 그런데 만약 price에 문자를 입력한 값을 남겨야 하는데, price 필드는 int라 문자가 남아있지 못한다. 즉 바인딩되지 못하여 사라진다. 즉 고객이 뭘 잘못해서 오류가 난 건지를 모른다.
  • 고객이 입력한 값은 어딘가에 별도로 관리가 되어야 한다.
profile
하마드

0개의 댓글