DispatcherServlet 동작 원리 part2

Posted by 열정보이
2019. 2. 18. 20:02 Web

안녕하세요, 오늘은 저번에 못다한 DispatcherServlet의 동작 원리에 대해 이야기 해보도록 하겠습니다.


저번에 Controller에서 Model을 생성해 View에서 Expression Language를 이용해 사용하는것을 봤습니다.

기억이 안나신다면 아래 링크를 통해 보고와주세요~

https://become.tistory.com/entry/Spring-DispatcherSevlet%EC%9D%B4%EB%9E%80?category=311630



4. 모델과 뷰


보통 우리는 개발을 할 때, 다음 사진과 같이 View의 이름을 Return값으로 주곤 합니다.



우리는 이렇게 View의 이름만 Return하게 되고, DispatcherServlet의 전략인 ViewResolver가 이를 이용해 View Object를 생성합니다.


위 사진을 통해 Default로 등록되어 있는 ViewResolver 전략 중 하나인 InternalResourceViewResolver에 대해 알아보도록 하겠습니다.

Package Explorer를 통해 본 home의 위치는 /WEB-INF/views/home.jsp 네요.

근데 어떻게 home만 명시해줘도 될까요?


그 답은 아래 코드에 있습니다.


1
2
3
4
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>
cs


Spring은 이미 프로젝트를 생성할때부터 servlet-context.xml에 DispatcherServlet이 필요로 하는 설정을 해놓죠.

그 중 하나가 ViewResolver의 Default 전략인 InternalResourceViewResolver입니다. 


InternalResourceViewResolver는 Controller를 통해 반환되는 논리적인 View의 이름을 사용하여 실제 View 객체를 결정합니다.

또한 위에 보는 것과 같이, prefix와 suffix를 통해 View 객체의 경로에 도달하게 도와줄 수 있죠.


추가적으로, Spring에는 ModelAndView라는 객체가 존재합니다.

해당 객체는 Adapter를 통해 DispatcherServlet이 최종적으로 돌려받는 객체입니다.

이 객체에 'View의 이름''값이 들어있는 Model'이 있는거죠.


이 객체에서 ViewResolver가 View의 이름을 받아 해당 View에게 Object를 생성하도록 요청하는거죠.


5,6. Model을 참고하고 View를 생성


DispatcherServlet이 Controller에게 Model과 View를 받은 이후에는 View Object에게 Model을 전달해주고, Client에게 돌려줄 최종 결과물을 생성해 달라고 요청합니다.


주로 이러한 최종 결과물은 브라우저가 해석할 수 있는 HTML이겠죠?


저희는 이미 Controller에게 View의 이름을 받았습니다. 그리고 이러한 View이름은 JstlView가 JSP 뷰 템플릿의 이름을 가져다가 HTML 파일을 만들어 주게 됩니다.

JstlView는 View를 JSP로 사용할 때, 여러 기능을 사용할 수 있도록 돕는 클래스라고 생각하면 될 것 같습니다.


그리고 JSP에서는 이전 내용에서 본 것 처럼, ${Value} 형식으로 사용하는 Expression Language를 이용해 Model 값을 참조할 수 있죠.



7.HTTP 응답


모든 작업을 마친 DispatcherServlet은 등록된 후처리가 있는지 확인 후, 후속 작업을 진행합니다.


그 후에 View가 만들어준 HttpServletResponse에 담긴 최종 결과를 Servlet Container에게 돌려줍니다.

그리고 Servlet Container는 HttpServletResponse에 담긴 정보를 HTTP Response로 만들어 Client에게 전송하고 작업을 종료합니다.





이렇게 Dispatcher Servlet 의 동작원리에 대해 알아보았습니다.

갈 수록 더 깊게 공부해야겠다는 생각뿐이네요 ㅎ


그럼 오늘도 좋은 하루 보내세요~