SpringBootApplication

Sol's·2023년 5월 25일
0

토비의 스프링 부트

목록 보기
11/31

이제 메인메서드를 정리해 보겠습니다.
최대한 스프링부트와 비슷하게 만들어 보겠습니다.

서블릿 컨테이너와 스프링 컨테이너 생성하는 메서드 추출하기

Main 메소드에서 기능을 추출하여 메소드로 뽑아냈습니다.
메소드를 재사용하기위해 클래스명과 args를 파라미터로 넘기고 run()에서는
Class<?> applicationClass, String[] args으로 받았습니다.
그 후 받은 매개변수를 스프링 컨테이너를 만드는데 사용하였습니다.
applicationContext.register(applicationClass)

public static void main(String[] args) {
        run(HellobootApplication.class, args);
    }

    private static void run(Class<?> applicationClass, 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(applicationClass);
        applicationContext.refresh(); // Bean을 만드는 명령어
    }

메인 메서드가 깔끔해졌습니다.
이제 run()을 따로 클래스로 만들어 뺴주면 됩니다.

@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) {
        MySpringApplication.run(HellobootApplication.class, args);
    }
}

메인메서드 너무 깔끔해졌습니다.
마치 처음 스프링부트를 빌드하면 처음보는 메인메서드와 흡사합니다.

역시 정상작동합니다!
이제 MySpringApplication이 아닌 스프링부트에서 제공하는 SpringApplicationrun메서드를 사용하겠습니다!
스프링이 이미 너무 완벽하게 run메서드를구현했기 때문입니다

   	public static void main(String[] args) {
        SpringApplication.run(HellobootApplication.class, args);
    }

이제 어느정도 스프링부트가 어떻게 만들어지고 동작하는지 알것같습니다!

하지만 더 공부할게 많이남았으니 더 열심히 공부해보겠습니다

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

0개의 댓글