사전지식
POJO > 스프링의 특징 중 하나로 평범한 옛날 자바 객체 Plain Old Java Object
Not POJO = Servlet 특징
- javax.servlet, javax.servlet.http 패키지를 import 해야한다.
- servlet, Generic Servlet, HttpServlet 중 하나를 상속해야 한다.
- 생명주기는 해당하는 메소드를 재정의(Overriding)한다. (반드시 Servelt 에서 요구하는 규칙에 맞게 클래스를 만들어야 실행됨 doGet, doPost 등)
- Spring 에서는 xml 과 같은 설정을 통해 Servlet 사용
- Servlet 이 복잡해서 탄생한 것이 Spring
컨테이너 2 종류
- BeanFactory
- 스프링 설정파일에 등록된 <bean> 객체를 생성하고 관리.
- 컨테이너가 구동될 때 객체를 생성하는 것이 아니라 클라이언트로부터의 요청에 의해서만 객체를 생성 (Lazy Loading 방식)
- -> 일반적인 스프링 프로젝트에서 사용할 일이 없음
- ApplicationContext
- BeanFactory가 제공하는 <bean> 객체 관리 기능 외에도 트랜잭션 관리나 메시지 기반의 다국어 처리 기능 지원
- 컨테이너가 구동되는 시점에 <bean>에 등록되어 있는 클래스들을 객체화 하는 즉시로딩(Pre-Loading 방식)
- ApplicationContext의 구현 클래스는 매우 다양하지만, 두 개만 알고 있으면 됨
- 정리 : 스프링 컨테이너는 bean 저장소에 해당하는 xml 설정파일을 참조하여 bean 생명주기 관리
Spring 실행순서
1. 웹 어플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 Loading
2. web.xml에 등록되어 있는 ContextLoaderListener (Java Class) 생성
3. 생성된 ContextLoaderListener는 root-context.xml을 Loading
4. root-context.xml에 등록되어 있는 Spring Container가 구동
5. 클라이언트로부터 웹 어플리케이션 요청이 옴
6. DispatcherServlet이 생성됨
7. DispatcherServlet은 servlet-context.xml을 Loading
web.xml을 보면 DispatcherServlet이 servlet-context.xml을 가리키고 있다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/conf/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
servlet-context.xml을 보면 어노테이션을 스캔하여 bean 객체로 등록함을 볼 수 있다.
<annotation-driven /> --어노테이션을 사용함을 선언
<mvc:annotation-driven> --
<mvc:message-converters register-defaults="true">
<beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<beans:property name="objectMapper">
<beans:bean class="com.github.miemiedev.mybatis.paginator.jackson2.PageListJsonMapper" />
</beans:property>
</beans:bean>
</mvc:message-converters>
</mvc:annotation-driven>
<context:component-scan base-package="com.company.*" />
-- 베이스 패키지 하위의 모든 어노테이션을 스캔해서 빈으로 등록
8. 구동순서

① 클라이언트가 해당 어플리케이션에 접근하면 접근한 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 : <class-url></class- // 클래스 이름으로 매핑
③ 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<java.lang.String, java.lang.Object>] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@11eb521a]

서비스 진입...
⑤ 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에 등록시키면 됨)
참고용
출처: https://javannspring.tistory.com/231 [JiGyeong's study room]
'Spring Framework' 카테고리의 다른 글
Dependency Injection 이란 (0) | 2022.01.03 |
---|---|
Connection Pool ? (0) | 2021.12.30 |