사전지식
POJO
스프링의 특징 중 하나
평범한 옛날 자바 객체
Not POJO = Servlet의 특징
javax.servlet, javax.servlet.http 패키지를 import해야 한다.
Servlet, Generic Servlet, HttpServlet 중 하나를 상속해야 한다.
생명주기에 해당하는 메소드를 재정의(Overriding)한다.
(반드시 Servlet에서 요구하는 규칙에 맞게 클래스를 만들어야 실행됨 doGet, doPost 등)Spring에서는 xml과 같은 설정을 통해 Servlet 사용
Servlet이 복잡해서 시작한 것이 Spring
컨테이너 2 종류
BeanFactory
스프링 설정파일에 등록된 <bean> 객체를 생성하고 관리.
컨테이너가 구동될 때 객체를 생성하는 것이 아니라 클라이언트로부터의 요청에 의해서만 객체를 생성 (Lazy Loading 방식)
-> 일반적인 스프링 프로젝트에서 사용할 일이 없음
ApplicationContext
BeanFactory가 제공하는 <bean> 객체 관리 기능 외에도 트랜잭션 관리나 메시지 기반의 다국어 처리 기능 지원
컨테이너가 구동되는 시점에 <bean>에 등록되어 있는 클래스들을 객체화 하는 즉시로딩(Pre-Loading 방식)
<bean> option에 lazy-init="true"를 써서 클라이언트가 요청하는 시점에 구동할 수도 있음
ApplicationContext의 구현 클래스는 매우 다양하지만, 두 개만 알고 있으면 됨
GenericXmlApplicationContext : 대표적으로 ApplicationContext를 구현한 클래스, 파일 시스템이나 클래스 경로에 있는 xml 설정 파일을 로딩하여 구동하는 컨테이너
XmlWebApplicationContext : 웹 기반의 스프링 애플리케이션을 개발할 때 사용하는 컨테이너 (직접 개발 안하는 컨테이너)
정리 : 스프링 컨테이너는 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]
① 클라이언트가 해당 어플리케이션에 접근하면 접근한 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...
⑤ 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...
⑥ 응답결과 받아다 파라미터에 써줌
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
⑦ 컨트롤러에서 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에 등록시키면 됨)
참고용
'Back-end > Spring' 카테고리의 다른 글
Spring Boot JUnit Test , HttpRequest (0) | 2019.06.13 |
---|---|
스프링 공부 (0) | 2019.06.11 |
Received fatal alert: protocol_version -> [Help 1] 에러해결 (0) | 2019.03.21 |
Mybatis 연동하기 (0) | 2019.03.04 |
Spring Legacy 새 프로젝트 생성하기 (환경설정) (0) | 2019.02.20 |