아파치 톰캣
1. 개요
1. 개요
아파치 톰캣은 아파치 소프트웨어 재단에서 개발한 오픈소스 자바 서블릿 컨테이너이자 웹 애플리케이션 서버이다. 1999년 제임스 던칸 데이비슨에 의해 처음 발표되었으며, 자바로 작성되어 아파치 라이선스 2.0 하에 배포된다. 톰캣은 자바서버 페이지(JSP)와 자바 서블릿 표준을 구현하여, 자바 EE 및 자카르타 EE 플랫폼의 웹 애플리케이션을 실행하는 핵심 런타임 환경을 제공한다.
기본적으로 HTTP 서버 기능을 내장하고 있어 독립 실행형 웹 서버로 사용할 수 있지만, 주로 아파치 HTTP 서버나 엔진엑스(Nginx)와 같은 고성능 웹 서버와 연동하여 운영된다. 이는 정적 콘텐츠 처리는 전용 웹 서버가 담당하고, 동적 자바 애플리케이션 처리는 톰캣이 담당하는 효율적인 구성이 가능하게 한다.
톰캣의 주요 구성 요소로는 서블릿 사양을 구현한 서블릿 컨테이너(Catalina), JSP를 처리하는 JSP 엔진(Jasper), 그리고 내장 HTTP 커넥터(Coyote)가 있다. 또한 웹 기반의 관리 도구를 제공하여 애플리케이션 배포와 서버 설정을 용이하게 한다.
이 소프트웨어는 경량화되고 표준에 충실한 설계로 인해 개발 및 테스트 환경에서 널리 사용될 뿐만 아니라, 많은 상용 애플리케이션 서버의 내부 서블릿 엔진 기반으로도 채택되고 있다.
2. 역사
2. 역사
아파치 톰캣의 역사는 1998년경으로 거슬러 올라간다. 당시 자바 서블릿과 자바서버 페이지 기술의 참조 구현체가 필요했던 썬 마이크로시스템즈의 엔지니어 제임스 던칸 데이비슨이 초기 버전을 개발했다. 이 소프트웨어는 오픈 소스로 공개되었고, 곧 아파치 소프트웨어 재단의 자카르타 프로젝트의 핵심 구성 요소가 되었다. 톰캣이라는 이름은 데이비슨이 좋아했던 책 '톰 소여의 모험'에 등장하는 고양이에서 유래했다.
1999년에 첫 공식 릴리스가 이루어졌으며, 이는 자바 서블릿 2.1과 자바서버 페이지 1.0 사양을 구현한 것이었다. 초기에는 단순한 서블릿 컨테이너였지만, 빠르게 자바 웹 애플리케이션 개발의 사실상의 표준 런타임 환경으로 자리 잡았다. 2001년에는 아파치의 최상위 프로젝트로 승격되어 독립적으로 발전하기 시작했다.
시간이 지남에 따라 톰캣은 지속적으로 새로운 자바 기술 사양을 지원하도록 발전해왔다. 주요 버전 업데이트를 통해 서블릿, 자바서버 페이지, 자바 통합 표현 언어, 웹소켓 등의 최신 표준을 구현하며 현대적 웹 애플리케이션의 요구 사항을 충족시켰다. 또한 성능, 보안, 관리 기능이 꾸준히 향상되었다.
오늘날 아파치 톰캣은 가볍고 유연한 특성 덕분에 수많은 엔터프라이즈급 애플리케이션과 함께 널리 사용되는 오픈 소스 자바 애플리케이션 서버이다. 개발부터 프로덕션 환경에 이르기까지 자바 기반 웹 개발의 초석 역할을 하고 있다.
3. 특징 및 구성 요소
3. 특징 및 구성 요소
3.1. 서블릿 컨테이너
3.1. 서블릿 컨테이너
서블릿 컨테이너는 아파치 톰캣의 핵심 구성 요소이다. 이는 자바 서블릿과 자바서버 페이지 사양을 구현하는 런타임 환경을 제공하는 역할을 한다. 웹 애플리케이션 서버의 일부로서, 서블릿 컨테이너는 클라이언트의 요청을 받아 해당하는 서블릿을 실행하고, 그 결과를 다시 클라이언트에게 응답으로 전송하는 생명주기를 관리한다.
톰캣의 서블릿 컨테이너는 웹 애플리케이션을 배포하고 격리하는 단위인 컨텍스트를 관리한다. 각 컨텍스트는 고유한 /WEB-INF/web.xml 배포 설명자 파일을 통해 서블릿 매핑, 보안 제약 조건 등의 설정을 정의한다. 이 컨테이너는 서블릿의 로딩, 초기화, 서비스 실행, 최종 파괴에 이르는 전 과정을 책임진다.
서블릿 컨테이너의 주요 기능에는 세션 관리, 필터 체인 적용, 리스너 이벤트 처리 등이 포함된다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있으며, 스레드 풀링과 같은 저수준의 네트워크 및 리소스 관리 작업은 컨테이너가 담당한다. 톰캣은 이러한 서블릿 컨테이너 기능을 표준에 따라 충실히 구현하여, 많은 상용 소프트웨어의 기반 엔진으로도 채용된다.
3.2. JSP 엔진
3.2. JSP 엔진
아파치 톰캣은 자바서버 페이지를 실행하기 위한 JSP 엔진을 내장하고 있다. 이 엔진은 자바 서블릿 컨테이너인 카탈리나와 긴밀하게 통합되어 동작한다. JSP 파일은 서버 측에서 동적으로 HTML을 생성하는 기술로, 톰캣의 JSP 엔진은 이러한 파일을 받아서 자바 서블릿 소스 코드로 변환하고, 이를 컴파일하여 실행한다.
이 변환 및 컴파일 과정은 최초 요청 시에 이루어지며, 이후 요청에서는 이미 생성된 서블릿 클래스가 재사용되어 성능을 향상시킨다. 톰캣의 JSP 엔진은 JSP 2.3 사양을 구현하여 표현 언어, JSTL, 사용자 정의 태그 라이브러리 등의 고급 기능을 지원한다. 이를 통해 개발자는 스크립틀릿보다 깔끔하고 유지보수하기 쉬운 웹 페이지를 작성할 수 있다.
엔진의 핵심 구성 요소는 재스퍼이다. 재스퍼는 JSP 파일을 파싱하고 자바 코드로 변환하는 역할을 담당한다. 톰캣의 설정 파일을 통해 JSP의 컴파일러 옵션, 개발 모드 활성화 여부, 체크 간격 등을 조정하여 개발 편의성이나 런타임 성능을 최적화할 수 있다.
3.3. HTTP 서버 (Coyote)
3.3. HTTP 서버 (Coyote)
아파치 톰캣의 HTTP 서버 기능은 코요테(Coyote)라는 이름의 컴포넌트가 담당한다. 코요테는 자바로 작성된 순수 HTTP/1.1 프로토콜 커넥터로서, 톰캣이 외부 클라이언트와 직접 통신할 수 있게 해주는 엔진이다. 이는 톰캣을 독립 실행형 웹 서버로 사용할 수 있게 하는 핵심 요소이다.
코요테는 서블릿 컨테이너와 긴밀하게 통합되어, 들어오는 HTTP 요청을 받아 서블릿이나 JSP가 처리할 수 있는 형태로 변환하고, 처리 결과를 다시 HTTP 응답으로 클라이언트에 반환하는 역할을 수행한다. 기본적으로 8080 포트에서 수신 대기하며, SSL/TLS를 통한 HTTPS 연결도 지원한다.
외부의 전용 웹 서버 없이도 애플리케이션을 배포하고 테스트하는 데 매우 유용하지만, 코요테는 정적 콘텐츠 처리나 대규모 동시 접속 처리에 있어 아파치 HTTP 서버나 엔진엑스 같은 고성능 웹 서버에 비해 최적화되어 있지 않다. 따라서 프로덕션 환경에서는 성능과 보안을 위해 톰캣을 아파치 HTTP 서버와 연동하여 사용하는 것이 일반적이다. 이 경우 코요테는 주로 AJP 프로토콜을 통해 웹 서버와 내부 통신을 담당하게 된다.
3.4. 관리 도구
3.4. 관리 도구
아파치 톰캣은 웹 기반의 관리 도구를 제공하여 서버의 상태를 모니터링하고 구성을 변경하는 작업을 편리하게 수행할 수 있게 한다. 이 도구들은 기본적으로 톰캣 설치 디렉터리 내의 webapps 폴더에 배포된 웹 애플리케이션 형태로 포함되어 있다.
주요 관리 도구로는 톰캣 매니저와 호스트 매니저가 있다. 톰캣 매니저는 배포된 웹 애플리케이션을 실시간으로 관리하는 기능을 제공한다. 이를 통해 애플리케이션의 시작, 정지, 재배포, 언배포 작업을 웹 인터페이스에서 수행할 수 있으며, 각 애플리케이션의 세션 정보와 JVM 메모리 사용량 같은 런타임 상태를 확인할 수 있다. 호스트 매니저는 가상 호스트를 추가하거나 제거하는 등의 작업을 지원한다.
이러한 관리 도구를 사용하려면 사전에 conf/tomcat-users.xml 파일에서 적절한 사용자 역할과 권한을 설정해야 한다. 보안을 위해 기본적으로는 로컬 호스트에서만 접근이 허용되며, 프로덕션 환경에서는 SSL/TLS를 통한 접근이나 추가적인 방화벽 규칙 설정이 권장된다. 관리 도구는 GUI를 통해 서버 운영을 용이하게 하지만, 모든 설정은 server.xml이나 web.xml 같은 XML 구성 파일을 직접 편집하여 변경할 수도 있다.
4. 주요 버전 및 호환성
4. 주요 버전 및 호환성
아파치 톰캣은 지속적인 개발을 통해 여러 주요 버전을 출시해왔다. 각 주요 버전은 특정 자바 서블릿 스펙과 자바서버 페이지 스펙을 구현하며, 이에 필요한 자바 플랫폼, 엔터프라이즈 에디션의 최소 버전을 요구한다. 예를 들어, 톰캣 10.x는 서블릿 6.0, JSP 3.1, EL 5.0 스펙을 지원하며 자바 11 이상이 필요하다. 톰캣 9.x는 서블릿 4.0을 구현하고 자바 8 이상을 필요로 한다.
주요 버전 | 서블릿 / JSP / EL 스펙 | 최소 자바 버전 | 주요 특징 및 호환성 노트 |
|---|---|---|---|
톰캣 11.x | 6.0 / 3.1 / 5.0 | 자바 21 이상 | 자카르타 EE 10 플랫폼 지원. 패키지명이 |
톰캣 10.x | 5.0 / 3.0 / 4.0 | 자바 11 이상 | 자카르타 EE 9 플랫폼 지원. |
톰캣 9.x | 4.0 / 2.3 / 3.0 | 자바 8 이상 | |
톰캣 8.x | 3.1 / 2.3 / 3.0 | 자바 7 이상 | 자바 EE 7 서블릿 3.1 지원. |
톰캣 7.x | 3.0 / 2.2 / 2.2 | 자바 6 이상 | 자바 EE 6 서블릿 3.0 지원. |
버전 간의 호환성은 중요한 고려 사항이다. 특히 톰캣 10과 톰캣 11은 자카르타 EE로의 이전에 따라 패키지명이 변경되어, 이전 javax.servlet.* API를 사용하는 웹 애플리케이션은 수정 없이는 호환되지 않는다. 톰캣 9 이하 버전은 기존 자바 EE 표준을 따르므로 많은 레거시 애플리케이션에서 널리 사용된다. 사용자는 애플리케이션이 요구하는 자바 버전과 서블릿 스펙에 맞는 톰캣 버전을 선택해야 한다.
5. 설치 및 실행
5. 설치 및 실행
아파치 톰캣의 설치와 실행은 비교적 간단한 과정이다. 공식 웹사이트에서 운영 체제에 맞는 배포판을 다운로드할 수 있다. 배포판은 주로 ZIP 또는 TAR.GZ 형식의 바이너리 배포판으로 제공되며, 이를 원하는 디렉터리에 압축을 풀면 기본적인 설치가 완료된다. 설치 전 시스템에 적절한 버전의 자바 개발 키트(JDK) 또는 자바 런타임 환경(JRE)이 설치되어 있어야 한다.
실행은 설치 디렉터리의 bin 폴더 내에 있는 스크립트 파일을 통해 이루어진다. 윈도우 환경에서는 startup.bat, 유닉스 계열(리눅스, macOS) 환경에서는 startup.sh 스크립트를 실행하면 톰캣 서버가 시작된다. 서버를 중지할 때는 동일한 위치의 shutdown.bat 또는 shutdown.sh 스크립트를 사용한다. 기본적으로 톰캣은 8080 포트에서 내장 HTTP 서버(Coyote)를 실행하며, 웹 브라우저에서 http://localhost:8080으로 접속하면 기본 환영 페이지를 확인할 수 있다.
설정 파일을 수정하여 포트나 기타 동작을 변경할 수 있다. 주요 설정 파일은 conf 디렉터리에 위치한 server.xml이다. 예를 들어, 기본 HTTP 연결 포트를 8080에서 80으로 변경하려면 이 파일 내의 Connector 요소를 편집하면 된다. 또한 웹 애플리케이션은 webapps 디렉터리에 WAR 파일을 복사하거나 디렉터리 형태로 배포하여 자동으로 실행할 수 있다.
관리와 모니터링을 위해 톰캣은 웹 기반의 관리자 도구(톰캣 매니저)와 호스트 매니저를 제공한다. 이 도구들을 사용하려면 conf/tomcat-users.xml 파일에 사용자와 역할을 적절히 설정해야 한다. 이러한 도구를 통해 배포된 애플리케이션을 실시간으로 관리하거나, JVM 설정을 확인하는 것이 가능하다.
6. 웹 서버와의 연동
6. 웹 서버와의 연동
6.1. Apache HTTP Server 연동 (mod_jk, mod_proxy_ajp)
6.1. Apache HTTP Server 연동 (mod_jk, mod_proxy_ajp)
아파치 톰캣은 자체 내장 HTTP 서버를 통해 단독으로 운영될 수 있지만, 대규모 트래픽 처리, 정적 콘텐츠 제공 효율화, 보안 강화 등을 위해 전문 웹 서버와 연동하는 구성이 널리 사용된다. 특히 아파치 HTTP 서버와의 연동은 전통적인 방식으로, 이를 위해 mod_jk와 mod_proxy_ajp라는 두 가지 주요 연동 모듈이 활용된다.
mod_jk는 톰캣과 아파치 HTTP 서버를 연결하는 데 특화된 커넥터이다. 이 모듈은 AJP 프로토콜을 사용하여 웹 서버와 애플리케이션 서버 간의 통신을 처리한다. mod_jk는 높은 유연성과 세밀한 구성이 가능하다는 장점이 있으며, 로드 밸런싱과 페일오버 기능을 제공하여 안정적인 클러스터 환경을 구성하는 데 적합하다. 주로 아파치 HTTP 서버 2.0 및 2.2 버전에서 사용되었다.
반면, mod_proxy_ajp는 아파치 HTTP 서버 2.2 버전 이후부터 기본으로 포함된 mod_proxy 모듈의 확장 기능이다. 이 모듈은 mod_jk에 비해 구성이 간단하며, AJP 프로토콜 외에도 HTTP와 HTTPS를 이용한 프록시 기능을 통합적으로 관리할 수 있다. 최신 버전의 아파치 HTTP 서버에서는 mod_proxy_ajp를 사용하는 것이 권장되는 경향이 있다. 두 모듈 모두 정적 콘텐츠는 아파치 HTTP 서버가, JSP와 서블릿과 같은 동적 콘텐츠는 톰캣이 처리하도록 역할을 분담하여 시스템 전체의 성능과 안정성을 높이는 데 기여한다.
6.2. 내장 HTTP 서버 사용
6.2. 내장 HTTP 서버 사용
아파치 톰캣은 자체적으로 HTTP 서버 기능을 내장하고 있어, 별도의 외부 웹 서버 없이도 독립 실행형 서버로 운영될 수 있다. 이 내장 HTTP 서버의 코드명은 코요테(Coyote)이며, 자바 서블릿과 JSP를 처리하는 서블릿 컨테이너와 긴밀하게 통합되어 있다. 이 설계는 개발 및 테스트 환경, 또는 비교적 단순한 프로덕션 환경에서 별도의 웹 서버 구성 없이 빠르게 애플리케이션을 배포하고 실행할 수 있게 해준다.
내장 서버를 사용하는 주요 장점은 구성의 간소화에 있다. 아파치 HTTP 서버와 같은 별도 웹 서버와 연동 모듈(예: mod_jk, mod_proxy_ajp)을 설정할 필요 없이, 톰캣 하나만 설치하면 정적 콘텐츠(HTML, 이미지 파일) 제공과 동적 콘텐츠(서블릿, JSP) 실행을 모두 처리할 수 있다. 이는 학습 곡선을 낮추고, 경량화된 배포를 가능하게 한다.
그러나 대규모 트래픽이 예상되거나 고도의 정적 파일 처리 성능, 복잡한 로드 밸런싱, 강력한 보안 설정이 필요한 엔터프라이즈급 환경에서는 아파치 HTTP 서버나 엔진엑스(Nginx) 같은 전문 웹 서버와의 연동이 일반적으로 권장된다. 이러한 전문 웹 서버는 정적 파일 처리와 연결 관리에 더욱 최적화되어 있어, 톰캣의 내장 서버에 비해 전체 시스템의 성능과 안정성을 높일 수 있다.
결론적으로, 톰캣의 내장 HTTP 서버는 빠른 프로토타이핑, 개발, 소규모 애플리케이션에 적합한 간편한 솔루션을 제공한다. 사용자는 애플리케이션의 규모와 요구 사항에 따라 내장 서버 단독 사용 또는 외부 웹 서버와의 연동 중 하나를 선택할 수 있다.
7. 구성 및 설정
7. 구성 및 설정
7.1. server.xml
7.1. server.xml
server.xml 파일은 아파치 톰캣의 핵심 구성 파일이다. 이 파일은 톰캣 서버 인스턴스 자체의 구조와 동작 방식을 정의하며, 서버 시작 시 가장 먼저 읽는 설정 파일이다. 주요 역할은 커넥터, 엔진, 호스트, 컨텍스트와 같은 서버 구성 요소들을 선언하고 이들 간의 관계를 설정하는 것이다. server.xml은 conf 디렉토리에 위치하며, XML 형식으로 작성된다.
파일의 최상위 요소는 <Server>로, 이는 전체 톰캣 인스턴스를 나타낸다. 그 내부에는 서비스(<Service>), 커넥터(<Connector>), 엔진(<Engine>) 등의 중첩된 요소들이 구성된다. 특히 HTTP 또는 AJP 프로토콜을 처리하는 커넥터의 포트, 스레드 풀, 타임아웃, SSL 설정 등을 이 파일에서 직접 조정할 수 있다. 또한, 로깅, 세션 관리, JNDI 리소스와 같은 글로벌 자원을 정의하는 데도 사용된다.
server.xml을 수정한 후에는 변경 사항을 적용하기 위해 톰캣 서버를 재시작해야 한다. 이 파일의 구문 오류는 서버 시작 실패로 이어질 수 있으므로 주의가 필요하다. 일반적인 웹 애플리케이션 배포와 관련된 설정은 주로 web.xml이나 개별 애플리케이션의 컨텍스트 파일에서 관리되며, server.xml은 서버 인프라 수준의 설정을 담당한다.
7.2. web.xml
7.2. web.xml
web.xml 파일은 웹 애플리케이션의 배포 설명자(Deployment Descriptor)로서, 자바 웹 애플리케이션의 핵심 구성 파일이다. 이 파일은 서블릿 컨테이너인 아파치 톰캣에게 애플리케이션의 구조와 동작 방식을 알려주는 역할을 한다. 각 웹 애플리케이션의 WEB-INF 디렉토리 내부에 위치하며, XML 형식으로 작성된다.
주요 구성 요소로는 서블릿의 선언과 URL 매핑, 필터 설정, 리스너 정의, 세션 타임아웃, 환경 변수 및 보안 제약 조건 등이 포함된다. 예를 들어, 특정 자바 클래스가 서블릿으로 동작하도록 등록하고, 이 서블릿이 응답할 HTTP 요청의 패턴을 지정하는 작업이 여기서 이루어진다. 또한, 웰컴 파일 목록이나 에러 페이지를 특정 HTTP 상태 코드에 연결하는 설정도 가능하다.
아파치 톰캣은 애플리케이션이 시작될 때 이 web.xml 파일을 파싱하여 정의된 설정을 메모리에 로드하고 적용한다. 이 파일의 표준 스키마는 자바 서블릿 스펙에 의해 정의되며, 톰캣은 해당 자바 EE 또는 자카르타 EE 스펙 버전을 지원한다. 따라서 web.xml의 상단에는 사용 중인 스펙 버전을 명시하는 DOCTYPE 선언이나 XML 네임스페이스가 포함된다.
최근에는 어노테이션을 이용한 설정이 보편화되면서, 많은 구성이 자바 코드 내 @WebServlet, @WebFilter 등의 어노테이션으로 대체될 수 있다. 그러나 중앙 집중형 관리가 용이한 web.xml은 여전히 전역적인 설정이나 어노테이션보다 우선순위가 높은 설정을 위해 널리 사용된다.
7.3. 컨텍스트 설정
7.3. 컨텍스트 설정
톰캣에서 웹 애플리케이션은 컨텍스트(Context)라는 논리적 단위로 배포되고 관리된다. 컨텍스트는 하나의 웹 애플리케이션에 해당하며, 특정 URL 경로(예: /myapp)에 매핑된다. 각 컨텍스트는 독립적인 클래스로더를 가지며, 자체적인 web.xml 설정 파일과 자원(HTML, JSP, 서블릿 클래스 등)을 보유한다.
컨텍스트를 정의하는 방법은 크게 세 가지이다. 첫째, webapps 디렉토리에 WAR 파일을 배치하거나 압축을 푼 디렉토리 형태로 애플리케이션을 넣는 자동 배포 방식이다. 둘째, server.xml 파일 내에 <Context> 요소를 직접 선언하는 방법이 있지만, 이는 서버 전체 설정을 재시작해야 반영되므로 권장되지 않는다. 셋째, conf/Catalina/[호스트명]/ 디렉토리 아래에 [애플리케이션명].xml 형태로 컨텍스트 정의 파일을 생성하는 방식이 가장 유연하고 일반적으로 권장된다.
이 컨텍스트 정의 파일(context.xml)에서는 해당 애플리케이션에 특화된 다양한 설정을 할 수 있다. 주요 설정 항목으로는 데이터베이스 연결을 위한 JNDI 리소스 정의, 세션 관리 설정, 로깅 디렉토리 지정, 리로딩 기능(개발 중 클래스 파일 변경 시 자동 재배포) 활성화 여부 등이 포함된다. 이를 통해 각 애플리케이션은 톰캣 서버의 전역 설정(server.xml)에 영향을 주지 않으면서도 필요한 환경을 독립적으로 구성할 수 있다.
8. 보안
8. 보안
아파치 톰캣은 웹 애플리케이션 서버로서 보안은 매우 중요한 고려 사항이다. 기본 설치 상태에서는 보안 설정이 완벽하지 않을 수 있으므로, 실제 운영 환경에 배포하기 전에 반드시 보안 강화 작업을 수행해야 한다. 주요 보안 조치로는 불필요한 기본 애플리케이션과 예제 파일의 삭제, 관리자 콘솔에 대한 강력한 인증 및 접근 제어 설정, 그리고 SSL/TLS를 통한 통신 암호화가 포함된다.
서버의 구성 파일을 통한 세부적인 보안 설정이 가능하다. server.xml 파일에서는 커넥터 설정을 조정하여 특정 IP 주소만 접근을 허용하거나, AJP 커넥터와 같은 내부 프로토콜을 외부에 노출하지 않도록 해야 한다. 또한, 애플리케이션별 보안 제약 조건은 web.xml 파일 내 보안 제약 조건 요소를 통해 정의하여, 특정 URL 패턴에 대한 접근을 인증된 사용자로 제한할 수 있다.
정기적인 보안 업데이트와 취약점 점검은 필수적이다. 아파치 톰캣 팀은 발견된 보안 문제에 대해 보안 공지를 발행하고 패치를 제공한다. 따라서 최신 안정화 버전을 유지하는 것이 가장 기본적이면서도 효과적인 보안 대책이다. 또한, 톰캣을 방화벽 뒤에 배치하고 최소 권한 원칙에 따라 운영 계정의 권한을 제한하는 것도 공격 표면을 줄이는 데 도움이 된다.
9. 성능 튜닝
9. 성능 튜닝
아파치 톰캣의 성능 튜닝은 JVM 설정, 스레드 풀 구성, 커넥터 최적화, 메모리 관리 등 여러 측면에서 접근한다. 핵심 설정 파일인 server.xml에서 HTTP 커넥터의 maxThreads 속성을 조정하여 동시 처리 가능한 최대 요청 수를 늘릴 수 있으며, acceptCount 속성으로 모든 스레드가 사용 중일 때 대기할 수 있는 요청 큐의 크기를 설정한다. 또한, JVM의 힙 메모리 크기를 -Xms(초기 힙 크기)와 -Xmx(최대 힙 크기) 파라미터로 적절히 할당하여 가비지 컬렉션의 빈도를 줄이고 애플리케이션 응답 시간을 개선할 수 있다.
세션 관리도 성능에 중요한 영향을 미친다. 불필요한 세션 데이터를 줄이고, web.xml에서 세션 타임아웃 시간을 적절히 설정하며, 세션을 영속화하는 대신 스테이트리스한 설계를 고려하는 것이 좋다. 정적 자원(예: 이미지, CSS, 자바스크립트 파일)은 톰캣이 직접 제공하기보다는 아파치 HTTP 서버나 Nginx 같은 전용 웹 서버, 혹은 CDN을 앞단에 배치하여 처리 부하를 분산시키는 것이 일반적인 최적화 방법이다.
성능 모니터링과 프로파일링은 튜닝의 기초가 된다. 톰캣에 내장된 매니저 애플리케이션이나 JMX를 통해 스레드 사용량, 메모리 사용량, 요청 처리 시간 등의 지표를 지속적으로 관찰해야 한다. 또한, enableLookups="false"로 설정하여 원격 호스트의 DNS 조회를 비활성화하고, compression 속성을 사용하여 전송 데이터를 압축하는 것도 네트워크 성능 향상에 도움이 될 수 있다. 이러한 조정은 애플리케이션의 실제 부하 패턴과 하드웨어 사양에 맞게 실험을 통해 점진적으로 진행되어야 한다.
10. 관련 소프트웨어 및 대안
10. 관련 소프트웨어 및 대안
10.1. 아파치 제로니모
10.1. 아파치 제로니모
아파치 제로니모는 아파치 소프트웨어 재단이 개발한 완전한 기능의 자바 EE 호환 애플리케이션 서버이다. 아파치 톰캣이 서블릿 컨테이너와 JSP 엔진을 제공하는 경량 솔루션에 가깝다면, 제로니모는 EJB 컨테이너, JMS, 트랜잭션 관리 등 엔터프라이즈 수준의 모든 자바 EE 스펙을 구현하는 통합 애플리케이션 서버 플랫폼이다.
제로니모는 아파치 게론모라는 코드명으로 시작되었으며, 모듈형 아키텍처를 기반으로 구축되었다. 이 서버는 인버전 오브 컨트롤 원칙을 적용한 제로니모 GBean이라는 독자적인 구성 요소 모델을 사용하여, 다양한 아파치 프로젝트들(예: 톰캣, 액티브MQ, 오픈JPA)을 통합하고 관리한다. 이러한 설계는 유연성과 확장성을 제공하는 것이 목표이다.
아파치 제로니모는 오픈 소스 라이선스인 아파치 라이선스 2.0 하에 배포되며, 상용 자바 EE 애플리케이션 서버에 대한 무료 대안으로 사용된다. 주로 자바 EE 표준을 완전히 준수하면서도 아파치 생태계의 기술 스택을 선호하는 개발 환경이나 프로덕션 환경에서 채택된다.
10.2. 와일드플라이
10.2. 와일드플라이
와일드플라이(WildFly)는 레드햇이 주도적으로 개발하는 오픈 소스 자바 플랫폼, 엔터프라이즈 에디션 애플리케이션 서버이다. 이전에는 JBoss 애플리케이션 서버라는 이름으로 알려졌으며, 2014년 버전 8부터 현재의 이름으로 변경되었다. 아파치 톰캣이 경량의 서블릿 컨테이너에 초점을 맞춘다면, 와일드플라이는 자바 EE 및 자카르타 EE 사양의 전체 스택을 완벽하게 구현하는 풀스택 애플리케이션 서버를 지향한다.
와일드플라이는 모듈형 아키텍처와 빠른 시작 시간으로 유명하다. 핵심 기능으로는 고가용성 클러스터링, 메시징, 트랜잭션 관리, 보안 관리 등을 포함하며, 마이크로서비스 아키텍처 구축을 지원하는 마이크로프로파일 구현체도 제공한다. 이는 아파치 톰캣이 기본적으로 제공하지 않는 엔터프라이즈급 기능들이다.
아파치 톰캣 사용자에게 와일드플라이는 더 많은 자바 EE 기능이 필요하거나, EJB를 사용해야 하는 대규모 엔터프라이즈 애플리케이션을 배포할 때 고려할 수 있는 대안이다. 반면, 톰캣은 단순한 웹 애플리케이션이나 스프링 부트와 같은 경량 프레임워크 기반 애플리케이션에 더 적합한 선택이 될 수 있다. 와일드플라이는 레드햇 JBoss 엔터프라이즈 애플리케이션 플랫폼의 업스트림 프로젝트로서 상용 지원의 기반이 된다.
10.3. 글래스피시
10.3. 글래스피시
글래스피시(GlassFish)는 오라클이 주도하여 개발한 오픈 소스 자바 플랫폼, 엔터프라이즈 에디션(Java EE, 현 자카르타 EE) 애플리케이션 서버이다. 아파치 톰캣이 경량의 서블릿 컨테이너와 JSP 엔진을 제공하는 데 중점을 둔다면, 글래스피시는 EJB 컨테이너, JMS, JTA 등 자바 EE 사양의 전체 스택을 완벽하게 구현한 풀스택 애플리케이션 서버이다. 이로 인해 대규모 기업용 애플리케이션이나 분산 트랜잭션이 필요한 복잡한 시스템을 구축하는 데 적합하다.
글래스피시의 공식 참조 구현(RI)으로서의 지위는 자바 EE 기술 사양의 표준 준수 여부를 검증하는 데 중요한 역할을 했다. 최신 버전은 자카르타 EE 플랫폼을 지원하며, 모듈형 아키텍처를 기반으로 하여 필요에 따라 특정 기능만 배포할 수 있는 유연성을 제공한다. 관리 콘솔과 명령줄 도구를 통한 강력한 관리 기능, 그리고 고가용성과 클러스터링을 위한 내장 지원이 특징이다.
아파치 톰캣과 비교할 때, 글래스피시는 더 포괄적이고 무거운 솔루션에 해당한다. 톰캣으로는 서블릿과 JSP 기반의 웹 애플리케이션을 실행하는 데 충분하지만, EJB나 JMS 같은 엔터프라이즈급 기능이 필요하면 글래스피시나 와일드플라이, 제티 같은 다른 애플리케이션 서버를 고려해야 한다. 글래스피시는 상용 제품인 오라클 웹로직 서버의 기반이 되기도 했다.
10.4. 제티 (Jetty)
10.4. 제티 (Jetty)
제티는 이클립스 재단에서 개발한 오픈 소스 자바 서블릿 컨테이너이자 HTTP 웹 서버이다. 아파치 톰캣과 마찬가지로 자바 서블릿과 자바서버 페이지를 실행할 수 있는 환경을 제공하지만, 설계 철학과 사용 사례에서 차이점을 보인다. 제티는 경량화와 모듈화에 중점을 두어 설계되었으며, 표준 자바 애플리케이션에 내장되어 구동되는 임베디드 서버로 사용되는 경우가 많다.
이러한 특징 덕분에 제티는 마이크로서비스, 프로토타입 개발, 테스트 환경, 또는 스프링 부트와 같은 현대적 자바 프레임워크의 기본 내장 서버로 널리 채택되고 있다. 아파치 톰캣이 주로 독립 실행형 웹 애플리케이션 서버로 배포되는 것과는 대조적인 접근 방식이다. 두 컨테이너 모두 자바 EE 및 자카르타 EE의 서블릿 사양을 구현하지만, 제티는 보다 유연한 통합과 빠른 시작 시간을 장점으로 내세운다.
제티는 비동기 I/O와 같은 고성능 네트워킹 기능에 강점을 가지며, HTTP/2와 웹소켓 프로토콜을 광범위하게 지원한다. 이는 실시간 웹 애플리케이션 구축에 유리한 조건을 제공한다. 또한, 이클립스 재단의 관리 하에 활발한 커뮤니티를 통해 지속적으로 개발 및 유지보수되고 있다.
11. 여담
11. 여담
톰캣이라는 이름은 원저자인 제임스 던칸 데이비슨이 선정했다. 이 이름은 영어 사전에서 '수고양이'를 의미하는 일반 명사이다. 개발 초기, 이 프로젝트는 다양한 환경에서 견고하게 작동하는 엔진을 목표로 했는데, 이러한 특성을 고양이의 민첩성과 적응력에 빗대어 이름을 지은 것으로 알려져 있다. 이후 프로젝트가 아파치 소프트웨어 재단으로 이관되면서 정식 명칭은 '아파치 톰캣'이 되었다.
톰캣은 자바 서블릿과 자바서버 페이지 사양의 참조 구현으로서 중요한 역할을 해왔다. 이는 톰캣이 해당 자바 기술 표준을 가장 정확하고 완벽하게 구현한 공식 구현체 중 하나임을 의미한다. 따라서 많은 자바 개발자와 웹 애플리케이션 서버 벤더들이 표준의 동작을 검증하거나 학습하는 데 톰캣을 사용해왔다.
아파치 라이선스 2.0 하에 제공되는 톰캣은 상용 소프트웨어에 자유롭게 내장되어 사용될 수 있다. 이 덕분에 수많은 상용 자바 EE 애플리케이션 서버들이 내부 서블릿 컨테이너 엔진으로 톰캣을 채용하고 있으며, 스프링 부트와 같은 현대적인 자바 프레임워크도 기본 내장 서버로 톰캣을 널리 사용하고 있다. 이러한 보편성은 톰캣이 오픈소스 생태계와 엔터프라이즈 환경 모두에서 중추적인 인프라 소프트웨어로 자리매김하게 했다.
