스프링 컨테이너로 통합하기

Sol's·2023년 5월 24일
0

지금까지는 크게 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()안으로 넣으면 됩니다.
그 후 DispatcherServletapplicationContext를 주입하지 않고 this를 주입하면 끝입니다.

역시 서버가 잘 돌아갑니다!

profile
배우고, 생각하고, 행동해라

0개의 댓글