Programming/Spring Boot

스프링 부트 내장 톰캣 제거 방법 (exclude embedded tomcat)

Jan92 2024. 2. 6. 23:15

Spring Boot 내장 톰캣 제거 방법 (exclude embedded tomcat)

spring boot embedded tomcat

'spring-boot-starter-web' 의존성에는 기본적으로 톰캣 라이브러리가 내장되어 있으며, 애플리케이션 실행 시 내장 서블릿 컨테이너인 톰캣(tomcat)이 자동으로 설정되어 동작합니다.

하지만 스프링 부트 프로젝트를 외부 WAS에서 동작해야 하는 경우나, 내장 서블릿 컨테이너를 톰캣이 아니나 다른 것으로 사용하고 싶은 경우, 배치 프로세스나 백그라운드 작업처럼 웹 서버가 필요하지 않은 경우 Spring Boot 내장 톰캣을 제거해야 할 수 있는데요.

 

아래 내용은 'Spring Boot 프로젝트에서 내장 톰캣을 제거하는 방법 및 내장 서블릿 컨테이너를 톰캣이 아닌 다른 것으로 바꾸는 방법'을 정리하였습니다.

(추가로 스프링 부트에서 내장 톰캣이 실행되는 과정도 궁금하여 관련 내용까지 정리하여 포스팅 맨 하단에 참고 자료로 링크해 두었습니다.)

 


1. 톰캣 의존성 제거 방법

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 톰캣 제거 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

(maven - pom.xml)

 

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web') {
	      //톰캣 제거
        exclude module: 'spring-boot-starter-tomcat'
   }
}

(gradle - build.gradle)

 

maven 또는 gradle에서 'spring-boot-starter-web' 의존성에 대해 다음과 같이 'spring-boot-starter-tomcat'을 제거하면 spring-boot-starter-web 하위의 톰캣 라이브러리가 사라지는 것을 확인할 수 있습니다.

 

만약 위 과정을 통해 톰캣 관련 라이브러리가 제거되지 않는 경우 tomcat을 가지고 있는 다른 라이브러리가 있을 수 있으며, 해당 라이브러리에 대해 톰캣을 제거하는 코드를 동일하게 추가해주어야 합니다.

 

 


2. properties 웹 서버 설정 비활성화

spring:
  main:
    web-application-type: none

(properties.yml)

 

의존성을 제거하지 않고 application.yml (또는 application.properties) 파일의 'spring.main.web-application-type' 설정 값을 'none'으로 지정하여 웹 서버 설정을 비활성화할 수도 있습니다.

 

 


3. 내장 서블릿 컨테이너 변경

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 톰캣 제거 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 언더토우 추가 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

(maven - pom.xml)

 

implementation("org.springframework.boot:spring-boot-starter-web") {
    // 톰캣 제거
    exclude module: "spring-boot-starter-tomcat"
}

// 언더토우 추가
implementation("org.springframework.boot:spring-boot-starter-undertow")

(gradle - build.gradle)

 

다음으로는 내장 서블릿 컨테이너를 변경하는 방법입니다. 예시 코드에서는 undertow로 변경하였습니다.

 

내장 서블릿 컨테이너를 톰캣이 아닌 다른 것으로 변경하고 싶은 경우 '1. 톰캣 의존성 제거 방법' 상태에서 변경할 서블릿 컨테이너 라이브러리를 추가해 주면 Spring Boot에서 자동으로 해당 서블릿 컨테이너를 찾아 실행시켜 줍니다.

 

 


+ 외부 WAS에 war 형태로 배포해야 하는 경우

@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class);
    }
}

(extends SpringBootServletInitializer)

 

추가로 외부 WAS에 war 형태로 스프링 부트 프로젝트를 배포해야 하는 경우에는 다음 코드와 같이 'SpringBootServletInitializer' 추상 클래스를 상속받고 'configure()' 메서드를 오버라이딩하여 실행시키는 과정이 필요합니다.

 

해당 작업이 추가되는 이유는 간단하게 외부 WAS 환경에서 Spring Boot 애플리케이션이 동작할 수 있도록 애플리케이션 컨텍스트를 구성하기 위함인데요.

관련 내용은 잘 정리된 글이 있어 아래 참고 자료로 링크해 두었습니다.

 

 

 

 

< SpringBootServletInitializer 상속 이유 >

https://medium.com/@SlackBeck/spring-boot-웹-애플리케이션을-war로-배포할-때-왜-springbootservletinitializer를-상속해야-하는걸까-a07b6fdfbbde

 

< 내장 톰캣 제거 Spring 공식 문서 >

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.webserver

 

< Spring Boot 내장 톰캣 실행 과정 >

2024.02.06 - [Programming/Spring Boot] - 스프링부트 내장 톰캣(서블릿 컨테이너) 실행되는 과정