Gradle Web 어플리케이션 개발

Gradle은 Web 어플리케이션의 개발에도 사용할 수 있다. 이에 프로젝트의 생성과 Web 개발용 플러그인 사용법에 대해 설명한다.

Web 어플리케이션 프로젝트

일반적인 Java 어플리케이션은 gradle init으로 생성하였다. 그러면 Web 어플리케이션은 어떻게 생성하고 구성되는지 설명한다.

Web 어플리케이션 생성

Web 어플리케이션은 프로그램의 구성도 또한 실행 방법도 다르다. Java 클래스뿐만 아니라 HTML 및 JSP도 사용하므로, 그 파일들을 하나로 모와서 war 파일을 작성해야 한다. 또한 실행은 서블릿 컨테이너 (이른바 Java 서버)도 필요하다.

이렇게 생각한다면, 일반 Java 어플리케이션 생성 방법으로는 되지 않는다고 생각할 것이다. 그러면 일단 실제 프로젝트를 만들면서 Web 애플리케이션 개발 단계를 설명한다.

우선 프로젝트를 만든다. 명령 프롬프트 또는 터미널을 시작하고 적당한 위치에 프로젝트 디렉터리를 준비한다.

$ mkdir GradleWebApp
$ cd GradleWebApp

여기에서는 “GradleWebApp"라는 디렉터리를 만들고, 그 안으로 이동하고 Gradle의 초기화를 실시한다.

$ gradle init --type java-application

이것으로 생성이 된다. 그런데 보면 알 수 있듯이, 극히 일반 Java 어플리케이션과 같은 방식이다.

$ mkdir GradleWebApp
$ cd GradleWebApp
$ gradle init --type java-application
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 16s
2 actionable tasks: 2 executed
$ ls
build.gradle    gradle          gradlew         gradlew.bat     settings.gradle src

사실은 2017년 12월 시점에 Gradle에는 “Web 어플리케이션 전용 타입” 이라고 하는 것은 준비되어 있지 않다. 따라서 java-application 타입을 초기화하고, 나머지는 수동으로 프로젝트를 만들어 갈 수 밖에 없다.

Web 응용 프로그램 폴더 구성

그럼, Web 어플리케이션의 폴더 구성을 준비한다. Web 어플리케이션의 폴더는 다음과 같은 형태로 구성된다.

GradleWebApp 폴더

.
├── build.gradle, 그외 생략
└── src
    └── main
    │   ├── java
    │   ├── resources
    │   └── webapp
    │       └── WEB-INF
    └── test
        └── java
            └── AppTest.java

우선 어플리케이션 프로그램 관련에 대해 정리한다. ’test’ 등은 직접 관계 없기 때문에 설명은 생략한다.

Web 어플리케이션 및 일반 Java 어플리케이션의 가장 큰 차이점은 main 폴더에 있는 폴더의 구성이다. 여기에는 아래와 같이 3개의 폴더가 있다.

  • java폴더 익숙한 Java 소스 코드 파일을 배치하기 위한 폴더이다. 서블릿 등은 여기에 소스 코드를 배치한다.

  • webapp 폴더 이는 Web 어플리케이션의 공개되는 폴더로 정적 웹 자원을 두는 곳이다. JSP 파일이나 HTML 파일 등은 여기에 배치한다. 또한 여기에는 WEB-INF 폴더를 준비하고 그 안에 web.xml을 배치한다.

  • resources 폴더 Web 어플리케이션의 프로그램에 필요한 자원을 제공한다. 이는 Web 페이지에 표시할 이미지 파일 등은 아니다(그것들은 webapp 이다). 예를 들어, JPA 등을 이용할 때 준비하는 persistence.xml 같은 프로그램이 필요로 하는 리소스 파일이다.

 

그럼, 만든 GradleWebApp 안에 이러한 폴더들을 준비한다. main 안에 새롭게 webapp와 resources를 만들고 webapp에 추가로 WEB-INF를 생성한다.

web.xml

Web 어플리케이션의 각종 정보를 작성하는 web.xml를 준비한다. 여기에서는 최신 버전으로 Servlet 3.1를 사용한다.

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
       version="3.1">

</web-app>

서블릿 준비

Web 어플리케이션에서 표시하는 Web 페이지로 간단한 서블릿을 작성한다.

main 폴더에 있는 java 폴더에 com 폴더 그 안에 devkuma 폴더 또는 그 안에 web 폴더를 만든다. 그리고 web 에 SampleServlet.java라는 이름으로 Java 소스 코드 파일을 작성한다. 소스 코드의 내용은 아래와 같다.

package com.devkuma.web;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/hello")
public class SampleServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html><head><title>Servlet</title></head>");
        out.println("<body><h1>Sample Servlet</h1>");
        out.println("<p>Welcome to Sample Servlet page!</p>");
        out.println("</body></html>");
    }
}

여기에서는 @WebServlet 어노테이션을 사용하여 /hello 서블릿을 주소를 설정하고 있다. 이 설정으로 인해 Servlet API 3.0 이상이 필요하다. 서블릿 컨테이너의 버전에 따라 동작하지 않는 경우도 있으므로 잘 확인해야 한다(단, 동작 체크 자체에는 외부의 서블릿 컨테이너는 사용하지 않기 때문에 문제는 일어나지 않을 것이다).

그외에 webapp 폴더에 JSP 파일이나 HTML 파일 등을 배치 해두면 된다.

최종 폴더 및 파일 구조

최종으로 파일을 모두 만들면 같이 된다.

.
├── build.gradle, 그외 생략
└── src
    ├── main
    │   ├── java
    │   │   ├── App.java
    │   │   └── com
    │   │       └── devkuma
    │   │           └── web
    │   │               └── SampleServlet.java
    │   ├── resources
    │   └── webapp
    │       └── WEB-INF
    │           └── web.xml
    └── test
        └── java
            └── AppTest.java

build.gradle 빌드 파일 작성

Web 어플리케이션을 위한 build.gradle를 작성한다. 이번에는 일반적인 Java 응용 프로그램과 여러가지가 다른 부분이 있다.

build.gradle

우선 아래에 build.gradle의 전체 소스 코드는 아래와 같다.

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'gretty'
 
buildscript {
    repositories {
        jcenter()
    }
 
    dependencies {
        classpath group:'org.akhikhl.gretty', name:'gretty-plugin', version:'+'
    }
}
 
repositories {
    jcenter()
}
 
dependencies {
    testCompile group:'junit', name:'junit', version:'4.12'
}

우선, 전체 코드를 작성하면 실제로 동작시켜 본다. 다음과 같이 명령을 실행한다.

$ gradle war

이는 Web 응용 프로그램을 war 파일로 생성하기 위한 것이다. 실행하면 프로젝트의 build 폴더에 있는 libs 폴더에 “GradleWebApp.war"라는 War 파일이 생성된다.

이어 응용 프로그램의 동작 체크를 한다. 다음과 같이 실행한다.

$ gradle run

실행되면 Jetty가 다운로드되고, 바로 기동된다. 그러면 아래 주소에 액세스해 본다. 서블릿에 액세스되고 화면이 나타난다.

http://localhost:8080/GradleWebApp/hello

사용 플러그인

그럼, build.gradle에 플러그인 내용을 확인해 보자. 여기에서는 3개의 플러그인이 포함되어 있다.

apply plugin : 'java'
apply plugin : 'war'
apply plugin : 'gretty'

최초의 “java"는 이미 익숙할 것이다. Java 프로그램에 대한 compileJava 등의 테스크를 제공하는 플러그이다.

“war” 플러그인은 이름 그대로 war 파일로 패키징하기 위한 플러그인이다. 이는 Web 응용 프로그램에서 필수 플러그인이라고 할 수 있다. 앞에서 gradle war는 이 플러그인에서 제공하는 것이다.

“gretty"는 Jetty 서블릿 컨테이너를 이용하기 위한 플러그인이다. 이 Gretty는 Groovy에서 Jetty를 이용하기 위한 것으로, 앞에서 실행했던 gradle run으로 Jetty를 시작하고 이 Web 어플리케이션이 기동된 것이다.

buildscript와 dependencies

build.gradle에는 낯선 문장이 추가되어 있다. 그것은 “buildscript"라는 것이다. 이것은 다음과 같은 형태로 되어 있다.

buildscript {
    repositories {
        ...... 저장소 ......
    }

    dependencies {
        ...... 패키지 지정 ......
    }
}

이 buildscript라는 것은 빌드 스크립트를 위한 것이다. 빌드 스크립트라는 것은 그 이름대로 빌드를 위해 실행되는 스크립트이다. Gradle에 있는 기능 그대로 빌드를 할 경우에는 이 buildscript이 필요없다. 이것은 빌드할 때 외부 라이브러리 등을 사용하는 경우에 필요하다.

이번에는 Gretty 플러그인을 사용하고 있지만, 이것은 Gradle 표준이 아니라 외부 라이브러리이다. 따라서 빌드시 어떤 저장소에서 어떤 라이브러리를 사용할 것인지를 지정해야 한다. 그 부분이 buildsript에 있는 repositories과 dependencies이다. 이전에 이미 설명했던 내용이다.

이 buildscript 이 후에 repositories과 dependencies이 있지만, 이것은 빌드 처리 이외의 곳에서 사용되는 것이다. 여기에서는 JUnit이 dependencies에 준비되어 있다.

 

이것으로 Web 어플리케이션의 프로젝트 빌드 및 실행에 대해 대략 알아 보았다.




최종 수정 : 2017-12-22