ServletFactory, DispatcherServlet도 스프링 컨테이너에 등록

Sol's·2023년 5월 25일
0

토비의 스프링 부트

목록 보기
10/31

ServletFactory(톰캣)와 DispatcherServlet스프링 컨테이너에 등록하여 사용해보겠습니다.
이렇게 하면 나중에 유연한 구성이 가능해 집니다.
팩토리 메소드를 사용할 것입니다.

ServletFactory, DispatcherServlet도 스프링 컨테이너에 등록

주석에도 설명했듯이 스프링 컨테이너가이 알아서 DispatcherServlet이 이용해야할
컨트롤러를 찾기위한 ApplicationContext를 주입해 줍니다

 	@Bean
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }
    @Bean
    public DispatcherServlet dispatcherServlet(){
        // DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
        // 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
        return new DispatcherServlet();
    }
  • 전체코드
@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
@ComponentScan
public class HellobootApplication {
    @Bean
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }
    @Bean
    public DispatcherServlet dispatcherServlet(){
        // DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
        // 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
        return new DispatcherServlet();
    }

    public static void main(String[] args) {
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(){
            @Override
            protected void onRefresh() {
                super.onRefresh();
                // 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
                ServletWebServerFactory serverFactory = this.getBean(ServletWebServerFactory.class);
                DispatcherServlet dispatcherServlet = this.getBean(DispatcherServlet.class);

                // serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
                // 따라서 webServer 가 서블릿 컨테이너 입니다.
                WebServer webServer = serverFactory.getWebServer(servletContext -> {
                    servletContext.addServlet("dispatcherServlet",dispatcherServlet

                    ).addMapping("/*"); // 모든 요청을 다 받는다.
                });
                webServer.start();
            }
        }; // 스프링 컨테이너 생성
        applicationContext.register(HellobootApplication.class);
        applicationContext.refresh(); // Bean을 만드는 명령어
    }

}

어떻게 스프링 컨테이너가 DispatcherServlet에게 ApplicationContext를 주입해 주었을까??
그것은 Bean의 생명주기 메소드를 잘 알아야 합니다.

Bean의 생명주기 메소드는 추후에 더 공부하는걸로 해보겠습니다...
스프링 너무 어렵다...😂

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

0개의 댓글