Tomcat 서버의 애플리케이션 배포는 웹 애플리케이션 운영에서 가장 기본적인 영역이면서도, 실제로는 많은 개발자들이 정확한 동작 원리를 놓치고 있는 부분이다. 최근 고객사 운영 서버의 server.xml 설정을 분석하던 중, <Context> 태그와 <Host>의 appBase 속성이 혼재된 구성에서 WAR 파일 배포 과정에 대한 오해를 발견했다.

기존의 배포 설정

운영 중인 서버의 server.xml 설정:

<Host name="localhost" appBase="/home/manager/eps/webapps"
      unpackWARs="true" autoDeploy="true">

  <Context path="" docBase="/home/manager/eps/webapps/legacy" reloadable="false" />
  <Context path="/v5" docBase="/home/manager/eps/webapps/ui5" reloadable="false" />

  <!-- ... AccessLogValve 설정 ... -->
</Host>

이 설정에서 명시적인 <Context> 배포와 appBase를 통한 자동 배포가 공존하고 있었음.. 그런데 여기서 문제가 발생. 새로운 버전의 ui5.war 파일을 배포하려 할 때, 기존 관리자는 다음과 같은 절차를 따르고 있었다.

  1. 로컬에서 ui5.war 파일의 압축을 수동으로 해제..

  2. 압축 해제된 파일들을 서버의 /home/manager/eps/webapps/ui5 디렉터리에 수동 복사..

  3. Tomcat 서버 재시작

잘못됐다. <Context> 태그를 사용할 때 개발자가 직접 WAR 파일의 압축 푼 결과물을 목적지 경로로 복사하고있었다. (sh script를 통해서..)

Tomcat의 실제 배포 메커니즘 분석

사실을 확인하기 파악하기 위해 Tomcat 배포 메커니즘을 단계별로 추적해보았다.

1. 서버 시작 시 동작 순서

Tomcat 서버가 시작될 때의 동작 순서를 확인한 결과:

# Tomcat 로그에서 확인되는 초기화 순서
INFO [main] org.apache.catalina.startup.HostConfig.deployApps Deploying web application directory [/home/manager/eps/webapps/ui5]
INFO [main] org.apache.catalina.startup.HostConfig.deployApps Deployment of web application directory [/home/manager/eps/webapps/ui5] has finished
INFO [main] org.apache.catalina.startup.HostConfig.deployWARs Deploying web application archive [/home/manager/eps/webapps/shop.war]
INFO [main] org.apache.catalina.startup.HostConfig.deployWARs Deployment of web application archive [/home/manager/eps/webapps/shop.war] has finished

이 로그를 통해 확인할 수 있는 것은 Tomcat이 먼저 appBase 디렉터리를 스캔하여 WAR 파일을 자동으로 압축 해제한 후, <Context> 설정을 처리한다는 점이다.

2. WAR 파일 자동 처리 과정

appBase 디렉터리에 WAR 파일이 배치됐을 때의 실제 동작을 확인해보았다:

# WAR 파일 배치 전
$ ls -la /home/manager/eps/webapps/
total 12
drwxr-xr-x 3 manager manager 4096 Jan 15 10:00 .
drwxr-xr-x 3 manager manager 4096 Jan 15 09:30 ..
drwxr-xr-x 8 manager manager 4096 Jan 15 10:00 legacy

# ui5.war 파일 업로드
$ cp ui5.war /home/manager/eps/webapps/

# Tomcat이 자동으로 처리한 결과
$ ls -la /home/manager/eps/webapps/
total 15240
drwxr-xr-x 4 manager manager     4096 Jan 15 10:01 .
drwxr-xr-x 3 manager manager     4096 Jan 15 09:30 ..
drwxr-xr-x 8 manager manager     4096 Jan 15 10:00 legacy
drwxr-xr-x 6 manager manager     4096 Jan 15 10:01 ui5
-rw-r--r-- 1 manager manager 15595520 Jan 15 10:01 ui5.war

확인 완료. Tomcat이 ui5.war 파일을 감지하자마자 자동으로 ui5 디렉터리를 생성하고 압축을 해제함. 수동 작업이 전혀 필요하지 않았다.

배포 방식 간 우선순위와 경로 매핑

실제 요청 처리 과정을 통해 두 배포 방식의 상호작용을 확인했다.

우선순위 테스트

다음과 같은 상황에서 요청 처리 방식을 테스트했다:

<Context path="/v5" docBase="/home/manager/eps/webapps/ui5" />

동시에 appBase에 v5.war 파일도 존재하는 상황에서

# 요청 테스트
$ curl -I http://localhost:8080/v5/

# 결과: Context로 지정된 ui5 디렉터리에서 응답
# appBase의 v5.war는 완전히 무시됨

Tomcat 로그를 통해 확인한 결과, <Context> 태그로 명시된 매핑이 절대적 우선순위를 가지며, appBase의 동일한 이름의 WAR 파일은 아예 처리되지 않는다는 것을 확인했다.

동적 배포 동작 확인

<Context>에 정의되지 않은 새로운 애플리케이션의 동적 배포 과정:

# shop.war 파일 배치
$ cp shop.war /home/manager/eps/webapps/

# 실시간 로그 확인
$ tail -f /opt/tomcat/logs/catalina.out
INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/home/manager/eps/webapps/shop.war]
INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/home/manager/eps/webapps/shop.war] has finished in [1,234] ms

# 자동 생성된 디렉터리 확인
$ ls -la /home/manager/eps/webapps/shop/
total 28
drwxr-xr-x 5 manager manager 4096 Jan 15 10:05 .
drwxr-xr-x 5 manager manager 4096 Jan 15 10:05 ..
drwxr-xr-x 3 manager manager 4096 Jan 15 10:05 META-INF
drwxr-xr-x 2 manager manager 4096 Jan 15 10:05 WEB-INF
-rw-r--r-- 1 manager manager  150 Jan 15 10:05 index.html

Tomcat이 WAR 파일을 감지하고 자동으로 압축 해제하여 서비스를 시작하는 전 과정이 거의 1~2초 내에 완료됐다.

올바른 배포 프로세스

분석 결과를 바탕으로 두 배포 방식의 올바른 사용법을 정리했다.

Context 기반 배포의 실제 절차

기존 잘못된 절차

# 잘못된 방법 (수동 압축 해제)
unzip ui5.war -d /tmp/ui5_temp
cp -r /tmp/ui5_temp/* /home/manager/eps/webapps/ui5/
systemctl restart tomcat

올바른 절차

# 올바른 방법 (Tomcat 자동 처리 활용)
cp ui5.war /home/manager/eps/webapps/
# Tomcat이 자동으로 ui5 디렉터리 생성 및 압축 해제
# Context 설정이 해당 디렉터리를 참조

배포 방식별 특성 비교

실제 운영 환경에서 확인한 각 방식의 특성:

구분appBase 자동 배포Context 명시적 배포
배포 대상Context에 정의되지 않은 모든 경로server.xml에 명시된 고정 경로
경로 결정WAR 파일명 기반 (shop.war → /shop)path 속성으로 임의 지정 가능
재시작 필요성불필요 (Hot Deploy)경우에 따라 필요
운영 편의성매우 높음중간 (설정 관리 필요)
서비스 안정성중간높음 (명시적 제어)

적용 결과 & 운영 개선

고객사의 다양한 서비스 모듈에 대한 신규 젠킨스 파이프라인 구축 작업 간 위와 같은 개선사항을 확인하게 되었다. 사실 현실은 더 처참한 방식으로 배포되고있는 모듈도 있었다.. 결과적으로 배포 프로세스 수정 후 다음과 같은 개선 효과를 확인했다.

배포 시간 단축

  • 기존 수동 방식: 약 5-10분 ⇒ 개선된 방식: 약 30초

운영 오류 제거

  • 수동 압축 해제 과정에서 발생하던 파일 권한 문제 해결

  • 배포 과정의 휴먼 에러 요소 최소화