나는 궁금했다.
톰캣은 언제 해당 프로젝트가 스프링인걸 알아차릴까?
오랫동안 고민한 결과 내 나름대로 분석한 내용을 오늘에서야 정리하려한다.
먼저, 리스너(Listener)라는 개념을 알아야하는데
말그대로 무언가를 듣는 것이다. 그리고 그 무엇인가를 자바에서는 '이벤트'라고 한다.
java.util 패키지에 EventListener 인터페이스가 있는데 이를 모든 Listener객체가 상속하거나 구현한다.
예시로 awt패키지에 MouseListener라던가, 톰캣 내장 패키지의 'JreMemoryLeakPreventionListener'가 있다.
그리고 스프링없이(뻥이다. 있어도 마찬가지로) 톰캣을 돌릴 때에는 톰캣 구동시 ServletContext가 생성이 되는데,
자세한 얘기는
https://java117.tistory.com/18
jsp&servlet:: ServletContext란
ServletContext클래스란? ServletContext클래스는 톰캣 컨테이너 실행 시 각 컨텍스트(웹 애플리케이션)마다 한 개의 ServletContext객체를 생성합니다. 그리고 톰캣 컨테이너가 종료하면 ServletContext객체 역
java117.tistory.com
를 참고하자.
위에서 '이벤트'라는 말을 썻는데, 톰캣의 실행과 종료 또한 이벤트라 할 수 있다.
그리고 그 이벤트에 대한 리스닝을 하는 객체가 'ServletContextListener'인데,
이를 통해 ServletContext의 생성과 소멸을 '리스닝'할 수 가 있다.
톰캣에는 DD(Deployment Descriptor)라 불리는 web.xml 파일 있는데
xml를 통한 스프링 설정방식에서 우리는 web.xml에 다음과 같은 태그를 볼 수 있다.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
public class ContextLoaderListener extends ContextLoader implements ServletContextListener
ContextLoaderListener는 위에서 설명한 ServletContextListener를 구현하는 구현체이다.
따라서 톰캣구동시 이 리스너가 리스닝을 하고, ContextLoader클래스의 initWebApplicationContext메소드를 실행하게 된다. 해당 메소드에는 다음과 같은 로그를 찍어주는데
servletContext.log("Initializing Spring root WebApplicationContext");
Log logger = LogFactory.getLog(ContextLoader.class);
if (logger.isInfoEnabled()) {
logger.info("Root WebApplicationContext: initialization started");
}
참으로 반가운 로그다.
여기서부터 스프링이 시작되는 것이다.(이것도 뻥이다. ContextLoaderListener는 스프링자원이다)
찾아보면서 몇가지 의문이 들었는데
1. 왜 ContextLoaderListener는 ContextLoader의 상속으로 initWebApplicationContext메소드를 호출하는가
(문득 리스너클래스에 필드로 ContextLoader를 두면되지 않을까 하는 생각이 들었다.)
2. DispatcherServlet과 ServletContext, 혹은 ApplicationContext와의 관계는?
3. 자바파일로 설정하는 환경에서는 ContextLoaderListener에 대한 설정은?
4. 스프링부트에서는?
하나하나 낱낱히 파헤쳐 포스팅예정
끝
'스프링' 카테고리의 다른 글
스프링부트 라이브러리 및 view 설정 (0) | 2021.12.25 |
---|---|
스프링부트 프로젝트 생성 및 IDE 설정 (0) | 2021.12.25 |
생성자 주입 (0) | 2021.04.05 |
옵션 처리 (0) | 2021.04.05 |
mybatis-spring:scan과 context:component-scan (0) | 2021.03.01 |