이제 메인메서드를 정리해 보겠습니다.
최대한 스프링부트와 비슷하게 만들어 보겠습니다.
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
이 아닌 스프링부트에서 제공하는 SpringApplication
의 run
메서드를 사용하겠습니다!
스프링이 이미 너무 완벽하게 run메서드를구현했기 때문입니다
public static void main(String[] args) {
SpringApplication.run(HellobootApplication.class, args);
}
이제 어느정도 스프링부트가 어떻게 만들어지고 동작하는지 알것같습니다!
하지만 더 공부할게 많이남았으니 더 열심히 공부해보겠습니다