[27일차] Spring Framework 실행 순서

[27일차] Spring Framework 실행 순서

https://javannspring.tistory.com/231

* 본 포스팅은 개인 공부용으로 위 링크를 그대로 복사하여 정리한 내용입니다.

Spring Framework 실행 순서

1. 웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 Loading

ServletContainer (e.g. 톰캣 서버) → URL 확인 → 요청을 처리할 서블릿 찾아 실행

* web.xml : 각종 설정을 위한 파일

2. web.xml에 등록되어 있는 ContextLoaderListener (Java Class) 생성

서블릿 컨테이너가 파일을 읽어서 구동될때, ContextLoaderListener 가 자동으로 메모리에 생성된다. (Pre-Loading)

ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.

ContextLoaderListener 클래스는 Servlet의 생명주기를 관리해준다.

Servlet을 사용하는 시점에 servlet-context.xml에 ApplicationContext을 등록, Servlet이 종료되는 시점에 ApplicationContext을 삭제한다.

3. 생성된 ContextLoaderListener는 root-context.xml을 Loading

* ContextLoaderListener 객체는 src/main/resources 소스 폴더에 있는 applicationContext.xml 파일을 로딩하여 스프링 컨테이너를 구동하는데 이를 Root 컨테이너 라고 한다.

* 원래는 ContextLoaderListener가 WEB-INF 밑에 있는 파일을 먼저 로딩하도록 되어있으나 유지보수 상의 관계로 src/main/resources 에 파일을 넣어 놓는 경우가 많다. 때문에 src/main/resources 에 있는 파일을 가져다 로딩시키려면 web.xml에 -param으로 설정해서 사용한다.

4. root-context.xml에 등록되어 있는 Spring Container가 구동

root-context.xml에는 주로 view 지원을 제외한 공통 bean을 설정한다. (web과 관련된 bean들은 등록해주지 않음)

예시로 spring properties 파일을 로컬과 서버용으로 구분지을 때 여기서 property value를 설정해준다.

(검색해보니 databaseDataSource, repository 설정을 주로 함)

5. 클라이언트로부터 웹 어플리케이션 요청이 옴

최초의 클라이언트 요청에 의해 DispatcherServlet 생성

6. DispatcherServlet이 생성됨

DispatcherServlet 객체는 WEB-INF/config 폴더에 있는 servelt-context.xml 파일을 로딩하여 두번째 스프링 컨테이너를 구동한다.

이 두 번째 스프링 컨테이너가 Controller 객체를 메모리에 생성한다.

DispatcherServlet은 FrontController의 역할을 수행한다.

클라이언트로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할 지 결정한다.

7. DispatcherServlet은 servlet-context.xml을 Loading

↓ web.xml을 보면 DispatcherServlet이 servlet-context.xml을 가리키고 있다.

appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:/conf/spring/appServlet/servlet-context.xml 1

↓ 어노테이션을 스캔하여 bean 객체로 등록함을 볼 수 있다.

8. DispatcherServlet 동작

① 클라이언트가 해당 어플리케이션에 접근하면 접근한 URL 요청을 DispatcherServlet이 가로챔

DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'appServlet' processing POST request for [/project_domain/main]

② RequestMappingHandlerMapping이 해당 요청을 처리할 컨트롤러를 찾음

DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /main

Request Mapping Handler : @Controller("/url") // 어노테이션으로 매핑

BeanNameMapping Handler : // 클래스 이름으로 매핑

③ DefaultListableBeanFactory 가 mainContoller 를 쓰면 된다고 알려줌

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'mainController'

④ RequestResponseBodyMethodProcessor가 servlet-context.xml 에 선언해놓은 MessageConverter을 이용하여 요청 바디(파라미터)를 읽음

DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Reading [java.util.Map] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@11eb521a]

* HttpMessageConverter :

자바 객체와 HTTP 요청/응답 몸체 사이의 변환을 처리

HttpMessageConverter 종류

* 서비스 진입 *

⑤ DataSourceTransactionManager 로 DB 접속

DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:...

DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection...

⑥ 응답결과 받아다 파라미터에 써줌

DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Written...

* DispatcherServlet 다시 등장 *

⑦ 컨트롤러에서 view를 리턴하면 ViewResolver가 먼저 받아 해당 view가 존재하는지 검색

DEBUG org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'appServlet': assuming HandlerAdapter completed request handling

⑧ DispatcherServlet은 ViewResolver를 통해 접두사와 접미사가 붙은 JSP 파일의 이름과 경로를 리턴받아 최종적으로 JSP를 실행.

view에 결과를 보낸 후 DispatcherServlet은 최종 결과를 클라이언트에 전송

DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request

(핸들러 매핑이나 리졸버는 대략적인 흐름만 알고 있다가 context에 등록시키면 됨)

* 참고

from http://workatit.tistory.com/28 by ccl(A) rewrite - 2020-03-21 05:54:24

댓글

이 블로그의 인기 게시물

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

2020 LCK 롤챔스 Spring 경기 재개 및 일정

개발을 시작해봐요! 스프링 부트(Spring Boot ) 게시판 - 게시글 조회...