본문 바로가기
IBM - old/WAS Liberty 강좌

[Open]03.Maven 을 활용한 Open Liberty 활용 및 테스트

by freeman98 2017. 10. 14.

안녕하세요 이정운 입니다.

이번 강좌에서는 조금 더 개발 입장으로 들어가 개발시에 많이 사용하시는 Maven 을 이용해서 애플리케이션 개발을 위한 Open Liberty 서버 연동에 대한 부분을 한번 살펴보도록 하겠습니다. 또한, 해당 부분은 향후 자동화나 이런 부분에서도 많이 사용하시니 참고해두시면 좋을듯 합니다.

Building a web application with Maven
https://openliberty.io/guides/maven-intro.html

본 강좌는 상단의 링크에서 제공하는 가이드를 기반으로 테스트하고 작성하였습니다.
(이번 강좌에서는 기본적으로 maven 과 git 은 설치되어 있다는 가정을 하고 강좌를 진행하도록 하겠습니다.)


#1) Maven 을 이용한 Open Liberty 서버 연동

우선 빠르고 간편한 시작을 위해서 어느정도 형태가 작성되어 있는 가이드 샘플을 github 에서 다운로드 받습니다.

git clone https://github.com/openliberty/guide-maven-intro.git
cd guide-maven-intro/start

다운로드된 소스를 보시면 아시겠지만 간단한 웹 애플리케이션을 위한 기본 구조를 가지고 있으며 샘플 소스가 포함되어 있습니다.


특히, /src/main/liberty/config 폴더를 확인해보시면 하단과 같이 Open Liberty 를 위한 서버 설정 파일인 server.xml 이 포함되어 있는 것을 확인하실 수 있습니다.
(해당 파일은 향후에 maven 컴파일과 빌드시에 애플리케이션과 Open Liberty 가 같이 빌드되는데 이때, Open Libety 의 서버 설정으로 사용됩니다.)


참고로 윈도우즈에서 테스트 하는 경우라면 반드시 server.xml 파일을 열어서 주석을 "<!---, --->" 에서 "<!--, -->" 로 변경해주셔야 maven 컴파일시에 오류가 발생되지 않습니다. 또한, maven 에서 지정된 설정으로 동적으로 server.xml 설정을 변경하시려면 하단과 같이 변수로 설정을 입력해 놓으시면 됩니다.

<server description="Sample Servlet server">
    <featureManager>
        <feature>servlet-3.1</feature>
    </featureManager>
   
    <httpEndpoint httpPort="${default.http.port}" httpsPort="${default.https.port}" id="defaultHttpEndpoint" host="*" />
   
    <webApplication id="${app.context.root}" location="${app.context.root}.war" name="${app.context.root}"/>
</server>

기본 구조를 확인했으면 이제 본격적으로 maven 을 위한 기본 pom.xml 파일을 작성해보도록 하겠습니다. (pom.xml 에 대한 상세한 설명은 상단의 링크를 참고하시기 바라며 여기서는 Maven 강좌가 아니니 간단히만 설명드리겠습니다.)

<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.0http://maven.apache.org/maven-v4_0_0.xsd">;
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>net.wasdev.wlp.maven.parent</groupId>
        <artifactId>liberty-maven-app-parent</artifactId>
        <version>2.0</version>
    </parent>

    <!-- Add the rest of the POM below here. -->

</project>

기본 pom.xml 형식 에다 애플리케이션의 이름과 설명이 들어간 프로젝트 코디네이트 정보를 추가 합니다.

<groupId>io.openliberty.guides</groupId>
<artifactId>ServletSample</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>

그리고 프로젝트에서 사용할 프로퍼티 정보를 하단과 같이 추가 합니다. 간략히만 설명드리면 Java 의 버전과(1.8) 인코딩 형식(UTF-8) 등에 대한 정보를 지정하며 이 설정을 가지고 실제 Maven 이 애플리케이션에 대한 컴파일을 수행할 것입니다.

이외에 Maven 에서 사용할 프로퍼티 정보가 더 있다고 보시면 됩니다. (예를 들어 Open Liberty 에서 사용할 포트정보)

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <app.name>${project.artifactId}</app.name>
    <testServerHttpPort>9080</testServerHttpPort>
    <testServerHttpsPort>9443</testServerHttpsPort>
    <warContext>${app.name}</warContext>
    <package.file>${project.build.directory}/${app.name}.zip</package.file>
    <packaging.type>usr</packaging.type>
</properties>

다음으로 샘플 애플리케이션이 기본적으로 Servlet 을 사용할 거라 하단과 같은 dependency 를 추가합니다.

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

마지막으로 이 프로젝트를 빌드와 관련된 maven 플러그인 설정을 추가합니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <packagingExcludes>pom.xml</packagingExcludes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>net.wasdev.wlp.maven.plugins</groupId>
            <artifactId>liberty-maven-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <assemblyArtifact>
                    <groupId>io.openliberty</groupId>
                    <artifactId>openliberty-runtime</artifactId>
                    <version>17.0.0.3</version>
                    <type>zip</type>
                </assemblyArtifact>
                <serverName>${project.artifactId}Server</serverName>
                <stripVersion>true</stripVersion>
                <configFile>src/main/liberty/config/server.xml</configFile>
                <packageFile>${package.file}</packageFile>
                <include>${packaging.type}</include>
                <bootstrapProperties>
                    <default.http.port>${testServerHttpPort}</default.http.port>
                    <default.https.port>${testServerHttpsPort}</default.https.port>
                    <app.context.root>${warContext}</app.context.root>
                </bootstrapProperties>
            </configuration>
            <executions>
                <execution>
                    <id>package-server</id>
                    <phase>package</phase>
                    <goals>
                        <goal>package-server</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/wlp-package</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

여기까지 잘 따라오셨다면 기본적인 pom.xml 파일 작성이 완료된 것이며 하단과 같이 'mvn install' 을 수행합니다. 즉, maven 을 이용해서 pom.xml 에 지정된 형태로 컴파일과 빌드를 수행합니다.

mvn install


문제가 없이 정상적으로 수행이 완료되면 target 폴더에 하단과 같은 디렉토리 구조를 확인할 수 있습니다. (참고로 liberty 폴더에 Open Liberty 서버가 설치된 형태로 구성됩니다.)


그러면 이제 maven 명령을 이용해서 설치된 Open Liberty 서버를 구동해서 실제 서비스를 수행하기 위하여 "mvn liberty:start-server" 를 수행합니다.


이제 웹브라우저를 통해서 'http://localhost:9080/ServletSample/' 로 접속해보면 하단과 같이 샘플 Servlet 에 대한 결과를 확인 가능합니다.


참고적으로 Open Liberty 서버에 대한 변경없이 구동중인 상태에서 애플리케이션만 재배포 및 결과를 확인하고 싶으시다면 "mvn package" 명령을 사용하시면 됩니다. 또한, "mvn liberty:stop-server" 명령을 통해서 Open Liberty 서버에 대한 중지가 가능하며 그외의 다양한 liberty-maven-plugin 의 다양한 goal 은 하단의 링크를 통해서 확인해보시기 바라겠습니다.

ci.maven
https://github.com/WASdev/ci.maven


추가로 target/liberty/wlp/usr/servers/ServletSampleServer 폴더에 보시면 기존에 설명했던 server.xml 이외에 하단과 같은 형태의 bootstrap.properties 파일이 추가된 것을 확인할 수 있습니다. 보시면 아시겠지만 maven 에서 사용했던 변수들이며 이 설정을 이용해서 server.xml 의 변수를 치환해서 구동하는 형태입니다.  (JVM 관련 옵션을 추가하시려면 jvm.options 파일을 추가해서 넣으면 됩니다.)

# Generated by liberty-maven-plugin
app.context.root=ServletSample
default.http.port=9080
default.https.port=9443


#2) Maven 에 JUnit 을 통한 Test 단계 추가

기존에는 maven 을 통해서 컴파일과 빌드만 수행했는데 요즘은 대부분 JUnit 을 통한 Test 단계를 기본적으로 수행하는 경우가 많습니다. 그래서 해당 부분에 대한 부분도 간단히 테스트해서 공유드리겠습니다.

우선 당연하겠지만 Test 를 위한 소스를 하단과 같이 작성합니다.

package io.openliberty.guides.hello.it;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
public class EndpointIT {
    private static String URL;
    @BeforeClass
    public static void init() {
        String port = System.getProperty("liberty.test.port");
        String war = System.getProperty("war.name");
        URL = "http://localhost:"; + port + "/" + war + "/" + "servlet";
    }
    @Test
    public void testServlet() throws Exception {
        HttpClient client = new HttpClient();
        GetMethod method = new GetMethod(URL);
        try {
            int statusCode = client.executeMethod(method);
            assertEquals("HTTP GET failed", HttpStatus.SC_OK, statusCode);
            String response = method.getResponseBodyAsString(1000);
            assertTrue("Unexpected response body", response.contains("Hello! How are you today?"));
        } finally {
            method.releaseConnection();
        }
    }
}

기본적으로 Test 를 위한 소스의 구조는 하단처럼 작성되면 되며 기존 프로젝트에 test 폴더가 추가된 형태입니다. 지금 작성된 소스는 "src/test/java/io/openliberty/guides/hello/it/EndpointIT.java" 여기에 두시면 됩니다.



그리고 기존 pom.xml 에 test 수행을 위한 maven 플러그인을 추가합니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <includes>
                    <include>**/it/**</include>
                </includes>
                <systemPropertyVariables>
                    <liberty.test.port>${testServerHttpPort}</liberty.test.port>
                    <war.name>${warContext}</war.name>
                </systemPropertyVariables>
            </configuration>
        </execution>
    </executions>
</plugin>

마지막으로 실제 test 시에 사용되는 JUnit 과 같은 라이브러리에 대한 dependency 를 추가 합니다.

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

이제 이전 파트와 동일하게 mvn install 해보시면 하단과 같이 중간에 테스트 단계까지 거치는 것을 확인 가능하십니다.


그럼 이번 강좌는 여기서 마무리 하는 것으로 하겠습니다.  휘리릭~~~


댓글