300===Dev Framework/Spring Boot

톰캣을 활용한 스프링 부트 애플리케이션 배포 완전 정복하기 🚀

블로글러 2025. 3. 21. 00:33

스프링 부트 애플리케이션을 개발하고 나면 실제 환경에 배포해야 할 순간이 오는데요. 이때 가장 많이 사용되는 방법 중 하나가 바로 톰캣(Tomcat)을 활용한 배포입니다. 여러분은 레스토랑에서 요리를 주문했을 때, 요리사가 준비해둔 음식을 서빙하는 웨이터의 역할을 생각해보세요.

  • 요리사는 여러분의 스프링 부트 애플리케이션
  • 웨이터는 톰캣 서버
  • 손님은 최종 사용자

이처럼 톰캣은 개발된 애플리케이션을 사용자에게 효과적으로 전달해주는 중요한 매개체 역할을 합니다.

왜 필요한가?

톰캣을 활용한 스프링 부트 애플리케이션 배포가 해결하는 문제들은 다음과 같습니다:

  1. 서비스 실행 환경: 스프링 부트 애플리케이션이 독립적으로 실행될 수 있는 환경을 제공합니다.
  2. 확장성과 안정성: 다양한 설정을 통해 트래픽 증가에 대응하고 안정적인 서비스를 유지할 수 있습니다.
  3. 자원 관리: 메모리, 스레드 풀 등의 자원을 효율적으로 관리하여 최적의 성능을 발휘할 수 있습니다.

기본 원리

톰캣을 활용한 스프링 부트 애플리케이션 배포의 핵심 원리를 알아볼까요?

내장 톰캣 (Embedded Tomcat)

스프링 부트의 가장 큰 특징 중 하나는 애플리케이션 내부에 톰캣이 포함되어 있다는 점입니다. 이를 '내장 톰캣'이라고 부릅니다.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

위 코드만으로도 내장 톰캣이 실행되며, 별도의 톰캣 설치나 복잡한 설정 없이 애플리케이션을 바로 실행할 수 있습니다.

외장 톰캣 (External Tomcat)

기존에 설치된 톰캣 서버에 WAR 파일 형태로 배포하는 방식입니다. 이를 위해서는 스프링 부트 애플리케이션을 WAR로 패키징하는 설정이 필요합니다.

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

실제 예제

내장 톰캣을 사용한 JAR 배포

Maven의 경우:

<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Gradle의 경우:

plugins {
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

외장 톰캣을 사용한 WAR 배포

Maven의 경우:

<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

Gradle의 경우:

plugins {
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'war'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

실전 활용

다음은 실제 프로젝트에서 어떻게 활용되는지 보여주는 예시입니다:

상황 일반적인 방법 톰캣 활용 방법 개선효과
개발 환경 내장 톰캣 실행 내장 톰캣 + 자동 재시작 개발 생산성 30% 향상
테스트 서버 WAR 배포 후 수동 재시작 JAR 배포 + 서비스 등록 배포 시간 50% 단축
운영 서버 다중 인스턴스 수동 관리 로드 밸런싱 + 자동 확장 고가용성 확보

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 메모리 설정

    • 기본 설정으로는 메모리 부족 문제가 발생할 수 있습니다.
    • JVM 옵션으로 적절한 Heap 메모리를 할당하세요: -Xms512m -Xmx1024m
  2. 포트 충돌

    • 이미 사용 중인 포트와 충돌할 수 있습니다.
    • application.properties에서 포트를 변경하세요: server.port=8090
  3. 컨텍스트 패스 설정

    • 외장 톰캣에 여러 애플리케이션을 배포할 경우, 컨텍스트 패스 설정에 주의해야 합니다.
    • server.servlet.context-path=/myapp

💡 꿀팁

  • 개발 시에는 내장 톰캣을 사용하고, 운영 환경에서는 외장 톰캣을 사용하는 전략이 효과적입니다.
  • DevTools를 활용하면 코드 변경 시 자동으로 서버가 재시작되어 개발 생산성이 향상됩니다.
  • 운영 환경에서는 HTTPS 설정을 반드시 적용하세요.

내장 톰캣 vs 외장 톰캣 비교

내장 톰캣의 장점

  1. 간편한 배포: JAR 파일 하나로 배포 가능
  2. 독립적인 실행: 별도의 WAS 설치 불필요
  3. 마이크로서비스 아키텍처에 적합
  4. 컨테이너화(Docker)가 용이함

외장 톰캣의 장점

  1. 여러 애플리케이션을 하나의 서버에서 관리 가능
  2. 톰캣의 고급 설정을 세밀하게 조정 가능
  3. 애플리케이션과 서버의 독립적인 관리
  4. 기존 인프라와의 호환성 유지

톰캣 서버 최적화 팁

  1. Connection Pool 설정

    server.tomcat.max-threads=200
    server.tomcat.max-connections=10000
    server.tomcat.accept-count=100
  2. GZIP 압축 활성화

    server.compression.enabled=true
    server.compression.min-response-size=2048
    server.compression.mime-types=application/json,application/xml,text/html,text/plain
  3. Session Timeout 설정

    server.servlet.session.timeout=30m

마치며

지금까지 톰캣을 활용한 스프링 부트 애플리케이션 배포에 대해 알아보았습니다. 내장 톰캣과 외장 톰캣 각각의 장단점을 이해하고, 프로젝트 상황에 맞는 배포 전략을 선택하는 것이 중요합니다. 처음에는 어렵게 느껴질 수 있지만, 이 글이 여러분에게 도움이 되었기를 바랍니다!

혹시 궁금한 점이 있으시거나, 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요.

참고 자료 🔖

  • Spring Boot 공식 문서
  • Apache Tomcat 공식 문서
  • Spring Boot 실전 프로젝트

#스프링부트 #톰캣 #애플리케이션배포 #자바웹개발

728x90

'300===Dev Framework > Spring Boot' 카테고리의 다른 글

@Transactional 소개  (0) 2025.02.23
Spring Boot 소개 😋  (0) 2024.05.27