작성
·
447
·
수정됨
4
V1, V2 에서 값을 잘못 입력했을때 addForm으로 넘어가잖아요 V1은 잘못 입력한 데이터가 유지되는데 V2는 왜 유지가 되지 않나요?
V1
@PostMapping("/add")
public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) {
//검증에 실패하면 다시 입력 폼으로
if (!errors.isEmpty()) {
log.info("errors = {} ", errors);
model.addAttribute("errors", errors);
//model.addAttribute("item", item) <<자동추가되는거아님?
return "validation/v1/addForm";
}
V2
public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증에 실패하면 다시 입력 폼으로
if (bindingResult.hasErrors()) {
log.info("errors={} ", bindingResult);
//model.addAttribute("item", item)<<자동추가되는거아님?
return "validation/v2/addForm";
}
V1,V2 모두 @ModelAttribute 애노테이션에 의해서 model.addAttribute("item", item) 이 추가 된 후 item이 addForm으로 넘어가서 둘 다 값이 유지 돼야 된다고 생각 하는데.........
제가 어디서 놓치고 있는지 모르겠습니당 ㅠㅠ
답변 1
1
bindingResult.addError(new FieldError("item", "itemName", "상품 이름은 필수 입니다."));
bindingResult.addError(new FieldError("item", "itemName", item.getItemName(), false, null, null, "상품 이름은 필수 입니다."));
주말에도 답변 달아주셔서 너무 너무 감사하고 죄송스럽네요 치킨이라도 사드리고 싶다는ㅎㅎ;
1. 일단 OMG님 답변의 의도는
이번 강의 V2 addItemV1에서 잘못 입력했을 때 값이 유지 되지 않아서 다음 강의 V2 addItemV2가 나왔고 addItemV2에 파라미터를 추가 해줌으로서 잘못 입력했을 때 값이 유지된다는 것을 말씀 하신 것이 맞나요?
2.그런데 제가 궁금한 것은 9:09초 쯤 인데요
V1 addItem ,V2 addItemV1 둘 다
//model.addAttribute("item", item)
이 로직이 (@ModelAttribute Item item)에 의해서 자동으로 추가된다고 말씀하셨는데 잘못 입력했을 때 V1 addItem은 item값을 넘겨 받아서 유지가 되고 왜 V2 addItemV1은 item값을 넘겨 받지 못 하는 지가 궁금합니다
V1 addItem
@PostMapping("/add")
public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) {
//검증에 실패하면 다시 입력 폼으로
if (!errors.isEmpty()) {
log.info("errors = {} ", errors);
model.addAttribute("errors", errors);
//model.addAttribute("item", item)<<자동추가되는거아님?
return "validation/v1/addForm";
}
/성
}
V2 addItem1
@PostMapping("/add")
public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) {
//검증에 실패하면 다시 입력 폼으로
if (bindingResult.hasErrors()) {
log.info("errors={} ", bindingResult);
//model.addAttribute("item", item)<<자동추가되는거아님?
return "validation/v2/addForm";
}
}
치킨 말고 영한님에게 힘이되는 수강평이 저한테 있어서 더 감사할 것 같습니다 ^^
1.
네 그런 의도로 말씀드린게 맞습니다.
2.
저도 그 부분이 의아해서 이전 답변 드리기전 실제 디버깅으로 model에 담긴 값들을 확인해보았는데요,
값이 담겨 있기는 합니다.
ValidationItemControllerV1.addItem()
ValidationItemControllerV2.addItemV1()
ValidationItemControllerV2.addItemV2()
addItem(), addItemV1(), addItemV2() 까지 모두 에러가 발생하는 상황에서 addForm으로 돌아갈 때 model에 실패하는 값들을 갖고 있기는 했습니다.
addItemV1()에서 itemName, price, quantity 모두 값 2를 포함하고 있는데요.
ValidationItemControllerV2로 변경되면서 추가된게 BindingResult인 만큼 BindingResult의 구현체에서 값을 덮어씌우지 않나 예상합니다.
addItemV1()에서 생성하는 FieldError는 다음과 같이 rejectValue가 Null로 자기 자신을 호출하는데,
bindingResult.addError(new FieldError())
rejectValue가 null인 상태에서 addError의 로직에서 기존 model의 item에 있는 데이터보다 우선순위가 높다거나, 덮어씌우는 등의 처리로 인해 발생하지 않나 예상되네요.
실제 구현코드 까지 보면 조금 더 정확히 알 수 있을 것 같은데요,
강의에서 구현 클래스를 언급하시는데요(BeanPropertyBindingResult)
궁금하시다면 한번 확인해보셔도 좋을 것 같아요. 처음 질문 주실 때
제가 어디서 놓치고 있는지 모르겠습니당 ㅠㅠ
라고하셨는데요,
제 생각에는 놓쳤다기 보다는 강의보다 깊게 파고 들어가신게 아닌가 싶을 정도로 예리하고 좋은 학습태도이지 않나 싶네요 ㅎㅎ
제 답변 + 확인해보신 내용을 바탕으로 궁금하신게 있다면 추가적으로(본 링크를 포함하셔도 됩니다.) 글 남겨주시면 영한님이나 서포터즈가 답변을 드릴 수 있을 것 같습니다.
1 .
2.
"V1에서는 model에 errors를 담지만, V2에서는 없어서 그런거 같아요"
그냥 그런가 보다 하고 넘어가도 될까요?