<aside> 1️⃣ Model, ModelAndView, ModelMap이란
</aside>
Model
, ModelMap
, **ModelAndView
**의 사용에 대해 좀 더 상세하게 설명하겠다.이 설명은 [Baeldung](<https://www.baeldung.com/spring-mvc-model-model-map-model-view>)의 글을 바탕으로 한다.
<aside> 2️⃣ Model, ModelAndView, ModelMap의 설명
</aside>
Model
:
Model
**은 뷰를 렌더링하는 데 사용되는 속성을 제공할 수 있는 가장 기본적인 개념이다. (스프링 MVC에서 컨트롤러와 뷰 사이의 데이터를 전달하는 역할을 하는 인터페이스이다.)controller
**에서 데이터를 Model
객체에 추가하면 된다. 그러면 이 Model
객체는 뷰로 전달되어 뷰에서 사용될 수 있다.Model
**에 데이터를 추가하는 방법은 addAttribute
메서드를 사용하는 것이다. 예를 들어, **model.addAttribute("message", "Hello, World!");
**와 같이 사용할 수 있다.Model
인스턴스와 병합할 수 있다.@GetMapping("/showViewPage")
public String passParametersWithModel(Model model) {
Map<String, String> map = new HashMap<>();
map.put("spring", "mvc");
model.addAttribute("message", "Baeldung");
model.mergeAttributes(map);
return "view/viewPage";
}
ModelAndView
:
ModelAndView
**는 ****값을 뷰로 전달하는 인터페이스이다. 이 인터페이스를 사용하면, 스프링 MVC에 필요한 모든 정보를 한 번에 반환할 수 있다.ModelAndView
객체를 생성하고, 이 객체에 데이터와 뷰 이름을 설정한 후 컨트롤러에서 반환하면, 스프링 MVC는 이 ModelAndView
객체를 사용하여 뷰를 렌더링한다.ModelAndView
**는 **Model
**과 **View
**를 한 번에 처리할 수 있으므로, 편리하게 사용할 수 있다.@GetMapping("/goToViewPage")
public ModelAndView passParametersWithModelAndView() {
ModelAndView modelAndView = new ModelAndView("view/viewPage");
modelAndView.addObject("message", "Baeldung");
return modelAndView;
}
ModelMap
:
ModelMap
**은 Model
인터페이스를 구현한 클래스로, **Map
**과 유사한 API를 제공한다.Model
인터페이스와 마찬가지로, **ModelMap
**도 뷰를 렌더링하는 데 사용되는 값을 전달하는 데 사용된다. 그리고 **Model
**과 마찬가지로, **ModelMap
**에 데이터를 추가하려면 addAttribute
메서드를 사용하면 된다.ModelMap
**의 장점은 값을 컬렉션으로 전달하고, 이러한 값들을 마치 맵(키와 값을 가짐) 내에 있는 것처럼 처리할 수 있다는 것이다.@GetMapping("/printViewPage")
public String passParametersWithModelMap(ModelMap map) {
map.addAttribute("welcomeMessage", "welcome");
map.addAttribute("message", "Baeldung");
return "view/viewPage";
}
<aside> 3️⃣ 컨트롤러에서는 이 셋중에 어떤것을 선택해야할까?
</aside>
Model
**이나 **ModelMap
**을 사용할 수 있고, 뷰 이름과 함께 데이터를 전달하려면 **ModelAndView
**를 사용할 수 있다.@ModelAttribute
**를 사용하면 된다.<aside> 4️⃣ 그럼 @ModelAttribute는 뭘까?
</aside>
@ModelAttribute
어노테이션은 메소드 레벨에서도 사용될 수 있으며, 이 경우 해당 메소드의 반환값이 모델에 자동으로 추가된다.<aside> 5️⃣ @ModelAttribute의 사용법
</aside>
메소드 인자에 사용:
@ModelAttribute
**가 붙은 메소드 인자는 HTTP 요청 파라미터를 해당 객체에 바인딩하는 역할을 한다. 이는 주로 폼 데이터를 객체로 받아오는 경우에 사용된다.User
객체에 바인딩하려면 다음과 같이 사용할 수 있다.@PostMapping("/user")
public String submit(@ModelAttribute User user) {
// user 객체는 요청 파라미터를 바인딩 받은 상태
// 여기서 비즈니스 로직 수행
return "userView";
}
메소드에 사용:
@ModelAttribute
**가 붙은 메소드는 뷰가 렌더링되기 전에 항상 먼저 실행되며, 이 메소드의 반환값이 모델에 추가된다. 이를 통해 여러 뷰에서 공통으로 사용되는 참조 데이터를 제공하는 데 유용하다.@ModelAttribute("settings")
public Settings getSettings() {
return settingsService.getSettings();
}
getSettings()
메소드가 반환하는 Settings
객체는 "settings"라는 이름으로 모델에 자동으로 추가되며, 뷰에서는 이 "settings" 속성을 사용하여 설정 정보에 접근할 수 있다.@ModelAttribute
**는 스프링 MVC에서 매우 유용하게 사용되는 어노테이션이다. 사용 방법은 상황에 따라 달라질 수 있으므로, 필요에 따라 적절하게 사용하면 된다.<aside> 6️⃣ @ModelAttribute [메소드에 사용] - 추가설명
</aside>
@ModelAttribute
어노테이션이 붙은 메소드가 반환하는 것은 뷰가 아닌 데이터이다. 이 메소드가 반환하는 데이터는 자동으로 모델에 추가되며, 이 모델은 뷰를 렌더링하는 데 사용된다.@ModelAttribute
어노테이션이 붙은 메소드는 이 규칙에서 예외이다. @ModelAttribute
어노테이션이 붙은 메소드는 뷰 이름을 반환하는 것이 아니라, 뷰에서 사용할 수 있는 데이터를 반환한다.