작성
·
139
·
수정됨
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
안녕하세요. 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 인턴입니다.
zzzzz님의 질문에 대해, 비슷한 내용의 질문과 그에 대한 답변을 찾았습니다.
@ModelAttribut 검증에 관해 질문 있습니다.에서는 @ModelAttribute
사용과 관련된 검증 처리에 대해 설명하고 있습니다. 질문의 핵심은, @ModelAttribute
를 통해 HTML 폼에서 전송된 데이터를 서버에서 자바 객체로 바인딩(binding)하는 과정 중에 검증(validation)을 어떻게 처리할 수 있는지에 관한 것입니다.
@ModelAttribute("item") Item item
은 웹 요청 파라미터를 Item 객체에 바인딩하기 위해 사용됩니다. 즉, HTTP 요청에서 전달된 파라미터들이 Item의 필드에 자동으로 바인딩되어, 컨트롤러 메소드에서 이 객체를 통해 전달받은 데이터를 사용할 수 있게 합니다.
Model model
은 컨트롤러에서 뷰로 데이터를 전달할 때 사용하는 객체입니다. 컨트롤러에서 model.addAttribute()
메소드를 사용해서 데이터를 추가하면, 뷰에서 이 데이터를 사용할 수 있게 됩니다. 즉, Model 객체는 뷰에 전달할 데이터를 임시로 저장하는 컨테이너 역할을 합니다.
zzzzz님의 코드에서는 검증에 실패한 경우 errors
맵에 오류 메시지가 추가되고, 이 맵이 Model
객체에 추가되어 뷰에 전달됩니다. 이를 통해 검증 실패 메시지를 사용자에게 표시할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.