반응형

Web 응용 프로그램의 개발도 물론 Maven을 사용할 수 있다. 이에 대한 작업과 pom.xml에 대해 설명한다.



일반적인 Java 응용 프로그램과 달리 Web 응용 프로그램은 여러가지 고려해야 할 것이 있다. 먼저 프로그램의 구성이다. 일반적인 Web 응용 프로그램 개발에서는 Web에 공개하는 디렉토리를 준비하고 그 안에 JSP 등을 배치한다. 또한 "WEB-INF"폴더를 준비하고, 거기에 web.xml을 준비한다. 이러한 디렉토리의 구성에 따라 프로젝트를 만들어 나가야 한다.

또한, Web 응용 프로그램은 그대로 실행할 수 없다. 실행은 서블릿 컨테이너(이른바 Java 서버)가 필요하다. 서버를 시작하고, 거기 Web 응용 프로그램이 배포되어야 사용할 수 있게 된다.

이에 따라, Web 어플리케이션의 개발에는 일반 Java 어플리케이션과는 다른 만드는 방법이 필요하다.

maven-archetype-webapp를 사용하기

Web 응용 프로그램의 프로젝트 작성에는 "maven-archetype-webapp"라는 것을 사용한다. 명령 프롬프트 또는 터미널에서 다음과 같이 실행한다.

$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp

이것으로 Web 응용 프로그램의 프로젝트를 생성하기 위한 템플릿이 사용된다. 예제로 다음과 같이 항목을 입력한다.

Define value for property 'groupId': : com.devkuma
Define value for property 'artifactId': : SampleWebApp
Define value for property 'version':  1.0-SNAPSHOT: : 
Define value for property 'package':  com.devkuma: : 
  • 그룹 ID : com.devkuma
  • 아티팩트 ID : SampleWebApp
  • 버전 : 1.0-SNAPSHOT : :( 기본 상태)
  • 패키지 : com.tuyano.libro : :( 기본 상태)

입력이 완료되면 SampleWebApp라는 프로젝트가 생성된다. 이것을 바탕으로, Web 어플리케이션 개발을 하면 된다.

생성된 프로젝트의 구성

그럼 생성된 프로젝트가 어떻게 되어 있는지 확인해 보자. 프로젝트 폴더를 열면 다음과 같은 구성으로 되어 있다.

SampleMavenApp 폴더

.
├── pom.xml
└── src
    └── main
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

main 폴더의 내용

src 폴더 안에는 main 폴더가 있고, 그 안에는 java 폴더가 아닌 대신에, resources와 webapp이 배치된다. 또한 test 폴더도 포함되어 있지 않다.

resources 폴더

resources 폴더는 그 이름 그대로, Web 어플리케이션의 프로젝트에 필요한 리소스 파일을 배치하는 곳이다.

webapp 폴더

이 폴더가 Web 어플리케이션으로서 공개되는 부분이다. 이 안에는 JSP 파일과 WEB-INF 폴더가 준비되어 있다. HTML 및 CSS, JavaScript 등의 파일이 그 안에 들어 가면 된다.

서블릿은?

Java 프로젝트이면서, 여기에는 java 폴더가 없다. 서블릿 등을 만들려고 하면 어떻게 되는 거야? 라고 생각한 사람도 있을 것이다.

java 폴더는 없지만, 프로그램 작성의 기본은 동일하다. 따라서 main 폴더에 java 폴더를 준비하고, 그 안에 패키지 폴더 및 소스 코드 파일을 배치해 나가면 된다.

생성된 pom.xml

생성된 프로젝트의 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>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>SampleWebApp</finalName>
  </build>
</project>

보면 알 수 있듯이, pom.xml 자체는 일반적인 Java 응용 프로그램의 pom.xml와 거의 변함이 없다.

우선, 이제 제대로 개발할 수 있는지 확인해 본다. 다음 명령을 실행해 보자.

$ mvn package

실행하면 target 폴더가 생성되고, 그 안에 SampleWebApp.war 파일이 생성된다. 이 파일의 압축을 풀어 보면, webapp 폴더의 내용을 정리하고 있다. 또한, main 안에 java 폴더를 생성하고, 소스 코드를 준비 했다면, WEB-INF 폴더에 classes 폴더를 배치되고 거기에 클래스 파일이 포함될 것이다. 일단, Web 어플리케이션으로의 기본 부분은 잘 만들어져 있는 것을 알 수 있다.

이것으로 Maven 명령에서 war 파일을 만들고 이것을 Java 서버에 배포한다면, 이것으로 충분히 개발이 가능할 것이다.



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 애플리케이션 개발의 기본 기능으로서 사용법을 기억해 두자.

반응형

+ Recent posts