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

윤제리님의 프로필 이미지
윤제리

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

회원 가입

이 코드 같은 동작 수행하는거 맞지요?

작성

·

221

0

@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("item", new Item());
return "validation/v4/addForm";
}

이 코드랑

@GetMapping("/add")
public String addForm(@ModelAttribute Item item) {
return "validation/v4/addForm";
}

이 코드 같은 동작 수행하는 거 맞나요??

저렇게 바꿔도 될거같아서요.

답변 2

1

안녕하세요. 윤제리님, 공식 서포터즈 David입니다.

.
Model에 item을 담아서 뷰에 전달하는 것만 동일합니다.

첫번째 코드는 item을 내부에서 생성해서 model에 전달하고

두번째 코드는 item을 외부로부터 전달받아서 model에 전달합니다.

따라서 같은 동작을 수행한다고 보기 어렵습니다.

.
감사합니다.

윤제리님의 프로필 이미지
윤제리
질문자

제가 인강보면서 이해하기로는 @ModelAttribute Item 을 해주면 내부적으로

Item item = new Item(); item.setItemName(itemName); item.setPrice(price); item.setQuantity(quantity);

model.addAttribute("item", item);

이렇게 작동한다고 이해해서요.

다른건가요? ㅠㅠ

 
 
@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("item", new Item());
return "validation/v4/addForm";
}

위 코드에서는 생성된 item의 상태를 변경하는 부분(setter 메서드들)은 빠져있습니다.

이에 반해 @ModelAttribute는 외부에서 넘어온 값을 Item에 넣어주기 위해

내부적으로 item을 생성(new Item())하고 setter 메서드를 통해 넘어온 값을 item의 상태로 변경하게 됩니다.

외부에서 넘어온 값을 Item 객체로 받는 것과 컨트롤러 메서드 내에서 Item 객체를 생성하는 것은 다른 동작입니다.

물론 Item 객체를 생성하는 것, 생성된 Item 객체를 Model에 담아주는 것만 놓고보면 같은 동작입니다. 하지만 이 동작만을 위해 컨트롤러 메서드의 파라미터에 Item 객체를 쓴 것은 아닙니다.

 

한가지 질문드려도 될까요?

@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("item", new Item());
return "validation/v4/addForm";
}

만약 @ModelAttribute를 쓴 코드와 위 코드가 동일한 역할을 한다면 @ModelAttribute와 Item 객체를 파라미터로 받지 않을 때 어떻게 사용자가 전달한 값을 받아서 addForm 화면에 전달할 수 있을까요?

0

근데 영한님이 작성하신 코드에서는 사용자가 전달한 값이 없기때문에 그냥 빈 객체가 전달되는것 아닌가요?ㅜㅜ 

네, 맞습니다. 전달한 값이 없다면 당연히 빈 객체가 전달될 겁니다.

윗 분의 질문의 의도는 동일한 동작을 하는 코드인지 물으셔서 그에 맞게 답변해드렸습니다:)

윤제리님의 프로필 이미지
윤제리

작성한 질문수

질문하기