인프런 커뮤니티 질문&답변

양지웅님의 프로필 이미지
양지웅

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

상품 수정

@ModelAttribute Item item에 관한 질문(추가 수정)

해결된 질문

작성

·

902

·

수정됨

0

앞선 질문내용이 잘못된것이 있어서 수정합니다.


[질문 내용]
@ModelAttribute는 지정된 객체를 생성하여, 요청 파라미터의 값을 해당 객체의 프로퍼티를 보고 입력해준다고 알고 있습니다.

그리고 자동으로

model.addAttribute("item", item);

을 실행해 줄텐데 이때 모델에 담기는 item은

기존에 업데이트하려는 item객체가 아니라 @ModelAttribute로 인해 새로 생성된 item을 넣어주게 되는 것 아닙니까?

해당 모델을 return "/basic/item";

으로 넘겨주게 되면 새로 생성된 item은 updateParam이기 때문에 id값이 없어서 예외가 발생하는 문제가 있습니다.

따라서 redirect를 이용하여

return "redirect:/basic/items/{itemId}"

로 재요청을 하게되면 기존 model이 초기화 되고, itemId로 리포지토리에 있는 item을 찾고 해당 아이템을 model에 추가 하여

"/basic/item" Html From으로 경로 이름을 반환하는 것으로 이해하면 될까요? 

(추가)

리턴을 pathName으로 바로 해주어도

item.id에 값이 제대로 들어가는 것으로 확인되는데

Model에 담기는것은 updateParam 으로 id값이 없는 것으로 알고 있습니다. 어떻게 잘 작동하는지 궁금합니다.!

답변 1

0

안녕하세요. 양지웅님, 공식 서포터즈 OMG입니다.
.

해당 모델을 return "/basic/item";

으로 넘겨주게 되면 새로 생성된 item은 updateParam이기 때문에 id값이 없어서 예외가 발생하는 문제가 있습니다.

이 부분을 강의 코드를 기준으로 설명드리겠습니다.

image1번 상품의 가격과 수량을 2,3으로 변경하였습니다.

image그리고 다음과 같이 중단점을 걸고 item에 들어있는 값을 확인하면

image우선itemId는 http://localhost:8080/basic/items/1/edit

경로표현식 1을 통해 바인딩 됩니다.

item객체의 id=>1은

id값이 없다고 하였지만 id가 없을 때는 등록할 때이며 수정할 때가 아닙니다.

수정한다는 것은 아이템이 등록된 시점 이후이고 아이템이 등록되면서 id가 부여되기 때문에 id가 없지 않습니다.

해당 Id는 상품 수정의 id필드에서 item과 프로퍼티 바인딩이 발생합니다.

image따라서 디버깅을 통해 확인했을 때 id값이 존재하게 되는 것이구요,

따라서 redirect를 이용하여

return "redirect:/basic/items/{itemId}"

로 재요청을 하게되면 기존 model이 초기화 되고, itemId로 리포지토리에 있는 item을 찾고 해당 아이템을 model에 추가 하여

"/basic/item" Html From으로 경로 이름을 반환하는 것으로 이해하면 될까요? 

네 맞습니다. 해당 내용은 바로 다음 강의인 PRG패턴을 학습을 하시면 명확히 이해될 내용이라 생각합니다

(추가) 부분도 위에서 설명했듯 id는 아이템 생성이후 부여되어있고 수정화면에서 존재하기 때문에 서버단에서 값을 갖고 있는 상태입니다.
.
감사합니다.

양지웅님의 프로필 이미지
양지웅
질문자

@ModelAttribute Item item에서 item이 id값을 갖는다는 것을 이해했습니다.

  1. 그렇다면 해당 item과 PathVariable로 바인딩된 itemId로 findByItem(itemId)를 통해 찾은 item과 같은 객체인건가요?

  2. @ModelAttribute 를 사용하면 지정된 객체로 model.addAttribute가 실행된다고 알고 있는데 그때 넘어가는 item객체는 리포지토리에 저장된 id 1의 객체인건가요?

 

1.질문 남기신 앞부분 내용을 이해하셨다면 동일한 객체인지 아닌지 아실 수 있을거라 생각하는데요, 질문남기신 내용과 더불어 직접 ==비교로 동일성 체크를 해보신 후 생각을 정리하여 답변 남겨주세요. Item클래스에 @Data에는 @ToString이 포함되어 있으니 @Data대신 @Getter @Setter로 변경하고 확인해보면 됩니다.

2.editForm에서 파라미터로 넘어온 @ModelAttribute Item item입니다. 제가 올린 디버깅 화면의 item객체가 넘어갑니다. 즉, 새로 수정한 데이터이고 이 객체는 1번 답변으로 아실 것 같은데 정리가 안되면 댓글에 얘기해주세요

양지웅님의 프로필 이미지
양지웅

작성한 질문수

질문하기