티스토리 뷰

WEB/Spring

[Spring] MVC 패턴 이해하기

Happyoon ~ 2021. 12. 19. 22:27
728x90
반응형

1. 프로젝트의 로딩 구조

프로젝트의 구동은 web.xml에서 시작한다.  web.xml을 살펴보자.

 

web.xml #1

<context-param> <!-- #1 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener>

context-param에는 root-context.xml의 경로가 설정되어 있다.

ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작하여 로그를 출력한다. 

root-context가 처리되면 파일에 있는 빈 설정들이 동작한다. 

root-context에 정의된 객체들은 스프링의 영역(context)에 생성되고, 객체들 간 의존성이 처리된다. 

 

web.xml #2

<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

root-context가 처리된 후에는 스프링 MVC에서 사용하는 DispatcherServlet 관련 설정이 동작한다.

DispatcherServlet은 웹 관련 처리의 준비 작업을 진행하는데, 이 때 사용하는 파일이 servlet-context.xml 이다. 

DispatcherServlet은 servlet-context.xml을 로딩하고, servlet-context에 정의된 빈들은 기존에 만들어진 객체들과 연동된다.

 


2. 스프링 MVC의 기본 사상

 

스프링 MVC를 이용하면 개발자들이 직접 Servlet/JSP의 API를 사용할 필요성이 현저히 줄어든다. 


3. 스프링 MVC의 기본 구조 

 

 

[ 1 ] 

사용자의 Request가 DispatcherServlet을 통해 처리된다. 아래는 web.xml의 코드의 일부인데, 모든 Request를 DispatcherServlet이 받도록 처리하고 있다.

 

web.xml 일부

<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

 


[ 2 ] [ 3 ]

HandlerMapping@RequestMapping 어노테이션이 적용된 것을 기준으로 판단하여, Request 처리를 담당하는 컨트롤러를 찾는다.

적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해, 해당 컨트롤러를 동작시킨다.


[ 4 ] 

Controller개발자가 작성하는 클래스로, 실제 Request를 처리하는 로직을 작성한다. 

View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아 전달한다. 

Controller는 다양한 타입의 결과를 반환하는데, 이에 대한 처리는 ViewResolver를 이용한다. 

 


[ 5 ]

ViewResolverController가 반환한 결과를 어떤 View를 통해 처리하는 것이 좋을지 해석하는 역할을 한다.

 

context.xml 일부

<!-- Controller가 반환한 결과를 어떤 view를 통해 처리하는 것이 좋을지 해석하는 역할을 담당하는 InternalResourceViewResoler -->
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<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>

[ 6 ] [ 7 ]

View는 실제로 응답 보내야 하는 데이터를 JSP 등을 이용해 생성한다. 만들어진 응답은 DispatcherServlet을 통해 전송된다.

 

 

 

 

이렇게 모든 Request가 DispatcherServlet을 통하도록 설계된 방식을 Front-Controller 패턴이라 한다. 

Front-Controller 패턴을 이용하면 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하므로 좀 더 엄격한 구조를 만들어 낼 수 있다.


출처: 코드로 배우는 스프링 웹 프로젝트

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함