지금까지는 크게 2파트로 구분되어있습니다.
1. 스프링 컨테이너 초기화 - 생성,설정
2. 서블릿 컨테이너 초기화 - 서블릿 컨테이너 생성 후 DispatcherServlet 등록
스프링부트가 이렇게 구현되어있기 때문입니다.
이제 2파트를 1파트로 만들어 보겠습니다.
즉, 스프링 컨테이너 초기화
가 일어날때 서블릿 컨테이너를 초기화
시켜보겠습니다.
스프링 컨테이너 초기화 작업은 refresh()
메소드에서 일어납니다.
public static void main(String[] args) {
GenericWebApplicationContext applicationContext = new GenericWebApplicationContext(){
@Override
protected void onRefresh() {
super.onRefresh();
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",
new DispatcherServlet(this) // DispatcherServlet이 작업을 위임할 applicationContext를 등록
).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
}; // 스프링 컨테이너 생성
applicationContext.registerBean(HelloController.class); // 메타정보를 넣어 Bean을 생성
applicationContext.registerBean(SimpleHelloService.class);
applicationContext.refresh(); // Bean을 만드는 명령어
}
GenericWebApplicationContext
를 상속하여 익명클래스를 만들고, onRefresh()
메소드를 오버라이드하고,
서블릿 컨테이너를 초기화 하는 코드를 onRefresh()
안으로 넣으면 됩니다.
그 후 DispatcherServlet
에 applicationContext
를 주입하지 않고 this
를 주입하면 끝입니다.
역시 서버가 잘 돌아갑니다!