Spring Web MVC의 Dispatcher Servlet의 동작 원리

jaeyong Lee·2024년 8월 2일

이론적

'디핸컨모디뷰뷰디' 순서

실제 코드

요청 -> web.xml의 dispatcher servlet 실행

클라이언트 요청 -> spring의 web.xml파일 실행 -> 디스패처 서블릿 모든 경로에서 실행

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

dispatcher -> handler mapping

<!-- spring mvc기반의 애너테이션 사용가능하게 한다. -->
	<annotation-driven />

annotation driven으로 @requestmapping을 포함한 모든 어노테이션을 사용가능하게 한다.

handler mapping의 목적 -> 클라이언트의 요청 URL을 적절한 컨트롤러로 매핑하는 것
※) 여기서 컨트롤러는 핸들러라 한다.
즉 디스패처가 componentscan을 통해 requestmapping 애너테이션들을 찾아내서 controller(핸들러)로 매핑한다 라는 의미가 핸들러 매핑

Controller(handler) -> ModelAndView

위는 maincontroller인데 코드를 보면 ModelAndView객체에 viewName과 데이터를 담아서
반환 하는 것을 볼 수 있다.

ModelAndView -> dispatcher

결론적으로 컨트롤러(핸들러)가 반환값을 알아서 디스패처의 viewresolver로 반환한다. (spring에 의해서)

<!-- 3.TilesConfigurer은 definition이라는 속성을 이용해 tiles파일 위치를 지정해준다. 타일즈의 설정파일들의 
		위치를 지정한다. definitions는 타일즈의 정의파일들의 위치를 나타낸다. -->
		
	<beans:bean id="tilesConfigurer"
		class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
		<beans:property name="definitions">
			<beans:list>
				<beans:value>classpath:tiles/*.xml</beans:value>
			</beans:list>
		</beans:property>
		
		
		<!-- 타일즈 뷰에서 고정된 viewpage의 데이터를 가져와 빈으로 만들어 필요할때 효과적으로 불러올 수 있다. -->
		<beans:property name="preparerFactoryClass"
			value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />
	</beans:bean>
	
	
	<!-- UrlBasedViewResolver클래스는 URL기반의 뷰를 해석하고 Rendering해준다. (viewResolver 
		: 내보낼 view를 결정하고 해당 뷰를 렌더링한다.) TilewView : 뷰 리졸버가 타일뷰를 사용하겠다. 쉽게 말해 URL기반의 
		뷰 리졸버가 URL을 사용하여 타일즈뷰를 사용하고 나타내겠다는 말이다. -->
	<beans:bean id="viewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass"
			value="org.springframework.web.servlet.view.tiles2.TilesView" />
	</beans:bean>

viewResolver 호출 위 코드에서는 url기반으로 뷰를 해석한다. -> 컨트롤러에서 반환된 논리적 뷰 이름을 물리적 뷰 경로로 변환하여 어떤 뷰를 사용할지 결정한다.

tilesConfigurer는 -> tile 뷰를 사용하겠다 라는 말이다.

정리)
아 뷰리졸버가 tileView를 렌더링하는데 tileconfigurer 빈을 참고해서 렌더링한다

dispatcher -> client

이렇게 렌더링 된 html을 디스패처가 받아 client에게 응답으로 전송한다. 이 부분은
스프링이 자동으로 처리하는 부분이다.

0개의 댓글