메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Apache Wink를 Jackson JSON 프로세서와 함께 사용하기

Ajax와 JAX-RS의 통합을 더 단순하게 한다.

Nick Maynard, Scenario Analyst, IBM
Nick Maynard는 2003년 Imperial College of Science, Technology and Medicine을 졸업하면서 IBM에 입사했다. 리눅스, 웹 서비스, 비즈니스 통합 기술 전문가이다.

요약:  Apache Wink는 사실상 JAX-RS 1.0 스펙의 구현물 중 하나로 빠르게 자리 잡고 있다. JSON 마샬링과 언마샬링을 위해 표준 Apache Wink 배포판에 포함된 JSON.org 및 Jettison과 같은 제공자는 리턴 유형이 제한되어 있으며 배열을 표현하는 데 일부 문제점이 있습니다. JAX-RS 서비스와 이 서비스의 클라이언트 Ajax(Asynchronous JavaScript and XML) 애플리케이션을 코딩하는 과정은 어렵습니다. 이 기사에서는 Apache Wink를 사용하는 기존의 웹 애플리케이션을 Jackson JSON 제공자를 사용하도록 구성하여 몇 가지 문제점을 해결하는 방법을 살펴봅니다. 예제에서는 Jackson을 사용하는 간단한 JAX-RS 웹 서비스 샘플 코드를 사용하여 이러한 제공자의 장점을 살펴봅니다.

원문 게재일:  2010 년 4 월 20 일 번역 게재일:   2010 년 6 월 01 일
난이도:  중급 영어로:  보기 PDF:  A4 and Letter (32KB | 8 pages)Get Adobe® Reader®
페이지뷰:  4566 회
의견:  


소개

Apache Wink는 사실상 JAX-RS 스펙을 구현한 것으로 빠르게 확산되고 있다. JSON.org와 Jettison은 JSON 동기화를 기본적으로 제공하지만 몇 가지 문제점이 있다. 예를 들면, 배열 표현과 제한된 리턴 유형으로 인해 JAX-RS 서비스와 클라이언트 Ajax 애플리케이션을 코딩하기 어렵다.

이 기사에서는 Apache Wink를 사용하는 기존의 웹 애플리케이션에서 Jackson JSON 제공자를 사용할 수 있도록 구성하는 방법을 설명한다. Jackson을 사용하는 간단한 JAX-RS 웹 서비스 샘플 코드를 사용함으로써 Jackson JSON 제공자의 장점을 살펴본다.


Apache Wink와 함께 패키지된 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에서는 다양한 구조로 코딩할 수 있다는 점 때문에 코드가 불필요하게 복잡해진다는 점이다.

Jettison
Jettison에서는 Badgerfish 규칙을 사용하여 JSON을 생성하며 구조를 Javascript 오브젝트로 변환하면 탐색하기 어려워진다.

Jackson

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 팀에서는 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 파일이 이 디렉토리에 이미 있을 수도 있다.

My developerWorks에 있는 Apache Wink 그룹에 참여하자.

My developerWorks Apache Wink 그룹에서 다른 개발자들과 Apache Wink를 사용한 RESTful 웹 서비스 개발과 관련된 주제를 토론하고 자원을 공유하자.

My developerWorks 회원이 아니라면, 지금 가입하자!

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;
  }

}


Direct List<?> 직렬

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 archiveHelloWorlds.zip8KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Nick Maynard는 2003년 Imperial College of Science, Technology and Medicine을 졸업하면서 IBM에 입사했다. 리눅스, 웹 서비스, 비즈니스 통합 기술 전문가이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=웹 개발, 자바, SOA와 웹서비스
ArticleID=493509
ArticleTitle=Apache Wink를 Jackson JSON 프로세서와 함께 사용하기
publish-date=04202010
author1-email=nick.maynard@uk.ibm.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.