티스토리 뷰
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 ]
ViewResolver는 Controller가 반환한 결과를 어떤 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의 처리에 대한 분배가 정해진 방식대로만 동작하므로 좀 더 엄격한 구조를 만들어 낼 수 있다.
출처: 코드로 배우는 스프링 웹 프로젝트
'WEB > Spring' 카테고리의 다른 글
[Spring] MVC의 Controller (0) | 2021.12.20 |
---|---|
[Spring] root-context와 servlet-context (스크랩) (0) | 2021.12.18 |
[Spring] IoC(Inversion of Control) 제어의 역전과, DI (Dependency Injection) 의존성 주입 (0) | 2021.12.15 |
- Total
- Today
- Yesterday
- jsp
- brute force
- Django
- append
- baekjoon
- 스프링
- CSS
- 고득점 키트
- 큐
- 자바스크립트
- python
- 프로그래머스
- 덱
- 단계별로풀어보기
- jQuery
- 백준
- Case When
- html
- 문자열
- 정렬
- R
- 파이썬
- bootstrap
- javascript
- Java
- 장고
- 브루트 포스
- web
- 자바
- Oracle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |