1. 개요
스프링 MVC 패턴에 의해 개발을 진행한다면, Controller에서 View에 정보를 전달하기 위해 Model에 정보를 담게 된다. 방식이 여러가지 있으며, 정리하기 위해 해당 게시물을 작성한다.
2. ModelAndView
ModelAndView는 스프링 MVC가 제공해주는 클래스로, 핸들러 어댑터가 핸들러(컨트롤러)에서 받은 정보를 가지고 ModelAndView 인스턴스에 담아서 반환한다. 이때, 핸들러에서 직접 ModelAndView를 만들어서 반환할 수도 있다.
@RequestMapping("/member/mv")
public ModelAndView mvt() {
ModelAndView mv = new ModelAndView("response/hi"); //(1)
Member member = new Member("abc");
mv.addObject("member", member); //(2)
return mv; //(3)
}
(1) ModelAndView 인스턴스를 생성한다. 이때 생성자로 viewName을 받는다.
잘 작동하려면, application.properties에 앞, 뒤 경로를 붙여주어야 한다.
spring.mvc.view.prefix=/WEB-INF/views
spring.mvx.view.seffix=.jsp
(2) 데이터를 추가하는 방식이다. 이 데이터는 이후 뷰를 렌더링할 때 사용된다.
(3) 생성한 ModelAndView 인스턴스를 반환하면 된다.
3. Model model
또 다른 방법으로는 파라미터로 Model model를 받고, 거기에 정보를 담아서 반환하는 방식이다.
@GetMapping("/member/m")
public String items(Model model) {
Member member = new Member("def");
model.addAttribute("member", member);
return "response/hi";
}
해당 메서드가 구현된 클래스의 어노테이션은 @Controller라고 가정해보자. @Controller 어노테이션을 붙인 경우 컨트롤러가 String을 return시, 주소에 해당하는 view로 넘어가게 된다.
이때, model.addAttribute()를 통해 정보를 담을 수 있다. 굳이 model을 반환하지 않아도, 파라미터로 참조한 값이므로 해당 컨트롤러를 실행하는 핸들러 어댑터의 model값에 우리가 담은 정보가 전달될 것이다.
정보가 전달되면, 핸들러 어댑터가 ModelAndView로 잘 변환하여 Dispatcher Servlet에게 전달할 것이다. 자세한 과정은 아래 링크를 참고하면 확인할 수 있다.
4. @ModelAttribute
@ModelAttribute 어노테이션을 통해 받은 인스턴스는 굳이 Model에 따로 담지 않아도, 자동으로 정보가 전달된다.
@GetMapping("/member/ma")
public String items(@ModelAttribute Member member) {
return "response/hi";
}
별도로 값을 model에 저장하지 않아도, view에서는 member 값을 확인할 수 있다.
위 내용은 김영한 님의 인프런 강의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술"의 내용과 강의자료를 토대로 작성된 게시글입니다.
강의 링크:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Web > spring study' 카테고리의 다른 글
[Thymeleaf] Thymeleaf(타임리프)의 특징과 기본 표현식, 태그 속성 (0) | 2023.06.07 |
---|---|
[Spring] Spring Controller 어노테이션 정리 (MVC, REST api) (0) | 2023.05.26 |
[Spring] MVC 패턴, 스프링 MVC 구조 이해 (0) | 2023.05.24 |
[Spring] SLF4J 로깅 간단한 정리 (0) | 2023.05.24 |
[Spring] 서블릿, HttpServletRequest, HttpServletResponse (0) | 2023.01.17 |
댓글