Embedded Tomcat 내장 톰캣
Spring Boot 에서 제공하는 Embedded Tomcat 은
웹 애플리케이션을 실행하기 위해 별도의 외부 톰캣을 설치하지 않고
애플리케이션 자체적으로 톰캣을 포함하여 실행할 수 있도록 해주는 기능이다
Tomcat 개념은 여기 정리 https://helloahram.tistory.com/213
일반적으로는 웹 애플리케이션을 배포할 때 WAR 파일을 만들어 외부 톰캣 서버에 배포하는 방식이 많았는데
Spring Boot 에서 JAR 파일 형태로 패키징하면서 웹 서버 (톰캣) 을 포함할 수 있다
🐣 스프링 부트 애플리케이션을 실행하면 톰캣도 함께 실행된다 🐣
Embedded Tomcat 기본 설정
Spring Boot 에 기본적으로 포함되어 있으며, build.gradle 에 dependencies 를 추가한다
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
내장 톰캣을 제거하고 다른 WAS (NGINX, 외부 톰캣) 에서 실행하고 싶은 경우
spring-boot-starter-tomcat 을 제외하면 된다
dependencies {
implementation ('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
}
Embedded Tomcat 설정 변경
application.properties 에서 내장 톰캣의 설정을 변경할 수 있다
-. Port 변경
server.port=8989 # 8080 에서 8989 로 변경
-. 최대 스레드 개수 조정
server.tomcat.threads.max=300 # 기본값은 200, 필요에 따라 조정
-. 애플리케이션 기본 경로 변경
server.servlet.context-path=/myapp # 기본 "/"에서 "/myapp"으로 변경
Embedded Tomcat 장점
1. 배포가 간단하다
JAR 파일 하나로 실행할 수 있어서 운영 환경에서도 쉽게 배포가 가능하다
별도의 WAS (웹 애플리케이션 서버) 설치가 필요하지 않다
2. 빠른 개발이 가능하다
톰캣을 따로 설정할 필요 없이 애플리케이션만 실행하면 바로 웹 서버도 실행된다
(java -jar myapp.jar 명령어 하나로 애플리케이션과 내장 톰캣이 함께 실행)
3. 컨테이너 환경에 적합하다
Docker 같은 컨테이너 환경에서 실행할 때 JAR 단독 실행이 가능하다
K8s 같은 오케스트레이션 환경에서도 쉽게 배포가 가능하다
4. 설정이 간편하다
application.properties or application.yml 에서 간단하게 설정을 변경할 수 있다
XML 설정 없이 YAML/ Properties 기반으로 직관적으로 설정 가능하다
Embedded Tomcat 실행 과정
1. SpringApplication.run() 호출
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
springApplication.run() 이 호출되면서 스프링 컨텍스트 (ApplicationContext) 가 생성되고
내장 톰캣도 이 과정에서 자동으로 실행된다
2. Spring Boot 가 Tomcat 서블릿 컨테이너 생성
SpringApplication.run() 내부에서 Spring Boot 가
웹 환경 (WebApplicationType.SERVLET) 인지 확인하고 Tomcat 서블릿 컨테이너를 생성한다
🐣 SpringBoot 내부에서 WebApplicationType 을 감지해서 톰캣을 사용할지 결정한다 🐣
TomcatServletWebServerFactory 클래스를 이용하여 내장 톰캣을 설정하고 실행할 준비를 한다
3. Tomcat 웹 서버 초기화 및 설정 로드
TomcatServletWebServerFactory 가 내장 톰캣의 기본 설정을 로드한다
(application.properties 에서 설정하는 server.port, server.tomcat.threads.max 등)
4. DispatcherServlet 등록 및 실행
Spring Boot 는 내부적으로 Spring MVC 의 DispatcherServlet 을 내장 톰캣에 자동으로 등록한다
ServletRegistrationBean 을 이용하여 서블릿이 등록되고, 요청을 처리할 준비를 한다
내부적으로 DispatcherServletAutoConfiguration 클래스가 DispatcherServlet을 자동 설정한다
5. 내장 톰캣 시작 및 요청 대기
모든 설정이 끝나면 Tomcat.start() 가 호출되면서 내장 톰캣이 실행된다
애플리케이션이 실행되고 클라이언트 요청을 받을 수 있다
Embedded Tomcat 실행 흐름
Spring Boot 내부적으로 SpringApplication.run() 실행 시 아래 코드가 동작한다
SpringApplication.run(MyApplication.class, args);
내부적으로 SpringApplication 이 실행된다
public ConfigurableApplicationContext run(String... args) {
// 1. Spring 컨텍스트 생성
ConfigurableApplicationContext context = createApplicationContext();
// 2. Web 서버 설정 (Tomcat 포함)
prepareWebServer(context);
// 3. ApplicationContext 초기화 및 빈(Bean) 등록
refreshContext(context);
// 4. Tomcat 실행
context.start();
return context;
}
prepareWebServer(context) 내부에서 내장 톰캣이 생성된다
🐣 getWebServer() 메서드가 톰캣을 인스턴스화하고 실행하는 핵심 로직이다 🐣
private void prepareWebServer(ConfigurableApplicationContext context) {
// 내장 톰캣 설정을 위한 Bean 가져오기
TomcatServletWebServerFactory tomcatFactory =
context.getBean(TomcatServletWebServerFactory.class);
// 내장 톰캣 인스턴스 생성 및 포트 설정
Tomcat tomcat = tomcatFactory.getWebServer();
// 내장 톰캣 실행
tomcat.start();
}