본문 바로가기
Tomcat

[Tomcat] Tomcat 실행 흐름 (feat.setenv.bat 파일)

by dbs_ 2025. 7. 4.

 

 

나는 무조건 CATALINA_HOME, JAVA_HOME 등의 환경변수를 catalina.bat 안에 작성해야 한다고 생각했다. 그런데 톰캣 내부 구조를 보다 보니, 생각보다 몰랐던 내용들이 많이 있었다.

이번 글에서는 Tomcat의 startup.bat부터 catalina.bat, 그리고 setenv.bat까지의 톰캣 실행 흐름을 정리해 보겠다. 우선, 흐름부터.

 

Tomcat 실행 흐름

  • ./startup.bat을 입력하면 아래처럼 진행된다.
  1. startup.bat 실행
  2. 내부에서 catalina.bat start 호출
  3. catalina.bat는 다양한 환경 설정을 로드함.
    • setenv.bat (존재하는 경우)
    • catalina.base / catalina.home 환경 변수 설정
    • java 명령어를 이용해 org.apache.catalina.startup.Bootstrap Java 클래스를 실행
  • 결국 JVM 안에서 org.apache.catalina.startup.Bootstrap → org.apache.catalina.startup.Catalina → 실제 서버가 기동 됨

 

startup.bat

  • 톰캣을 시작하는 배치파일로, 실제로는 catalina.bat start를 호출하는 wrapper
  1. CATALINA_HOME이 설정 안 되어 있으면 현재 디렉토리 또는 상위 디렉토리에 있는 bin\catalina.bat을 찾아서 CATALINA_HOME을 설정한다.
# startup.bat

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

# CATALINA_HOME이 설정 안 되어 있으면 현재 디렉토리 또는 상위 디렉토리에 있는 bin\catalina.bat을 찾아서 CATALINA_HOME을 설정합니다.

 

2. catalina.bat start 하는 부분이 맨 마지막줄에 있다.

set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec

rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

:end

 

  • 결론적으로 startup.bat 파일은 아래와 같은 기능을 수행한다.
    1. CATALINA_HOME 추측 및 설정
    2. catalina.bat이 있는지 확인
    3. 추가 커맨드라인 인자 정리
    4. catalina.bat start 실행

 

catalina.bat

  • Tomcat의 핵심 실행 스크립트이며, startup.bat이나 shutdown.bat 같은 wrapper들이 결국 이 스크립트를 호출하게 되어 있다.
  1. setenv.bat 파일 안에서 환경변수 설정하도록 한다.
    • 사용자 커스텀 JVM 옵션이나 환경 변수 설정을 분리해 두는 파일
    • Tomcat 기본 배포본에는 존재하지 않음 (필요시 직접 생성하는 거!)
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
:setenvDone

 

2. 서버가 기동 되는 명령어가 포함되어 있다.

:execCmd
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs

rem Execute Java with the applicable properties
if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %CATALINA_LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

# 맨마지막 줄 의미 : 
# java -Dxxx -classpath bootstrap.jar org.apache.catalina.startup.Bootstrap start
# 즉 여기가 JVM을 실행해서 Tomcat을 진짜 띄우는 부분
# 그 후에 Bootstrap.init() 해서 catalina 인스턴스 생성되고 load, start 되는 순서.

 

  • 결론적으로 catalina.bat 파일의 역할
    1. 환경 변수 확인 및 설정 (CATALINA_HOME, JAVA_HOME 등)
    2. setenv.bat, setclasspath.bat 불러오기
    3. 클래스패스(CLASS_PATH) 설정
    4. 실행 모드 파악 (run, start, debug, stop 등)
    5. Java 명령어 구성
    6. org.apache.catalina.startup.Bootstrap 실행 (톰캣 부팅용 핵심 클래스)

 

잠깐! 여기서 setenv.bat 이란

  • setenv.bat 파일 사용
    • 커스터마이징 설정은 catalina.sh가 아닌, setenv.sh 파일에 따로 작성하라는 tomcat의 공식적인 권장 방식.
    • 왜냐하면 catalina.sh 안에는 여러 설정이 있어서, 임의로 수정했다가 코드가 꼬일 수도 있기 때문.
  • catalina.sh 내에 직접 환경 변수 설정 ❌ (비권장)
    • 유지보수에 불리함
    • Tomcat 버전 업데이트 시 덮어씌워질 수 있음
    • 다중 인스턴스 운영에 불편

 

setenv.bat 파일 예시

  • setenv.bat은 톰캣 배포본에는 기본 포함되지 않으므로 직접 만들어야 한다. 또한 반드시 CATALINA_HOME/bin 또는 CATALINA_BASE/bin에 위치해야 인식된다. 그럼 catalina.sh가 실행될 때 알아서 setenv.sh를 끌고 간다.
# JAVA_HOME 설정
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_321

# JVM 메모리 설정
set CATALINA_OPTS=-Xms1024m -Xmx2048m -XX:+UseG1GC

# 로깅 관련 설정
set CATALINA_LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

# JMX 리모트 관리 설정
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.port=9010
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.ssl=false

# 디버깅 (JPDA) 설정
set JPDA_ADDRESS=8000
set JPDA_TRANSPORT=dt_socket
set JPDA_SUSPEND=n

# 사용자 정의 시스템 속성
set CATALINA_OPTS=%CATALINA_OPTS% -Denv.name=dev -Dconfig.path=C:/config/app.properties