Maven, Servlet 3, Jersey 2 기반의 Hello, World! 웹 프로젝트 작성하기

개요

스마트폰이 등장한 이래 웹 서비스를 소비하는 클라이언트의 종류가 다양해지면서 단순히 렌더링된 페이지를 보여주는 웹 서비스에서 API를 통해 다양한 클라이언트에 대응할 수 있는 RESTful Web Services의 중요성이 날로 높아지고 있다. 이러한 요구에 대응하기 위해 JAX-RS(Java API for RESTful Web Servies)Java EE 6부터 표준으로 포함되었다. Jersey는 바로 이 JAX-RS 표준을 충실히 구현한 웹 프레임워크이다. 이번 글에서는 Maven, Servlet 3, Jersey 2 기반의 Hello, World! 웹 프로젝트를 작성해 보고자 한다. Eclipse IDE for Java EE Developers가 설치되어 있어야 한다. Eclispe EE의 설치 방법은 이 글을, Maven 프로젝트 생성은 이 글을 참고한다.

/pom.xml

본격적인 소스 코드 작성에 앞서 관련 라이브러리에 대한 의존성 정보를 추가해야 한다. pom.xml 파일을 열고 /project/dependencies 엘레먼트에 아래 내용을 추가해야 한다. 저장 후 프로젝트명 우클릭하고 Run As -> Maven install을 실행한다.

<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.jsonobject</groupId>
    <artifactId>helloworld</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>HelloWorld Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>2.17</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.17</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-sse</artifactId>
            <version>2.17</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.17</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>helloworld</finalName>
    </build>
</project>
  • javax.servlet-apiServlet 3.1을 사용하기 위한 필수 구성이다.
  • jersey-container-servlet-core, jersey-container-servletJersey 프레임워크를 사용하기 위한 필수 구성이다.
  • jersey-media-sseServer-Sent Event를 다룰 경우 필요하며 jersey-media-json-jackson은 요청 데이터와 결과 데이터로 JSON을 다룰 경우 필요하다.
  • junit은 테스트를 위해, logback-classic은 로깅을 위한 구성이다.
  • joda-timeJava 8 미만의 개발환경에서 날짜와 시간을 쉽게 다루기 위한 구성이다.

/src/main/webapp/WEB-INF/web.xml

<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"
    metadata-complete="true" version="3.1">
    <display-name>HelloWorld</display-name>
</web-app>
  • Servelt 3의 장점을 살려 web.xml 설정은 display-name을 주는 것만으로 충분하다. SevletContainer 설정은 클래스로 대신 작성한다.

/src/main/java/com/jsonobject/helloworld/config/ApplicationConfig.java

package com.jsonobject.helloworld.config;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/rest")
public class ApplicationConfig extends ResourceConfig {
    public ApplicationConfig() {
        packages("com.jsonobject.helloworld.resource");
    }
}
  • web.xml 설정에서 생략한 SevletContainer 설정을 여기에 작성한다. URI=/rest로 들어오는 모든 요청을 com.jsonobject.helloworld.config 패키지의 Resource 역할을 담당하는 클래스로 분기한다.

/src/main/java/com/jsonobject/helloworld/resource/HelloWorldResource.java

package com.jsonobject.helloworld.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/helloWorld")
public class HelloWorldResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String helloWrold() {
        return "Hello, World!";
    }
}
  • 한 눈에 봐도 서블릿 클래스만으로 RESTful Web Service를 작성할 때보다 훨씬 소스 코드가 간결하다는 것을 알 수 있을 것이다. 프레임워크가 눈에 보이지 않는 부분에서 대신 많은 번거로운 작업을 수행해준다.
  • 클래스, 메써드마다 @Path 어노테이션으로 특정 URI에 대한 요청을 처리할 수 있다. 위 예제는 클래스에서 /rest/helloWorld 요청을 받는다.
  • @Produces 어노테이션으로 요청에 대한 응답 데이터의 형식을 명시할 수 있다. 위 예제는 단순히 Hello, World! 문자열을 출력하므로 text/plain을 명시하였다. 한편, @Consumes 어노테이션으로 요청 데이터의 형식을 명시할 수 있다.
  • 작성이 완료되었으면 실행할 차례이다. 메뉴에서 Run -> Run as -> Run on Server를 실행한다. 브라우저에서 http://localhost:8080/helloworld/rest/helloworld 주소를 입력하면 화면에 Hello, World! 문자열이 출력되는 것을 확인할 수 있다.

참고 글


저작자 표시 비영리 동일 조건 변경 허락
신고