TIL

Embedded Tomcat 내장 톰캣

아람2 2025. 2. 12. 17:46
반응형

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();
}

 

반응형

'TIL' 카테고리의 다른 글

Playwright 작성해보기 w/ Python  (0) 2025.02.18
Servlet 서블릿  (1) 2025.02.13
Tomcat  (0) 2025.02.08
Java Application 실행 환경 구축  (1) 2025.02.07
트랜잭션 Transaction  (0) 2025.02.06