jetty 설치 및 실행

Web/WAS 2012. 11. 10. 00:12


Jetty 서버의 설치 및 기본 사용법을 살펴본다.

Jetty 설치 및 실행

Jetty는 서블릿과 JSP를 지원하는 자바 기반의 WAS 서버이다. Netcraft Web Server 조사에서 따르면 Jetty는 현재 톰캣의 점유율에 대비해서 80% 정도의 점유율을 차지하고 있다고 한다. (Jetty shows strong growh - http://www.theserverside.com/news/thread.tss?thread_id=49010 참고) 실제로 Jetty는 다른 WAS에 비해 가볍고 빠르며, 설정도 더 쉽다. 게다가 Ant나 Maven, 그리고 이클립스와의 연동이 쉬울 뿐더러, WAS를 코드에 임베딩시켜서 동작시킬 수도 있기 때문에 개발 과정에서는 상당한 편리함을 제공한다. (필자 역시 Maven과 Jetty를 연동하여 웹 어플리케이션을 개발하곤 하는데, 늘 느끼는 거지만 정말 편리하다고 생각한다.)

Jetty 설치하기

Jetty의 설치 방법은 톰캣이나 Resin 처럼 필요한 파일을 다운로드 받은 뒤 압축을 풀면 완료된다. 현재 Jetty 버전은 6 으로서 아래 사이트에서 6버전의 Jetty를 다운로드 받을 수 있다.

  • http://docs.codehaus.org/display/JETTY/Downloading+Jetty
이 글을 쓰는 시점에서 최신 버전은 6.1.11 버전이며, 본 글에서는 jetty-6.1.11.zip 파일을 기준으로 설치 과정을 설명할 것이다. 다운로드 받은 파일의 압축을 풀면 기본적인 설치가 완료된다.

Jetty 시작 및 정지

Jetty를 처음 실행한 다음에 Jetty가 올바르게 동작하는 지 확인하려면, Jetty를 설치한 디렉토리에서 다음과 같은 명령어를 실행하면 된다.

C:\devtool\jetty-6.1.11>java -jar start.jar etc/jetty.xml

* jetty-9 에서는 java -jar start.jar 만 입력


Jetty 설치 디렉토리에 위치한 etc/jetty.xml 파일은 기본적으로 제공되는 Jetty 설정 파일로서, 위 명령어를 실행하면 실행하면 다음과 비긋한 메시지가 출력되면서 Jetty 웹 서버가 실행되는 것을 확인할 수 있다.

C:\devtool\jetty-6.1.11>java -jar start.jar etc/jetty.xml
2008-09-29 14:43:37.518::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2008-09-29 14:43:37.688::INFO:  jetty-6.1.11
2008-09-29 14:43:37.749::INFO:  Deploy C:\devtool\jetty-6.1.11\contexts\javadoc.xml 
-> org.mortbay.jetty.handler.ContextHandler@1bd0dd4{/javadoc,file:/C:/devtool/jetty-
6.1.11/javadoc/}
2008-09-29 14:43:37.798::INFO:  Deploy C:\devtool\jetty-6.1.11\contexts\test.xml 
-> org.mortbay.jetty.webapp.WebAppContext@1feca64{/,C:\devtool\jetty-
6.1.11/webapps/test}
2008-09-29 14:43:37.847::INFO:  Deploy C:\devtool\jetty-6.1.11\contexts\test-
jndi.xml -> org.mortbay.jetty.webapp.WebAppContext@1193779{/test-jndi,C:\devtool\jetty-
6.1.11/contexts/test-jndi.d}
2008-09-29 14:43:38.185::INFO:  No Transaction manager found - if your webapp requires 
one, please configure one.
2008-09-29 14:43:38.250::INFO:  Extract jar:file:/C:/devtool/jetty-6.1.11/webapps/
cometd.war!/ to C:\Users\madvirus\AppData\Local\Temp\Jetty_0_0_0_0_8080_cometd.war__cometd__-
t2qfkl\webapp
2008-09-29 14:43:39.019::WARN:  Unknown realm: Test JAAS Realm
2008-09-29 14:43:39.142::INFO:  Opened C:\devtool\jetty-6.1.11\logs\2008_09_29.request.log
2008-09-29 14:43:39.181::INFO:  Started SelectChannelConnector@0.0.0.0:8080

Jetty를 시작한 뒤 웹 브라우저를 띄워서 http://localhost:8080 을 이용해서 Jetty 서버에 접속하면 다음과 같은 기본 화면을 볼 수 있다.


Jetty를 종료하고 싶을 때에는 Jetty를 구동한 콘솔(도스창)에서 Ctrl+C를 누르면 된다.

Jetty를 실행하는 콘솔과 Jetty를 종료하는 콘솔이 다를 수도 있는데, 이런 경우에는 다음과 같이 STOP.PORT 시스템 프로퍼티와 STOP.KEY 시스템 프로퍼티를 이용해서 Jetty를 시작하면 된다.

java -DSTOP.PORT=8079 -DSTOP.KEY=secret -jar start.jar etc/jetty.xml

STOP.PORT 시스템 프로퍼티는 Jetty 종료 메시지를 기다릴 때 사용할 포트 번호이며, STOP.KEY 시스템 프로퍼티는 올바른 종료 메시지인지의 여부를 구분할 때 사용할 키 값이다. Jetty를 구동한 콘솔이 아닌 다른 콘솔에서 Jetty를 종료할 때에는 Jetty를 시작할 때 명시한 명시한 포트 번호와 키 값, 그리고 --stop 명령행 인자를 사용하여 종료 메시지를 전달할 수 있다.

java -DSTOP.PORT=8079 -DSTOP.KEY=secret -jar start.jar --stop

만약 STOP.PORT 시스템 프로퍼티만 명시하고 STOP.KEY 프로퍼티는 생략한 경우, STOP.KEY 프로퍼티의 값을 임의로 생성해서 표준 출력(콘솔)에 표시한다. 또한, STOP.PORT 프로퍼티의 값을 0으로 지정한 경우, 임의의 포트를 할당한 뒤 표준 출력에서 할당한 포트 값을 표시한다.

컨텍스트 배포(추가)

Jetty 배포판에 포함된 etc/jetty.xml 파일을 사용할 경우, 다음의 두 가지 방법을 이용해서 새로운 컨텍스트를 추가할 수 있다.

  • [JETTY홈]\webapps\ 디렉토리에 war 파일이나 웹 어플리케이션 디렉토리 생성하기
  • [JETTY홈]\contexts\ 디렉토리에 새로운 컨텍스트 설정 파일 추가히기/li>
webapps에 배포하기

webapps 디렉토리에 배포할 경우 war 파일이나 zip 파일을 webapps 디렉토리에 복사해주면 된다. 또는, webapps 디렉토리에 웹 어플리케이션 디렉토리를 복사해주어도 된다. war 파일이나 웹 어플리케이션 디렉토리를 추가한 뒤에는 Jetty를 새로 시작해 주어야 한다. 즉, webapps 디렉토리에는 Hot Deploy가 적용되지 않는다.

Jetty 배포판에 기본적으로 포함된 etc/jetty.xml 파일을 보면 다음과 같은 설정 부분을 확인할 수 있다.

    <Call name="addLifeCycle">
      <Arg>
        <New class="org.mortbay.jetty.deployer.WebAppDeployer">
          <Set name="contexts"><Ref id="Contexts"/></Set>
          <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
          <Set name="parentLoaderPriority">false</Set>
          <Set name="extract">true</Set>
          <Set name="allowDuplicates">false</Set>
          <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
        </New>
      </Arg>
    </Call>

위 코드는 웹 어플리케이션 디렉토리를 설정하는 부분으로서, 위 코드의 경우 Jetty의 홈디렉토리에 위치한 webapps 디렉토리를 웹 어플리케이션 디렉토리(webAppDir)로 설정하고 있다. WebAppDeployer는 지정한 디렉토리에 위치한 war/zip 파일이나 하위 디렉토리를 웹 어플리케이션으로 배포해주는 기능을 제공하며, 주요 프로퍼티는 다음과 같다.

  • webAppDir - 웹 어플리케이션을 검색할 디렉토리. 파일 경로나 URL로 명시한다. 이 디렉토리에 위치한 .war 파일이나 .zip 파일이 웹 어플리케이션 컨텍스트로 배치된다. 또한, 이름이 CVS가 아닌 디렉토리도 웹 어플리케이션 컨텍스트로 배치된다. 이때, 파일명이나 디렉토리 이름이 컨텍스트의 경로명으로 사용되며, 이름이 "root"인 경우에는 루트 컨텍스트(/)로 사용된다.
  • parentLoaderPriority - 클래스를 로딩할 때 부모 클래스로더에게 먼저 요청할지 아니면 웹 어플리케이션 클래스로더에서 먼저 로딩할지의 여부를 결정한다.
  • extract - 이 값이 true일 경우 war나 zip 파일을 배치하기 전에 먼저 임시 디렉토리에 압축을 푼다.
  • allowDuplicates - 이 값이 false일 경우 동일한 컨텍스트 경로나 war 파일이 이미 배치된 경우, 다시 배치하지 않는다.
  • defaultsDescriptor - 웹 어플리케이션을 설정할 때 사용할 (기본 값을 갖는) 설정 파일을 지정한다.
webapps 디렉토리에 루트 컨텍스트를 배포하고 싶다면 root.war 파일이나 root 디렉토리를 생성한 뒤 웹 어플리케이션을 복사해주면 된다.

contexts에 배포하기

웹 어플리케이션을 배포하는 두번째 방법은 context 디렉토리에 웹 어플리케이션 배치 설정 파일을 추가하는 것이다. etc/jetty.xml 파일을 보면 다음과 같은 설정 부분을 찾을 수 있다.

    <Call name="addLifeCycle">
      <Arg>
        <New class="org.mortbay.jetty.deployer.ContextDeployer">
          <Set name="contexts"><Ref id="Contexts"/></Set>
          <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
          <Set name="scanInterval">1</Set>
        </New>
      </Arg>
    </Call>

위 코드에서 configurationDir 프로퍼티는 컨텍스트 설정 파일을 검색할 디렉토리를 입력한다. 위 설정의 경우 [JETTY홈]/contexts 디렉토리에 위치하는 컨텍스트 설정 파일을 이용해서 컨텍스트를 추가하게 된다. scanInterval 프로퍼티는 디렉토리 검색 주기를 초 단위로 입력한다. 지정한 시간 단위로 컨텍스트 설정 파일의 추가, 변경, 삭제 여부를 검사하여 이에 맞춰 컨텍스트를 추가하거나 변경하거나 제거한다.

configurationDir 프로퍼티에서 지정한 디렉토리에 위치하는 xml 파일들은 각각 개별 컨텍스트 정보를 설정한다. 웹 어플리케이션을 추가할 때에는 다음과 같은 형식의 설정 파일을 추가해주면 된다.

    <?xml version="1.0"  encoding="ISO-8859-1"?>
    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
    
    
    <Configure class="org.mortbay.jetty.webapp.WebAppContext">
    
      <Set name="contextPath">/</Set>
      <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/hello.war</Set>
    
    </Configure>

contestPath 프로퍼티는 배포될 컨텍스트의 경로를 입력한다. 루트 컨텍스트인 경우 경로 값으로 '/'를 주면 된다. 다른 컨텍스트는 '/contextpath' 형식으로 컨텍스트 경로를 입력해주면 된다. war 프로퍼티에는 war 파일이나 웹 어플리케이션을 포함하고 있는 디렉토리 경로를 지정해주면 된다. 예를 들어, [JETTY홈]/webapps/hello 디렉토리에 웹 어플리케이션을 배포했다면 다음과 같이 war 프로퍼티의 값을 지정하면 된다.

    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/hello</Set>

맺음말

Jetty의 주요 특징으로는 다음과 같은 것들이 있다.

  • Ant, Maven, 이클립스 툴과의 연동을 지원하기 때문에, 개발 효율성을 증가시켜준다.
  • 간단한 Embedding. 코드에서 직접 Jetty 서버를 실행할 수 있다.
  • Comet 지원
  • 그외 가상 호스트, 응답 데이터 압축, SSL, 아파치 연동, JMX 연동 등 지원
Jetty는 매우 가벼운 웹 컨테이너이고 사용 방법도 매우 간단하다. 또한, Ant/Maven/이클립스 툴과 연동되기 때문에 개발을 효율성을 증가시켜준다. 필자 또한 개발 과정에서 Maven과 Jetty를 연동할 때 테스트 과정의 편리함을 느낄 수 있었다. 만약 톰캣의 대안을 찾고 있다면 Jetty를 고려해보기 바란다.

관련링크:

출처 - http://javacan.tistory.com/tag/Jetty%20%EC%82%AC%EC%9A%A9%EB%B2%95








Posted by linuxism
,