• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

검증1 - Validation-검증 직접 처리 - 개발 질문입니다.

24.04.29 04:43 작성 24.04.29 04:46 수정 조회수 45

0

@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", "상품 이름은 필수입니다.");
    }
    if (item.getPrice() == null || item.getPrice() < 1000 || item.getPrice() > 1000000) {
        errors.put("price", "가격은 1,000 ~ 1,000,000 까지 허용합니다.");
    }
    if (item.getQuantity() == null || item.getQuantity() >= 9999) {
        errors.put("quantity", "수량은 최대 9,999 까지 허용합니다.");
    }

    //특정 필드가 아닌 복합 룰 검증
    if (item.getPrice() != null && item.getQuantity() != null) {
        int resultPrice = item.getPrice() * item.getQuantity();
        if (resultPrice < 10000) {
            errors.put("globalError", "가격 * 수량의 합은 10,000원 이상이어야 합니다. 현재 값 = " + resultPrice);
        }
    }

    if (!errors.isEmpty()){
        log.info("errors={}",errors);
        model.addAttribute("errors",errors);
        return "basic/addForm";
    }

    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId",savedItem.getId());//인코딩
    redirectAttributes.addAttribute("status",true);
    return "redirect:/basic/items/{itemId}";//위에는 포스트로 상품 추가 해주고 밑에는 다시 get으로 호출시키는 방법.

}
@ModelAttribute("item") Item item <-이부분이 item class의 엔티티를 의미하고 
Model model

은 메소드에서만 사용하는 특정 임시 객체로 이해하면 되나요?

@ModelAttribute은 model.addAttribute가 자동으로 생성되는데요. 큰 기숙사 안에서 동일한 룸에 에러코드도 들어가고 아이템 모델도 들어가는건가요?

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.04.29

안녕하세요. zzzzz님, 공식 서포터즈 y2gcoder입니다.

@ModelAttribute("item") Item item

은 간단하게 말씀드리면

"HTTP 요청을 보고 Item 객체에 동일한 필드가 있으면 매핑하고 Item item 객체로 만들어서 메서드에서 사용할 수 있게 넣어줘! 그리고 모델에도 넣어줬으면 좋겠는데 모델에 넣을 때 key 값은 'item'으로 해줘!"

입니다.

Model model은 유효성 검증에 실패했을 때 만든 errors 를 모델에 넣어 반환하는 뷰에 데이터로 넣어주기 위해 사용했습니다!

위의 작성해주신 코드를 천천히 다시 보시면 에러 코드들은 Map<String, String> errors 에 넣고, 그 errors는 모델에 담겨 뷰로 반환되는 것을 보실 수 있습니다. 이것을

@ModelAttribute은 model.addAttribute가 자동으로 생성되는데요. 큰 기숙사 안에서 동일한 룸에 에러코드도 들어가고 아이템 모델도 들어가는건가요?

이런 비유로 표현하셨다고 생각합니다. 좀 더 제가 보태자면

큰 기숙사(model) 안에 각각 다른 방(item, errors)에 에러 코드, 아이템 들이 들어간 것이라고 이해해주십쇼!

 

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.29

안녕하세요, 인프런 AI 인턴입니다.

zzzzz님의 질문에 대해, 비슷한 내용의 질문과 그에 대한 답변을 찾았습니다.

@ModelAttribut 검증에 관해 질문 있습니다.에서는 @ModelAttribute 사용과 관련된 검증 처리에 대해 설명하고 있습니다. 질문의 핵심은, @ModelAttribute를 통해 HTML 폼에서 전송된 데이터를 서버에서 자바 객체로 바인딩(binding)하는 과정 중에 검증(validation)을 어떻게 처리할 수 있는지에 관한 것입니다.

@ModelAttribute("item") Item item은 웹 요청 파라미터를 Item 객체에 바인딩하기 위해 사용됩니다. 즉, HTTP 요청에서 전달된 파라미터들이 Item의 필드에 자동으로 바인딩되어, 컨트롤러 메소드에서 이 객체를 통해 전달받은 데이터를 사용할 수 있게 합니다.

Model model은 컨트롤러에서 뷰로 데이터를 전달할 때 사용하는 객체입니다. 컨트롤러에서 model.addAttribute() 메소드를 사용해서 데이터를 추가하면, 뷰에서 이 데이터를 사용할 수 있게 됩니다. 즉, Model 객체는 뷰에 전달할 데이터를 임시로 저장하는 컨테이너 역할을 합니다.

zzzzz님의 코드에서는 검증에 실패한 경우 errors 맵에 오류 메시지가 추가되고, 이 맵이 Model 객체에 추가되어 뷰에 전달됩니다. 이를 통해 검증 실패 메시지를 사용자에게 표시할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.