Apache Wink는 사실상 JAX-RS 스펙을 구현한 것으로 빠르게 확산되고 있다. JSON.org와 Jettison은 JSON 동기화를 기본적으로 제공하지만 몇 가지 문제점이 있다. 예를 들면, 배열 표현과 제한된 리턴 유형으로 인해 JAX-RS 서비스와 클라이언트 Ajax 애플리케이션을 코딩하기 어렵다.
이 기사에서는 Apache Wink를 사용하는 기존의 웹 애플리케이션에서 Jackson JSON 제공자를 사용할 수 있도록 구성하는 방법을 설명한다. Jackson을 사용하는 간단한 JAX-RS 웹 서비스 샘플 코드를 사용함으로써 Jackson JSON 제공자의 장점을 살펴본다.
Apache Wink 표준 배포판에는 두 가지 JSON 제공자(JSON.org와 Jettison 구현물)가 포함되어 있다. 이 두 가지 제공자는 모두 Wink 서비스와 Ajax 애플리케이션의 통합을 복잡하게 하는 문제점을 안고 있다. XML 요소를 처리하는 데 필요한 JAXB 요구사항 때문에 이러한 제공자는 모두 리턴 유형으로서 Java List를 JSON으로 직접 직렬화할 수 없다. 또한, 이러한 제공자는 다음과 같은 추가적인 문제점을 내포하고 있다.
- JSON.org
- JSON.org 제공자를 사용한 배열 동기화는 예측 가능하지만 Ajax와 상호 작용하는 경우에는 오류가 발생할 수 있다. 배열의 크기가 다양한 경우,
JSON.org는 배열을 서로 다르게 표현한다.
- 2+ : "올바른" 배열 동기화. 예를 들면,
object : { array : ["element1", "element2"] } - 1 : 배열을 분리한다. 예를 들면,
object : { array : "element1" } - 0 : 배열을 완전히 제거한다. 예를 들면,
object : { }
분명한 사실은 Javascript에서는 다양한 구조로 코딩할 수 있다는 점 때문에 코드가 불필요하게 복잡해진다는 점이다.
- 2+ : "올바른" 배열 동기화. 예를 들면,
- Jettison
- Jettison에서는 Badgerfish 규칙을 사용하여 JSON을 생성하며 구조를 Javascript 오브젝트로 변환하면 탐색하기 어려워진다.
Jackson의 핵심은 JSON으로 표현한 Java 오브젝트를 생성하고 구문 분석하는 데 사용하는 JSON 프로세서이다. 또한, Jackson은 JAX-RS 구현을 위한 JSON 직렬화 제공자로 구성될 수 있다.
JAX-RS JSON 직렬화 제공자인 Jackson에는 JSON.org 및 Jettison에 비해 다음과 같은 몇 가지 장점이 있다.
표 1. Jackson의 장점
| 장점 | 설명 |
|---|---|
| 기본적으로 List를 직렬화하는 기능 | Jackson은 랩퍼 XML 요소가 없어도 서비스에서 문자열 오브젝트의 List를 직접 리턴할 수 있다. |
| 배열 처리 | Jackson에는 우수하고 예측 가능한 배열 직렬화 기능이 있다. |
| 속도 | 다른 제공자보다 다소 속도가 빠르다. |
| 라이센싱 | Apache License 2.0이 잘 알려져 있다. 이러한 라이센스를 사용하는 컴포넌트는 상용 및 무료 소프트웨어 제품 모두에서 사용된다. |
Jackson JSON을 위해 Apache Wink 구성하기
이 기사에 있는 예제를 위한 지시사항에서는 다음과 같이 가정한다.
- Apache Wink를 JAX-RS 제공자로 사용하도록 기존의 동적 웹 프로젝트를 구성했다.
- JAX-RS 애플리케이션을 사용하기 위해 Apache Wink 서블릿인
org.apache.wink.server.internal.servlet.RestServlet을 Listing 1과 같이 web.xml 파일에 구성하였다.
Listing 1. Wink 서블릿을 위한 web.xml 스니펫
<servlet>
<servlet-name>WinkServlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.ibm.developerworks.winkJackson.WinkApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WinkServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
|
Jackson 웹 사이트에서 Jackson 제공자 최신 버전을 다운로드한다.(참고자료 확인). 이 글을 쓰는 현재, Jackson 팀에서는 Jackson을 Apache Wink와 함께 사용하는 데 필요한 모든 라이브러리를 다운로드할 수 있는 자원을 하나도 제공하지 않는다. 다음과 같은 ASL이나 LGPL 버전의 JAR 파일이 필요하다.
- core-(asl/lgpl): Jackson 코어 함수
- mapper-(asl/lgpl): POJO <-> JSON 직렬화
- jax-rs: Wink와 Jackson 간의 인터페이스
- jax-xc: JAXB 어노테이션과의 백워드 호환성
JAR 파일은 해당 웹 프로젝트의 클래스 경로에 존재해야 한다. 이렇게 하려면 JAR 파일을 사용자의 WEB-INF/lib 디렉토리에 저장해야 한다. (Apache Wink JAR 파일이 이 디렉토리에 이미 있을 수도 있다.
Jackson 제공자를 사용하여 JSON 직렬화를 수행하도록 Apache Wink를 구성하자.
이 시점에서는 Jackson JSON 제공자가 웹 애플리케이션의 일부로 로드되지만 Apache Wink가 Jackson 제공자를 사용하여 JSON 직렬화를 수행하도록 구성되지는 않았다.
Listing 2와 같이 Apache Wink 서블릿에서 구성된 애플리케이션을 조정하여 Jackson 제공자를 로드하도록 한다.
Listing 2. 샘플 WinkApplication.java
package com.ibm.developerworks.winkJackson;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
// Jackson imports
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
public class WinkApplication extends Application {
/**
* Get the list of service classes provided by this JAX-RS application
*/
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> serviceClasses = new HashSet<Class<?>>();
serviceClasses.add(HelloWorlds.class);
return serviceClasses;
}
@Override
public Set<Object> getSingletons() {
Set<Object> s = new HashSet<Object>();
// Register the Jackson provider for JSON
// Make (de)serializer use a subset of JAXB and (afterwards) Jackson annotations
// See http://wiki.fasterxml.com/JacksonJAXBAnnotations for more information
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
mapper.getSerializationConfig().setAnnotationIntrospector(pair);
// Set up the provider
JacksonJaxbJsonProvider jaxbProvider = new JacksonJaxbJsonProvider();
jaxbProvider.setMapper(mapper);
s.add(jaxbProvider);
return s;
}
} |
Jackson을 이용하면 랩퍼 JAXB XML 요소가 없어도 Java List를 해당 함수에서 쉽게 리턴할 수 있다. Listing 3에는 이러한 예제가 표시되어 있다.
Listing 3. HelloWorlds.java
package com.ibm.developerworks.winkJackson;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("helloworlds")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorlds {
@GET
public List<String> helloWorlds() {
return Arrays.asList(new String [] {"Hello Earth!", "Hello Mars!" });
}
} |
Apache Wink는 JAX-RS 스펙의 구현물로서 사용이 점점 증가하고 있다. JSON.org와 Jettison은 JSON 동기화를 기본적으로 제공하지만 몇 가지 문제점이 있다. 이 기사에서는 Apache Wink를 사용하는 기존의 웹 애플리케이션에서 Jackson JSON 제공자를 사용하도록 구성하는 방법을 살펴보았다. 또한, 예제에서는 Jackson을 사용하는 간단한 JAX-RS 웹 서비스 샘플 코드를 사용하여 이러한 제공자의 장점을 살펴보았다.
| 설명 | 이름 | 크기 | 다운로드 방식 |
|---|---|---|---|
| Sample HelloWorlds Eclipse project archive | HelloWorlds.zip | 8KB | HTTP |
교육
- "Apache Wink가 포함된 RESTful 웹 서비스, Part 1: Apache Wink REST 서비스 빌드하기"(developerWorks, 2010년 2월): 이 기사에서는 Apache
Wink JAX-RS 제공자를 소개한다.
-
"RESTful Web services: The basics"(developerWorks, 2008년 11월): 이 기사에서는 REST(Representational State Transfer)의 기본 원리를 소개한다.
- RESTful Java with JAX-RS: 이 책에서는 RESTful 아키텍처의 원리와 Java EE 6의 JAX-RS 스펙을 사용하여 Java™ 코드로 분산 웹 서비스를 디자인하고
개발하는 방법을 설명한다.
제품 및 기술 얻기
- Apache Wink를 다운로드하여 다른 예제 프로젝트와 최신 프레임워크 버전의 소스 코드 및 2진 파일을 얻자.
-
이 기사에서 사용한 Jackson JSON Processor를 다운로드하자.
- IBM 제품 평가판을 다운로드하거나 IBM SOA Sandbox의 온라인 시험판을 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의
애플리케이션 개발 도구와 미들웨어 제품을 사용해 볼 수 있다.
토론
- developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.