ViewResolver 에게 전달하기
전체적인 MVC동작과정을 다시한번 간단하게 생각해보자.
Controller가 어떤뷰를 사용하겠다는 내용을(ModelAndView객체) DispatcherServlet에게 주면 DispatcherServlet는 클라이언트에게 반환할 정보를 ViewResolver에게 주면 view객체를 만들어서 DSDispatcherServlet에게 다시 전달. 그러면 Model 데이터들을 JSP페이지에 셋팅해서 View를 사용자에 전해준다.
Contorller가 DispatcherServlet에게 던져준 ModelAndView객체 안에는 JSP를 구성하기 위해 필요한 데이터와 사용할 JSP가 무엇인지에 대한 정보가 담여져 있다. 정확하게는 Request객체가 들어있다고 할 수 있겠다.
ViewResolver는 컨트롤러에서 받은 View의 이름을 토대로 JSP를 찾아 선택하고 JSP 데이터를 분석해 응답결과를 만들어내는 요소라고 할 수 있겠다!
사실, 지금까지 ViewResolver를 계속 사용해왔다. 컨트롤러에서 문자열을 리턴하여 JSP를 찾았는데 내부에서는 ModelAndView객체를 만들어서 그 정보를 가지고 ViewResolver가 받아서 View를 반환해 왔던 것이다.
어떤 방법들이 있는지 더 자세하게 알아보도록 하자.
1. HttpServletRequest
HttpServletRequest는 앞에서도 살펴보았던 놈이다. 저번에는 request를 받아서 request.getParameter를 하여 request받은 데이터를 활용만하고 View단으로 넘기지는 않았었다. 이번에는 View로 Request객체를 넘겨보자.
request.setAttribute를 이용하여 data1에는 100이라는 데이터를, data2에는 200이라는 데이터를 담았다.
그리고 return "test1"하여 test1이라는 jsp파일을 View로 사용하고 싶다는 정보를 ViewResolver에게 넘긴것이다.
그러면 View단에서는,
<h2> data1 : ${data1} </h2>
<h2> data2 : ${data2} </h2>
이런식으로 Request데이터를 활용할 수 있겠다.
2. Model
이번엔 Model이다. HttpServletRequest와 비슷하다. Model에 담는 데이터를 Request영역에 담아 ViewResolver로 전달하게 된다. Model은 setAttribute가 아니라 addAttribute를 사용한다.
<h2> data1 : ${data1} </h2>
<h2> data2 : ${data2} </h2>
View단에서 위와 같이 사용할 수 있다.
3. ModelAndView
ModelAndView는 Model과 View를 한번에 담을 수 있는 객체이다. 메소드 타입을 String이 아닌 ModelAndView로 만들고, ModelAndView객체를 만들어서 그 객체에 addObject를 이용하여 데이터를 담을 수 있다. (Object이기 때문에 어떠한 형태도 담을수 있겠다.) 또한 setViewName을 이용하여 ModelAndView객체안에 View의 이름까지 담아서ModelAndView객체 자체를 return한다.
<h2> data1 : ${data1} </h2>
<h2> data2 : ${data2} </h2>
View단에서는 달라지는 것 없이 위와 같이 Request데이터를 받아올 수 있다.
위의 3가지 방식은 개발자에 취향에 따라서 아무거나 써도 된다.
ModelAndView가 깔끔해서 나는 ModelAndView사용하여 프로젝트를 만들었었다.ㅎ