스프링 부트 스타터는 많은 연관된 라이브러리들을 세팅해 준다.
이중 spring boot starter web 라이브러리에 내장 톰캣 관련 라이브러리가 있다.
해당 내용 라이브러리의 코드들 중 메인 메서드가 실행될 때 톰캣을 세팅하는 코드를 구현해 보았다.
Config 코드
@Configuration
public class HelloConfig {
@Bean
public HelloController helloController() {
return new HelloController();
}
}
Main클래스
public class EmbedTomcatSpringMain {
public static void main(String[] args) throws LifecycleException {
System.out.println("EmbedTomcatSpringMain.main");
//톰캣 설정
Tomcat tomcat = new Tomcat();
Connector connector = new Connector();
connector.setPort(8080);
tomcat.setConnector(connector);
//스프링 컨테이너 설정
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
appContext.register(HelloConfig.class);
//디스패쳐 서블릿 생성 및 스프링 컨테이너 세팅
DispatcherServlet dispatcherServlet = new DispatcherServlet(appContext);
Context context = tomcat.addContext("", "/");
// 톰캣 실행을 위한 파일을 만드는 코드 시작
File docBaseFile = new File(context.getDocBase());
if (!docBaseFile.isAbsolute()) {
docBaseFile = new File(((org.apache.catalina.Host) context.getParent()).getAppBaseFile(), docBaseFile.getPath());
}
docBaseFile.mkdirs();
// 파일 생성 코드 끝
// 디스패처을 톰캣에 서블릿 등록
tomcat.addServlet("", "dispatcher", dispatcherServlet);
context.addServletMappingDecoded("/", "dispatcher");
tomcat.start();
}
}
위 코드는 메인클래스에서 톰캣과 애플리케이션 컨테이너 서블릿을 초기화하는 코드이다.
스프링 부트가 초기화 하는 방식의 일부분이다. 톰캣 컨테이너 서블릿의 초기화만 구현했다.
스프링 부트의 형식으로 수정 (어노테이션 방식)
1. 초기화 하는 코드
위에 작성한 초기화 코드와 일치한다.
다른 부분이 있다면 스프링 부트의 AutoConfig 방식을 사용하기 위해 인자값으로 Class 정보를 받아와 동적으로 컨테이너에 세팅하는 부분이 약간 다르다.
public class MySpringApplication {
public static void run(Class configClass, String[] args) {
System.out.println("MySpringApplication.run args = "+ List.of(args));
Tomcat tomcat = new Tomcat();
Connector connector = new Connector();
connector.setPort(8080);
tomcat.setConnector(connector);
AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
//인자로 받아온 config 클래스를 동적으로 세팅함.
appContext.register(configClass);
DispatcherServlet dispatcherServlet = new DispatcherServlet(appContext);
Context context = tomcat.addContext("", "/");
File docBaseFile = new File(context.getDocBase());
if (!docBaseFile.isAbsolute()) {
docBaseFile = new File(((org.apache.catalina.Host) context.getParent()).getAppBaseFile(), docBaseFile.getPath());
}
docBaseFile.mkdirs();
tomcat.addServlet("", "dispatcher", dispatcherServlet);
context.addServletMappingDecoded("/", "dispatcher");
try {
tomcat.start();
} catch (LifecycleException e) {
throw new RuntimeException(e);
}
}
}
2. 어노테이션
@SpringBootApplication과 비슷한 구조로 만들었다.
AutoConfig 기능을 사용하기 위해 ComponentScan을 사용하였다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ComponentScan
public @interface MySpringBootApplication {
}
3. 메인클래스에서 사용
어노테이션을 통해 스캔해 온 component의 설정값을 MySpringApplication의 run 메서드에 전달한다.
@MySpringBootApplication
public class MySpringBootMain {
public static void main(String[] args) {
System.out.println("MySpringBootMain.main");
MySpringApplication.run(MySpringBootMain.class, args);
}
}
웹서버 확인
'Spring' 카테고리의 다른 글
커스텀 익셉션 적용 (0) | 2024.04.28 |
---|---|
Spring boot 의 외부 설정 (1) | 2024.04.27 |
서블릿 컨테이너, 애플리케이션 초기화 (1) | 2024.04.20 |
공공데이터 Springboot로 파싱 (0) | 2024.04.13 |
Security CORS 설정 (0) | 2024.03.17 |