Maven 입문 | Web 응용 프로그램 개발 | jetty-maven-plugin Web 실행

Web 어플리케이션의 개발을 수행하면서 매번 “패키지를 작성하여 war 파일을 Java 서버에 배포하고 ……” 하는 것보다 바로 Java 서버를 시작하고, 거기에 빌드한 Web 어플리케이션를 기동하여 동작 체크한다면 매우 편리할 것이다.

그래서, 서블릿 컨테이너 “Jetty"을 이용하여 동작 확인을 실시할 수 있는 구조를 갖춰 보도록 해보자. 해야 하는 것은 물론 pom.xml 편집이다.

이번에는 여러가지 해야 할 것이 많기 때문에, 우선은 완성 버전을 올려두기로 한다. 아래에 이번 프로젝트의 완성된 pom.xml은 아래와 같다. 처음 본 것이 여러가지가 있지만 우선이 이대로 다시 작성한다.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.devkuma</groupId>
  <artifactId>SampleWebApp</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>SampleWebApp Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty.version>9.4.8.v20171121</jetty.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jetty.version}</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-webapp</artifactId>
      <version>${jetty.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>SampleWebApp</finalName>
    <plugins>
      <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.version}</version>
      </plugin>
    </plugins>
  </build>
</project>

설치 실행

수정한 후 프로그램을 빌드하고 로컬 환경에 설치한다. 이것은 다음 명령을 실행한다.

$ mvn install

이 명령어는 로컬 저장소(로컬 환경의 라이브러리 장치를 관리하는 곳)에 빌드한 프로그램을 설치하는 것이다. 다만, 여기에서는 필요한 라이브러리을 다운로드, 프로그램 빌드 및 war 파일 생성과 같은 일련의 작업을 수행할 목적으로 수행하고 있다.

처음 실행할 때는 필요한 라이브러리을 중앙 저장소에서 다운로드한다. 따라서 꽤 시간이 걸린다. 2번째 이후는 내 컴퓨터 이미 다운로드가 되어 있기에 그다지 시간이 오래 걸리지 않는다.

Jetty 실행

프로그램이 성공적으로 빌드되면, Jetty를 사용하여 Web 응용 프로그램을 실행한다. 이것은 다음의 명령으로 실행할 수 있다.

$ mvn jetty:run

이 명령도 처음 실행할 때 필요한 라이브러리를 중앙 저장소에서 다운로드한다. 그리고 Jetty를 시작하고, 생성된 Web 응용 프로그램을 배포한다. 부팅 처리가 완료되면 다음 주소에 접근해 본다.

http://localhost:8080/

Web 브라우저가 열리면 화면에 “Hello World!“가 표시된다. 이는 webapp 안에 기본적으로 포함되어 있는 index.jsp가 표시되는 것이다. 이걸로 서버가 기동되고 Web 응용 프로그램에 액세스할 수 있는지 확인할 수 있다.

대충 동작 확인을 한 후에 명령 프롬프트 또는 터미널에서 “Ctrl + C"키를 눌러 명령의 실행을 중단한다. 그러면 서버가 종료하고 원래의 입력 대기 상태로 돌아온다.

속성 및 변수

그럼, 만든 pom.xml에 대해 살펴 보겠다. 우선 먼저 눈에 띄는 것은 패키지에 대한 설정이다.

<packaging>war</packaging>

이것이다. 이렇게 하면 빌드된 프로그램은 Jar 파일이 아닌, war 파일이 만들어 진다. Web 어플리케이션의 경우, <packaging>는 war가 기본이다.

속성에 대해

또, 매우 중요한 역할을 하는 것이 <properties> 태그이다. 만든 pom.xml을 보면 이렇게 적혀 있다.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jetty.version>9.4.8.v20171121</jetty.version>
</properties>

<project.build.sourceEncoding> 태그는 이미 설명했었다. 소스 파일의 인코딩을 지정하는 것이다.

또 다른 하나는 <jetty.version>라는 태그이다. 이것은 Jetty 버전을 지정한다. 그러면 9.4.8.v20171121 버전(2017 년 12 월 현재 최신 버전)이 jetty.version라는 속성에 지정된다.

이것이 어떻게 이용되고 있는지, 다른 곳을 보면 알 수 있다. 예를 들어, <dependencies> 태그를 보면 아래와 같이 작성된 것을 볼 수 있다.

<version>${jetty.version}</version>

${jetty.version}라는 것으로 <jetty.version>의 값을 설정하고 있다. 이 ${jetty.version}은 jetty.version라는 변수이다. 즉, <jetty.version>라는 것은 jetty.version라는 변수를 만드는 것이다.

Jetty 버전 변수인 jetty.version는 이런 이름이 정해져 있는 것이 아니다. 우선 알기 쉬운 이름으로 붙인 것이다. 변수 이름은 각각 원하는대로 붙여 상관 없다. 예를 들어 “myval"라는 변수를 사용하고 싶다면, <myval>라는 태그로 값을 준비하고 ${myval}라는 형태로 변수를 이용된다.

pom.xml에는 특정 버전에 맞게 라이브러리를 준비할 수 있다. 이럴 때는 미리 변수를 준비하고 버전 이름을 설정해 두고 그 변수를 사용하여 각각의 라이브러리를 구성할 수 있도록 하는 경우가 있다.

이렇게 하면, 예를 들어 버전을 변경하면 <jetty.version>의 값을 다시 작성하기만 하면 된다. 그러지 않고 각각의 라이브러리에 개별적으로 값을 작성하게 되면, 전체 값을 찾아서 다시 변경해야 한다. 그러다가 변경되지 않고 이전 버전의 남아 있는 라이브러리가 나올지도 모른다.

이렇게 <proierties> 태그에 속성을 준비하여 변수를 만드는 방식은 다수의 라이브러리와 플러그인 등에 이용할 수 있는 필수 기능이다.

Jetty의 이용에 대해

그런데, 이번은 Maven의 기능 중에서도 가장 중요한 “의존 라이브러리 관리"를 하고 있다. <dependencies> 태그를 살펴 보자. JUnit 라이브러리 외에 2개의 라이브러리 설정이 추가되는 것을 알 수 있다(아래 참조).

의존 라이브러리

<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-server</artifactId>
   <version>${jetty.version}</version>
</dependency>
<dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-webapp</artifactId>
   <version>${jetty.version}</version>
</dependency>

이것들은 Jetty 이용에 관한 것이다. 각각의 역할을 간단하게 설명하면 아래와 같다.

jetty-server

첫번째는 Jetty 서버의 라이브러리이다. Jetty 서버의 기본 라이브러리가 포함된다.

jetty-webapp

이것은 Jetty Webapp 및 Security, Servlet, XML 등 Web 어플리케이션 관련 라이브러리 장치가 포함된다. 이 라이브러리가 없어도 Jetty 서버 자체는 시작할 수 있지만, Web 어플리케이션에서 사용되는 자원에 따라 동작에 문제가 생길 가능성도 있으므로, jetty-server와 세트로 준비한다.

Jetty 플러그인

라이브러리 외에 Jetty 서버를 시작하는 플러그인 설정도 필요하다. jetty-maven-plugin라는 것으로, 그룹 ID, 아티팩트 ID 및 버전의 최소한의 설정만 준비해두면 된다.

Jetty플러그인

<build>
    <finalName>SampleWebApp</finalName>
    <plugins>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>${jetty.version}</version>
        </plugin>
    </plugins>
</build>

앞에서 mvn jetty:run으로 Jetty를 시작했지만 이를 가능하게 했던 것이 이 Jetty 플러그인이다. 특별히 설정도 필요없이 간단하다. 이 플러그인으로 Jetty를 사용한 Web 어플리케이션의 실행이 가능하게 된다.

이상, 2개의 <dependency>과 하나의 <plugin>를 추가하면 Jetty에서 Web 응용 프로그램을 실행 동작시킬 수 있다. Web 애플리케이션 개발의 기본 기능으로서 사용법을 기억해 두자.