Jetty
1. 개요
1. 개요
제티는 자바로 작성된 HTTP 서버이자 서블릿 컨테이너이다. 이클립스 재단[5]이 관리하는 오픈 소스 프로젝트로, 아파치 라이선스 2.0과 이클립스 퍼블릭 라이선스의 듀얼 라이선스 하에 배포된다.
주요 용도는 웹 애플리케이션 서버로, 자바 서블릿과 자바서버 페이지 스펙을 구현하여 동적 웹 애플리케이션을 실행하는 데 사용된다. 또한, 경량화된 설계 덕분에 애플리케이션 내부에 포함하여 구동하는 임베디드 서버로 널리 활용되며, 리버스 프록시 역할도 수행할 수 있다.
제티는 높은 성능과 확장성을 지향하며, 비동기 프로그래밍 모델과 이벤트 기반 아키텍처를 채택하여 많은 수의 동시 연결을 효율적으로 처리한다. 이러한 특징은 마이크로서비스 아키텍처와 클라우드 네이티브 환경에서의 사용에 적합하게 만든다.
이 프로젝트는 이클립스 IDE와 같은 개발 도구의 내부 서버로, 그리고 아파치 메이븐이나 그레이들 같은 빌드 도구의 로컬 개발 서버로도 광범위하게 채택되어 있다.
2. 역사
2. 역사
제티는 1995년 모티프 툴킷을 사용한 자바 애플릿 서버로 시작되었다. 초기에는 웹 서버와 애플릿 간의 통신을 위한 경량 서버 솔루션으로 개발되었다. 시간이 지나면서 자바 서블릿 사양이 등장하고 웹 애플리케이션의 필요성이 증가함에 따라, 제티는 완전한 기능을 갖춘 HTTP 서버이자 서블릿 컨테이너로 진화하게 되었다.
제티 프로젝트는 2009년에 이클립스 재단의 관리 하에 들어갔다. 이클립스 재단의 관리는 프로젝트의 개발 과정을 더욱 투명하고 공개적으로 만들었으며, 커뮤니티 중심의 협업을 촉진하는 데 기여했다. 현재 제티는 이클립스 재단의 주요 프로젝트 중 하나로, 아파치 라이선스 2.0과 이클립스 퍼블릭 라이선스의 듀얼 라이선스 하에 제공되고 있다.
이러한 역사적 배경을 통해 제티는 고성능과 모듈성에 중점을 둔 경량 자바 서버 솔루션으로 자리매김하게 되었다. 초기 애플릿 서버로서의 출발점은 이후 임베디드 서버 사용 사례에 적합한 설계 철학의 기반이 되었다.
3. 아키텍처
3. 아키텍처
Jetty의 아키텍처는 경량성과 모듈화를 핵심으로 설계되었다. 이는 단일 모놀리식 애플리케이션 서버가 아닌, 필요에 따라 조합 가능한 독립적인 컴포넌트들의 집합으로 구성된다. 이러한 설계 철학 덕분에 Jetty는 임베디드 시스템이나 마이크로서비스와 같이 자원이 제한된 환경에서도 최소한의 구성으로 실행될 수 있으며, 대규모 엔터프라이즈 애플리케이션을 위한 풍부한 기능 세트로 확장하는 것도 가능하다.
아키텍처의 중심에는 커넥터와 핸들러라는 두 가지 핵심 개념이 있다. 커넥터는 HTTP, HTTPS, HTTP/2 등 다양한 네트워크 프로토콜을 통해 들어오는 연결을 수신하고 관리하는 역할을 한다. 핸들러는 이러한 요청을 실제로 처리하는 로직을 담당하며, 서블릿 컨테이너는 핸들러의 한 구현체로 볼 수 있다. 사용자는 이러한 핸들러들을 체인처럼 연결하여 복잡한 요청 처리 파이프라인을 구성할 수 있다.
이러한 모듈식 설계는 Jetty를 리버스 프록시나 로드 밸런서와 같은 다른 미들웨어 구성 요소에 쉽게 통합할 수 있게 한다. 또한, 이클립스 재단의 주도 하에 개발되며 아파치 라이선스 2.0과 이클립스 퍼블릭 라이선스의 듀얼 라이선스를 채택하여, 상업적 제품에 자유롭게 내장될 수 있는 유연성을 제공한다. 결과적으로 Jetty는 전통적인 웹 애플리케이션 서버로서뿐만 아니라, 현대적인 클라우드 네이티브 애플리케이션의 구성 요소로 널리 활용되고 있다.
4. 주요 기능
4. 주요 기능
Jetty는 경량 설계와 모듈화된 아키텍처를 바탕으로 다양한 핵심 기능을 제공한다. 가장 중요한 기능은 서블릿 컨테이너로서 자바 서블릿 및 자바서버 페이지(JSP) 사양을 완벽하게 구현하여 표준 웹 애플리케이션을 구동할 수 있다는 점이다. 또한, HTTP 서버로서의 기능을 내장하고 있어 독립 실행형 웹 서버로 사용되거나, 리버스 프록시 뒤에서 애플리케이션 서버 역할을 수행할 수 있다.
주요 강점 중 하나는 임베디드 서버로의 활용이다. Jetty는 단일 JAR 파일로 쉽게 포함될 수 있어, 데스크톱 애플리케이션이나 다른 자바 애플리케이션 내부에 웹 서버 기능을 내장시키는 데 이상적이다. 이는 마이크로서비스 아키텍처나 독립 실행형 소프트웨어를 개발할 때 큰 장점으로 작용한다. 또한, 비동기 I/O와 이벤트 기반 프로그래밍 모델을 지원하여 많은 수의 동시 연결을 효율적으로 처리할 수 있다.
고급 기능으로는 웹소켓 프로토콜에 대한 완벽한 지원을 들 수 있다. Jetty는 최신 웹소켓 API를 구현하여 실시간 양방향 통신이 필요한 애플리케이션을 구축하는 데 널리 사용된다. 보안 측면에서는 SSL/TLS을 통한 암호화 통신을 지원하며, 인증 및 권한 부여를 위한 다양한 메커니즘을 통합할 수 있다.
마지막으로, Jetty는 높은 수준의 확장성과 유연성을 제공한다. 사용자는 필요에 따라 커넥터, 핸들러, 보안 관리자와 같은 구성 요소를 선택적으로 조합하여 서버를 구성할 수 있다. 이러한 모듈식 설계는 복잡한 네트워크 요구 사항이나 특정 프로토콜을 처리하는 맞춤형 서버를 구축할 수 있게 해준다.
5. 사용 사례
5. 사용 사례
Jetty는 경량성과 임베디드 가능성으로 인해 다양한 웹 애플리케이션 서버 시나리오에서 널리 사용된다. 가장 대표적인 사용 사례는 자바 기반의 웹 애플리케이션을 배포하는 웹 서버 및 서블릿 컨테이너로 활용되는 것이다. 스프링 부트와 같은 현대적인 자바 프레임워크는 내장형 서버로 Jetty를 기본 옵션 중 하나로 제공하여, 개발자가 애플리케이션을 단일 실행 가능 JAR 파일로 패키징하고 배포할 수 있게 한다. 이는 마이크로서비스 아키텍처와 클라우드 네이티브 환경에서 특히 유용하다.
또한 Jetty는 리버스 프록시나 로드 밸런서 뒤에서 고성능 커넥터 역할을 하도록 구성될 수 있다. 그 유연한 아키텍처 덕분에, HTTP, HTTPS, HTTP/2, WebSocket과 같은 다양한 프로토콜을 처리하는 특수 목적의 네트워크 게이트웨이나 미들웨어 구성 요소의 핵심 엔진으로 내장되기도 한다. 대규모 분산 시스템에서 경량의 통신 엔드포인트를 구축할 때 선호된다.
임베디드 사용 사례는 웹 서버의 역할을 넘어선다. Jetty는 소프트웨어 개발 도구, 통합 개발 환경, 빌드 도구, 모니터링 시스템 등 다른 애플리케이션 내부에 내장되어 웹 기반 관리 콘솔이나 REST API를 제공하는 데 활용된다. 예를 들어, 이클립스 IDE나 젠킨스와 같은 도구들이 내부 HTTP 서비스 구성에 Jetty를 사용한 바 있다. 이러한 다양성은 Jetty가 단순한 서버가 아닌 재사용 가능한 자바 라이브러리로서의 가치를 증명한다.
6. 설치 및 구성
6. 설치 및 구성
Jetty는 다양한 방식으로 설치 및 구성할 수 있다. 가장 일반적인 방법은 공식 웹사이트에서 배포판을 다운로드하여 독립 실행형 서버로 실행하는 것이다. 배포판에는 서버를 시작하고 중지하는 스크립트와 기본 구성 파일이 포함되어 있다. 또한 메이븐(Maven)이나 그레이들(Gradle) 같은 빌드 도구를 통해 프로젝트의 의존성으로 추가하여 임베디드 서버로 사용하는 방법도 널리 쓰인다. 이 경우 Jetty의 라이브러리가 애플리케이션 JAR 파일에 포함되어 함께 배포된다.
구성은 주로 XML 기반의 설정 파일을 통해 이루어진다. jetty.xml 파일은 서버의 핵심 구성 요소인 커넥터(Connector), 스레드 풀(Thread Pool), 세션 관리자(Session Manager) 등을 정의한다. 웹 애플리케이션은 web.xml 배포 서술자(Deployment Descriptor)나 최신 서블릿 스펙에 따른 어노테이션을 통해 구성하며, contexts 디렉터리에 XML 파일을 추가하여 배포할 수 있다. 또한, 자바 코드를 통해 프로그래밍 방식으로 서버 인스턴스를 생성하고 세부 설정을 조정하는 것도 가능하다.
고급 구성에는 SSL/TLS를 통한 보안 연결 설정, 리버스 프록시 역할을 위한 구성, 특정 서블릿 필터(Servlet Filter)나 보안 제약 조건(Security Constraint) 적용 등이 포함된다. Jetty는 모듈화된 아키텍처를 가지고 있어, 필요에 따라 JMX 모니터링이나 자바 NIO(Non-blocking I/O) 기반의 고성능 커넥터 같은 모듈을 활성화할 수 있다. 이러한 유연성 덕분에 경량 마이크로서비스부터 대규모 엔터프라이즈 애플리케이션까지 다양한 환경에 맞게 최적화할 수 있다.
7. 성능 및 확장성
7. 성능 및 확장성
Jetty는 높은 성능과 효율적인 확장성을 핵심 설계 목표로 삼고 있다. 경량화된 아키텍처와 비동기, 이벤트 기반의 처리 모델 덕분에 적은 메모리와 CPU 자원으로도 많은 수의 동시 연결을 처리할 수 있다. 특히 NIO (Non-blocking I/O)를 적극 활용하여 연결당 스레드 수를 최소화하고, IOPS를 극대화하는 방식으로 처리량을 높인다. 이러한 설계는 마이크로서비스나 클라우드 환경에서 빠른 시작 시간과 낮은 지연 시간을 요구하는 임베디드 서버 시나리오에 매우 적합하다.
확장성 측면에서 Jetty는 수직 확장과 수평 확장을 모두 지원한다. 단일 인스턴스의 성능을 높이는 수직 확장을 위해 멀티코어 프로세서를 효율적으로 활용하는 스레드 풀 관리와 커넥션 풀 최적화 기능을 제공한다. 또한, 로드 밸런서 뒤에 여러 Jetty 인스턴스를 배치하여 클러스터링을 구성하는 수평 확장도 용이하다. 세션 클러스터링과 같은 기능을 통해 애플리케이션의 상태를 분산 환경에서도 일관되게 유지할 수 있다.
성능 튜닝을 위해 사용자는 스레드 풀의 크기, 커넥터 설정, 버퍼 크기 등 다양한 매개변수를 세밀하게 조정할 수 있다. Jetty는 JMX (Java Management Extensions)를 통한 실시간 모니터링을 지원하여 성능 병목 현상을 식별하고 해결하는 데 도움을 준다. 이러한 유연성과 제어 가능성은 고가용성과 대규모 트래픽 처리가 필요한 엔터프라이즈 환경에서 Jetty를 신뢰할 수 있는 선택지로 만든다.
8. 보안
8. 보안
Jetty는 웹 애플리케이션 서버로서의 보안을 강화하기 위해 다양한 기능과 메커니즘을 제공한다. 서블릿 컨테이너로서 표준 자바 보안 아키텍처를 따르며, 웹 애플리케이션 단위로 보안 제약을 정의할 수 있는 보안 제약사항(Security Constraint)을 지원한다. 이를 통해 특정 URL 패턴에 대한 접근 제어, 인증 방식 설정, 데이터 무결성 보장을 구성할 수 있다.
Jetty는 SSL/TLS를 통한 암호화 통신을 광범위하게 지원한다. 내장된 SslContextFactory를 통해 인증서 관리, 암호화 알고리즘 제어, 프로토콜 버전 설정 등을 세밀하게 구성할 수 있다. 또한 HTTP/2와 같은 최신 프로토콜의 보안 요구사항도 충족한다. 리버스 프록시 구성 시에도 헤더 검증 및 조작을 방지하는 보안 설정을 적용할 수 있어, 외부 공격으로부터 애플리케이션을 보호하는 데 유용하다.
보안 취약점에 대응하기 위해 Jetty 프로젝트는 정기적인 보안 업데이트를 발표하며, 이클립스 재단의 보안 팀이 취약점 보고 및 관리를 담당한다. 사용자는 공식 채널을 통해 보안 패치를 적용하고, 최신 안정 버전을 유지함으로써 알려진 취약점으로부터 시스템을 보호할 수 있다. 특히 임베디드 서버로 사용될 때는 애플리케이션에 포함된 Jetty 라이브러리의 버전 관리가 보안 측면에서 중요하다.
9. 다른 서버와의 비교
9. 다른 서버와의 비교
Jetty는 자바 기반의 경량 웹 서버 및 서블릿 컨테이너로서, Apache Tomcat이나 JBoss EAP와 같은 다른 주요 자바 애플리케이션 서버와 자주 비교된다. 가장 큰 차이점은 Jetty의 경량 설계와 임베디드 사용에 최적화된 아키텍처에 있다. Tomcat이 독립 실행형 서버로 더 널리 알려져 있다면, Jetty는 애플리케이션에 내장되어 실행되는 임베디드 서버 시나리오에서 강점을 보인다. 이는 마이크로서비스 아키텍처나 클라우드 네이티브 애플리케이션 개발에 유리하다.
성능 측면에서 Jetty는 비동기 I/O와 높은 동시성 처리를 효율적으로 지원하는 이벤트 기반 아키텍처를 채택하고 있다. 이는 전통적인 스레드 기반 모델을 사용하는 서버들에 비해 제한된 자원 환경에서 더 나은 확장성을 제공할 수 있다. 반면, 웹로직 서버나 IBM WebSphere와 같은 완전한 기능의 J2EE 애플리케이션 서버들은 EJB 컨테이너나 JMS와 같은 엔터프라이즈급 기능을 포괄적으로 제공하지만, 그에 따른 복잡성과 자원 소비가 크다는 점에서 대비된다.
사용 편의성과 구성의 유연성도 중요한 비교 요소다. Jetty는 XML 구성 파일보다는 자바 API를 통한 프로그래밍 방식의 구성에 중점을 두어, 개발자가 코드 내에서 서버를 세밀하게 제어할 수 있게 한다. 이는 스프링 부트와 같은 현대적 자바 프레임워크에서 기본 내장 서버로 채택되는 이유 중 하나다. 비교적 단순한 HTTP 서버 역할이 필요하거나, 리버스 프록시 뒤에서 동작하는 서블릿 컨테이너가 필요할 때 Jetty는 가볍고 빠른 대안이 된다.
