티스토리 뷰
DispatcherServlet 란?
Spring MVC 패턴에서 기본적으로 사용하는 Servlet으로, 클라이언트의 요청이 있을 시 가장 앞단에서 요청을 가로채어(Front Controller) 요청에 매핑되는 Controller에 작업을 전달하고 비지니스 로직 처리 후 해당 결과 View를 클라이언트에 전달하는 역할
DispatcherServlet 흐름도
이미지 출처 : https://mangkyu.tistory.com/18
이미지에 잘 설명이 되어있어 스크립팅 하였다.
-
클라이언트의 요청을 DistpatcjerServler에 전달
-
요청한 url에 맞는 controller 검색하여 HandlerMapping에 전달
-
HandlerMapping에서 해당 controller에 처리 요청
-
controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달
-
DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색
-
viewResolver에서 처리 결과를 view에 전달
-
처리결과가 포함된 view를 DispatcherServlet에 전달
-
DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력
아래에 첨부한 설정 관련 이미지는 이클립스에서 spring mvc 프로젝트를 생성하였을 때 기본적으로 구성된 형식이다.
web.xml 구성
web.xml 에서 servlet 관련 설정 부분을 상세하게 확인해보면
servlet 태그 안에 설정과
해당 servlet을 사용하고자 mapping 한 부분인 servlet-mapping 태그를 보겠다.
먼저, servlet 태그는 사용하고자 하는 servlet을 선언하는 영역으로
org.springframework.web.servlet.DispatcherServlet을 servlet-class로 할당하며
초기 파라미터로 contextConfigLocation에 값에 /WEB-INF/spring/appServlet/servlet-context.xml을 할당한다.
처음에 소개했던 DispatcherServlet 흐름도 관련 이미지의 클라이언트의 요청이 DispatcherServlet으로 할당되는 이유와 관련된 설정이 servlet-mapping 태그이다.
url-pattern이 "/"로 설정되어 있기 때문에 모든 요청은 우리가 설정해 놓은 appServlet으로 전달이 된다.
servlet-contex.xml 구성
해당 xml에서 설정한 값들은 contextConfigLocation 파라미터에 부여되고 DispatcherServlet에서 사용된다.
- annotation-driven 태그 : @Controller에서 @RequestMapping을 사용하기 위해 선언된 태그이다.
- resources 태그 : mapping에 부여된 url로 요청이 들어올 경우 DispatcherVerlet에서 처리하지 않고 web resource 영역에서 해당 정적 파일을 찾아가겠다는 mapping 설정 부분
- ViewResolver bean : 다양한 ViewResolver가 존재하지만 기본 설정에서 사용되는 InternalResourceViewResolver은 @Controller에 요청을 받고 비지니스 로직 처리 후 반환 값을 기준으로 자원 경로의 패턴을 설정한다. prefix에 자원의 경로를 설정하고 suffix에 확장자를 설정한 것이다.
- 반환 값이 home 인경우 /WEB-INF/views/home.jsp 가 view로 반환된다.
- context:component-scan : @Controller, @Repository, @Service, @Component 등의 어노테이션 사용된 클래스 스캔 후 빈으로 등록하는 설정
DistpatcherServlet 초기화
DistpatcherServlet은 한 번도 실행되지 않은 경우 Servlet 생명주기에 의하여 인스턴스 생성 및 초기화를 수행한다.
-
javax.servlet.GenericServlet
-
Servlet 생명주기에 의하여 init() 호출
-
-
javax.servlet.http.HttpServlet extends GenericServlet
-
org.springframework.web.servlet.HttpServletBean extends HttpServlet
-
override 된 init()에서 initServletBean() 메소드 호출
-
-
org.springframework.web.servlet.FrameworkServlet extends HttpServletBean
-
override 된 initServletBean()에서 initWebApplicationContext() 메소드 호출
-
initWebApplicationContext()에서 onRefresh() 호출
-
-
org.springframework.web.servlet.DispatcherServlet extends FrameworkServlet
-
override 된 onRefresh()에서 initStrategies() 호출
-
initStrategies()에서 아래 9개 초기화 메소드 호출
-
주요 초기화 메소드 설명
-
initHandlerMappings : request 된 url과 매칭 하는 Controller를 검색
-
initHandlerAdapters : HandlerMapping에서 찾은 Controller에서 실행한 결과를 ModelAndView 객체로 변환하여 DispatcherServlet에 전달
-
initHandlerExceptionResolvers : HandlerMapping 및 Controller 작업 수행 중 예외가 발생한 경우를 담당하는 인터페이스
-
initViewResolvers : HandlerAdapter에서 전달된 ModelAndView 객체를 매핑되는 view에 전달
DistpatcherServlet 호출
DistpatcherServlet이 초기화된 후 호출할 때는
Servlet 생명주기에 의하여 아래와 같이 service를 호출 과정이 수행된다.
-
javax.servlet.GenericServlet
-
Servlet 생명주기에 의하여 service() 호출
-
-
javax.servlet.http.HttpServlet extends GenericServlet
-
override 된 service() 내에서 overload한 service()에 doGet(), doPost() 등 호출
-
-
org.springframework.web.servlet.HttpServletBean extends HttpServlet
-
org.springframework.web.servlet.FrameworkServlet extends HttpServletBean
-
override 된 doGet(), doPost() 등 메소드 내에서 processRequest(request, response); 호출
-
processRequest()에서 doService() 호출
-
-
org.springframework.web.servlet.DispatcherServlet extends FrameworkServlet
-
override된 doService() 내에서 doDispatch() 호출
-
doDispatch()에서 HandlerMapping, HandlerAdapter, HandlerExceptionResolver, ViewResolver, renderring 작업으로 최종 결과를 클라이언트에게 전달.
-
'spring' 카테고리의 다른 글
VScode 콘솔창 gradle profiles 적용이 안됨 조치 (0) | 2022.11.10 |
---|---|
spring security 스프링시큐리티 주요 설정 분석 (0) | 2022.02.27 |
[JPA] JPA 프로젝트 수정 기능 구현 시 null 값으로 저장되는 현상 (2) | 2022.01.13 |
[JPA] 메서드명으로 쿼리 생성 원리 (0) | 2020.10.06 |
[spring] SpringBoot 자동 설정 원리 (0) | 2020.01.16 |
- Total
- Today
- Yesterday
- spring
- jQuery
- SSL
- 날짜
- btye
- Oracle
- gradle
- docker
- 깨짐
- 컨테이너
- 이벤트발생
- vscode
- Git
- JPA
- parse
- Eclipse
- Java
- WAS
- web
- IMAGE
- Linux
- SpringBoot
- html
- React
- SQL
- JSON
- mybatis
- Windows
- jaxen
- TLS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |