dev

Spring Boot ) 외장 톰캣 Spring 로고 로그가 안 뜰 때

킴소얌 2025. 1. 30. 19:51

Spring Boot는 기본적으로 Tomcat을 내장 서버로 제공합니다.

로컬에서 개발 완료 후, VM 서버의 외장 톰캣에 배포할 때 스프링 로고가 뜨지 않는 이슈가 발생했습니다.

 

🔨 해결방법은 간단합니다.

- ServletInitializer 클래스 추가

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MainApplication이름.class);
    }

}

 

Spring Boot에서 ServletInitializer는 특정 조건에서만 필요하며, 모든 Spring Boot 애플리케이션에 필수적인 것은 아닙니다.

 

1. ServletInitializer의 역할 

ServletInitializer는 Spring Boot 애플리케이션이 서블릿 컨테이너(WAR 배포 파일로 실행되는 환경)에서 작동하도록 설정하는 데 사용됩니다. 기본적으로 이 클래스는 SpringBootServletInitializer를 확장하여 애플리케이션의 초기화를 담당합니다.

 

• configure() 메서드는 서블릿 컨테이너에서 애플리케이션의 진입점을 설정합니다.
• 이 클래스는 WAR 파일 배포 시 필요합니다.

2. ServletInitializer가 필요한 경우

  • WAR 파일로 배포하려는 경우:
    • Spring Boot 애플리케이션을 내장 톰캣이 아닌 외부 톰캣, WebLogic, WildFly 같은 서블릿 컨테이너에 배포하려면 ServletInitializer가 필요합니다.
    • 이 경우 spring-boot-starter-tomcat의 내장 톰캣 기능이 비활성화되며, 서블릿 컨테이너의 톰캣이 대신 사용됩니다.
  •  JAR 대신 WAR로 빌드:
    • pom.xml 또는 build.gradle에서 패키징을 WAR로 설정한 경우, ServletInitializer가 필요합니다.

3. ServletInitializer가 필요 없는 경우

  • Spring Boot 기본 설정(JAR 파일로 실행):
    • 대부분의 Spring Boot 애플리케이션은 독립 실행형으로, 내장 톰캣을 사용해 실행됩니다. 이 경우 ServletInitializer는 필요하지 않습니다.
    • 기본적으로 @SpringBootApplication 애노테이션이 있는 클래스에서 SpringApplication.run() 메서드로 초기화합니다:

4. ServletInitializer 없이 WAR 배포가 가능한가?
• ServletInitializer 없이 WAR 배포는 불가능합니다.
• WAR 배포 시 Spring Boot는 서블릿 컨테이너와 통합될 초기화 로직이 필요하며, 이를 ServletInitializer에서 제공합니다.

5.  요약

필수적인 경우 필요 없는 경우
WAR 파일 배포 시 기본적으로 JAR 파일로 실행하는 독립 실행형 Spring Boot 애플리케이션
외부 서블릿 컨테이너(예: Tomcat, WebLogic, WildFly) 사용 시  


결론: JAR 파일로 독립 실행하려면 ServletInitializer는 필요 없습니다. 

그러나 WAR로 외부 컨테이너에 배포할 경우에는 반드시 구현해야 합니다.

 

- 스프링 로고 출력 완료 ✌🏻