검증 1

JIWOO YUN·2024년 2월 2일
0

SpringMVC2

목록 보기
9/26
post-custom-banner

검증

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

클라이언트 검증, 서버 검증

  • 클라이언트 검증은 조작이 가능하기 때문에 보안에 취약
  • 서버만으로 검증시 즉각적인 고객 사용성이 부족
  • 둘을 적절히 섞어서 사용하고, 최종적으로 서버 검증 필수
  • API 방식 사용시 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨줘야한다.

상품을 등록할 때 상품의 이름을 등록하지 않거나, 수량, 가격 등이 너무 작거나 검증범위를 벗어나게 되면 서버 검증 로직에서 실패해야한다.

  • 고객에게 다시 상품 등록폼을 보여주면서 어떤 값을 잘못 입력했는지 알려줘야함.

검증 로직을 추가

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

        Map<String,String> errors = new HashMap<>();

        //상품명은 필수
        if(!StringUtils.hasText(item.getItemName())){
            errors.put("itemName","상품 이름은 필수 입니다.");
        }

        //가격은 1000원이상 1백만원 이하
        if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
            errors.put("price","가격은 1000 ~ 1000000 까지 허용합니다.");
        }

        //수량은 최대 9999
        if(item.getQuantity() == null || item.getQuantity() > 9999){
            errors.put("quantity","수량은 최대 9999까지 가능합니다.");
        }

        //가격 * 수량의 합은 10000원을 넘어야한다.
        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";
        }


        itemRepository.save(item);
        redirectAttributes.addAttribute("itemId",item.getId());
        redirectAttributes.addAttribute("status",true);

        return "redirect:/validation/v1/items/{itemId}";
    }

StringUtils

isEmpty()
- 문자열이 null인지 확인

hasLength()
- 문자열이 null인지 "" 인지 확인
- hasLength()의 경우 " " 와 같은 공백 문자열에 관해서 True를 반환함.
- 공식문서에서는 hasLength()를 사용하는 걸 권장함.

hasText()
- 문자열이 text 형태인지 확인
- null을 포함해서 공백만 존재시 false를 반환

containsWhitespace()
- 문자열이 공백을 포함하고 있는지 아닌지 검증
profile
열심히하자
post-custom-banner

0개의 댓글