'jersey'에 해당되는 글 1건

  1. Jersey 2, JAX-RS + MVC 적용하기

Jersey 2, JAX-RS + MVC 적용하기

개요

최근 회사에서 N 포탈과의 제휴 서비스를 Jersey 2로 개발하면서 생산성 측면에서 쏠쏠한 재미를 보았다. 이번 글은 Jersey 2 프레임워크에서 MVC 패턴을 적용하는 방법을 간단히 설명하고자 한다.

Jersey란 무엇인가?

Jersey 2Oracle이 직접 JAX-RS 표준을 구현한 공식 레퍼런스 구현체로 Java 플랫폼에서 RESTful Web Services를 높은 생산성으로 구현하고 소비할 수 있게 해주는 프레임워크이다.(JAX-RS 표준이 서버만을 고려하여 작성된 데 반해 Jersey 2는 클라이언트 입장에서도 서비스를 편리하게 소비할 수 있도록 구현되었다.)

MVC 패턴을 적용해보자

Jersey 2는 기본적으로 RESTful Web Services에 초점을 맞추고 있지만 공식적으로 제공되는 jerser-mvc-jsp 확장 모듈을 사용하여 국내 Java 웹 개발의 표준이나 다름 없는 Spring MVC 만큼이나 직관적이고 편리한 MVC 기능을 사용할 수 있다. Maven 기반의 프로젝트임을 가정하고 MVC 패턴 적용 방법을 차례로 설명한다. Jersey 2 기본 프로젝트 생성은 이 글을 참고한다.

/pom.xml

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-mvc-jsp</artifactId>
    <version>2.19</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
  • jersey-mvc-jsp 라이브러리는 MVC 기능을 제공하는 Jersey 2의 확장 모듈이다.
  • JSP 파일 작성시 JSTL 표준 템플릿 태그를 사용하기 위해 standard, jstl 라이브러리를 추가하였다.

/src/main/java/.../AppConfig.java

@ApplicationPath("/")
public class AppConfig extends ResourceConfig {

    public AppConfig() {

        packages(this.getClass().getPackage().getName());
        register(JspMvcFeature.class);
    }
}
  • 웹 애플리케이션 기동시 org.glassfish.jersey.servlet.ServletContainer에 읽혀질 환경 설정 파일이다. JspMvcFeature.class를 등록하여 MVC 기능을 활성화한다.
  • @ApplicationPath("/") 명시는 / 경로(ContextPath)에 대한 모든 요청시 이 환경설정이 적용된다는 것을 의미한다.

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

<filter>
    <filter-name>jersey-mvc-filter</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.jsonobject.sample.AppConfig</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.servlet.filter.contextPath</param-name>
        <param-value></param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name>
        <param-value>/WEB-INF/jsp</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
        <param-value>/assets/.*</param-value>
    </init-param>
    </filter>
<filter-mapping>
    <filter-name>jersey-mvc-filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • Servlet 3.x 기반의 프로젝트라면 web.xml에 별도로 Jersey 2ServletContainer 클래스를 등록하지 않아도 된다. 그럼에도 위와 같이 FilterServletContainer를 등록한 것은 이미지, JavaScript, CSS와 같은 정적인 파일(Static Assets)을 처리하기 위함이다.
  • jersey.config.server.mvc.templateBasePath.jsp에 대한 값으로 /WEB-INF/jsp 경로를 명시하였다. MVC 패턴의 View로서 기능하는 JSP 파일은 모두 /src/main/webapp/WEB-INF/jsp 폴더에 위치한다는 의미이다.
  • jersey.config.servlet.filter.staticContentRegex에 대한 값으로 /assets/.* 정규식을 명시하였다. /assets/css/some.css와 같은 정적 파일 요청시 특정 Resource 클래스로 분기하지 않고 바로 처리하겠다는 의미이다.

/src/main/java/.../HelloResource.java

@Path("/")
public class HelloResource {

    @GET
    @Path("helloworld")
    @Produces(MediaType.TEXT_HTML)
    public Viewable getSource() {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("title", "Hello!");
        model.put("message", "Hello, World!");
        return new Viewable("/helloworld.jsp", model);
    }
}
  • Viewable 클래스는 MVC 패턴의 View 기능을 하는, Jersey 2가 독자적으로 제공하는 클래스이다. Spring MVC에 익숙한 개발자라면 ModelAndView 클래스와 유사한 것을 느낄 것이다. 클라이언트의 요청에 대해 처리한 결과를 Model 오브젝트에 담아 Viewable 오브젝트에 전달하여 동적인 View를 생성한다.

/src/main/webapp/WEB-INF/jsp/helloworld.jsp

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>${it.title}</title>
</head>
<body>
${it.message}
</body>
</html>
  • 마지막 단계이다. 앞서 전달 받은 Model 오브젝트는 ${it.modelName}과 같은 형태로 View에 맵핑되어 클라이언트에 응답으로 반환된다.

결론

최근 해외에서는 Python 진영의 Flask 프레임워크가 웹 개발시 높은 생산성으로 많은 인기를 얻고 있다. Java 진영에도 Flask와 대적할만한 Dropwizard 프레임워크가 있다. DropwizardJava 진영의 여러 유용한 라이브러리를 엄선, 짜집기하여 만든 종합선물세트이자 맥가이버 칼과도 같은 프레임워크라고 볼 수 있다. 흥미로운 점은 JAX-RS 표준을 구현한 많은 프레임워크 중에 Jersey 2DropwizardREST 담당 모듈로 선정되었다는 것이다. 그만큼 성능을 인정 받은 것이라고 평가할 수 있다. 엄격한 표준 구현, 높은 생산성 측면에서 Spring MVC에만 익숙했던 국내 개발자들에게 Jersey 2MVC의 조합을 추천한다.

참고 문서

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