달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

[jersey] 1.0.2 릴리즈

자바 2009. 3. 1. 22:51
사내 인터페이스 작성을 위해 jersey를 사용하고 있는데 1.0.2 버전이 릴리즈되었습니다.
많은 버그를 수정했고 다음의 개선사항이 있었다고 합니다.

1. The JSON with JAXB "natural" convention
JAXB 모델을 사용해서 JSON 처리를 하거나 JSON을 다시 JAXB모델로 변경하는데 개선사항이 있다는 것으로 보입니다.
2. JSON with padding provider.
JSONP 에 대한 지원이 추가된 것입니다. JSONP 에 대해 검색을 해보니 다음처럼 설명을 하고 있군요.
JSONP(JSON with Padding)는 "Dynamic Script Tags" 혹은 "On Demend Javascript" 라고 불리는 기술을 이용하여 다른 웹사이트로 HTTP 요청을 보내고 자바스크립트 콜백 함수를 통해 실행결과를 통보 받는 방식으로 수행되는 JSON 기반 RPC 규약입니다. 이렇게 하면 브라우저의 보안 정책인 “Same Origin Policy” 제약을 넘어서서 원격 서버와의 통신이 가능해지는데, 야후의 일부 API들, 그리고 최근 개선된 Google Calendar API 등이 이미 이러한 방식을 사용하고 있습니다.
3. Resource method specific filters.
4. Atom Abdera support.
아파치의 atom 구현체인 Apache Abdera 프로젝트의 Atom 엔트리와 Feed 자바타입을 지원
5. Implicit produces.
6. Servlet as a filter.
7. Client using Apache HTTP client.
8. Pavel Bucek has added support for SSL configuration of the Client API when using HttpURLConnection

공부를 게을리 했더니 용어들이 모두 어렵습니다.
일단 내일 라이브러리 업데이트하고 API나 문서를 보면서 실제 내용을 파악해야 할 것으로 보입니다.

좀더 자세한 내용은 http://blogs.sun.com/sandoz/entry/jersey_1_0_2_is 를 참고하시면 됩니다.

'자바' 카테고리의 다른 글

[CI툴] hudson  (0) 2009.04.05
[JSON] Jackson JSON Processor  (0) 2009.03.01
[ibatis] 개발자 가이드 업데이트  (0) 2009.02.28
[ibatis] 메일링리스트를 통해서 본 3.0 소식  (2) 2009.02.15
[자바] 인코딩  (1) 2009.01.30
Posted by fromm0
|
위키 정비를 하면서 그동안 미뤄뒀던 자료 보강을 계획하고 있습니다.
위키에 옮기지는 않았지만 문서로 만들어뒀던 자료가 좀 있거든요..

먼저 올린 자료는 "Jersey로 RESTful 웹서비스 구현하기" 입니다.
일단 간단한 설명과 소스만 올려두었습니다. 특별히 복잡할게 없어서 주절주절 설명을 달아놓지는 않았으나 참고하는데 무리는 없으리라 생각됩니다.


질문은 이 글에 해주시면 됩니다.

Posted by fromm0
|
업무적인 요건사항도 있거니와 기존에 API를 처리하던 방법에 내심 비효율적이라는 생각이 많아서 최근 다른 것들과 더불어 RESTful 웹서비스를 보고 있습니다.

◈ 기존에 API를 위해 사용했던 방식
  1. SOAP기반의 웹서비스로 처리
  2. 단순히 webwork와 같은 프레임워크를 사용하여 필요시 XStream과 같은 라이브러리로 xml이나 json으로 데이터를 변환해서 처리

1번의 경우 xml형태의 처리는 가능하나 json형태는 방법이 없는 것으로 알고 있습니다. 그리고 간혹 느끼지만 어려운 부분이 많기도 하구요.
2번의 방식은 라이브러리를 사용하기는 하나 처음부터 끝까지 개발자가 다 만져야 하고 경우에 따라 각각의 API가 통일성이 없을수 있습니다.

RESTful 웹서비스를 구현하기 위해서 자바에서는 Jersey를 사용하면 굉장히 쉽게 구현이 가능합니다.
공부하기 시작한 것이긴 하지만 가장 간단하게 구현하는 방법을 살펴보겠습니다.

web.xml 파일 수정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>rest</display-name>
    <servlet>
        <servlet-name>JerseyWebApplication</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>JerseyWebApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

먼저 개발환경을 보면 JDK는 1.6.0_10 이고 tomcat은 6.0.18 입니다.
Jersey를 사용할때 web.xml 파일에 추가되는 항목은 servlet와 servlet-mapping 두가지입니다.

데이터를 담을 bean 생성하기
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person {
    private String id = "";
    private String name = "";
    private List<Family> familyList = null;

    .... 각각의 getter와 setter메서드

}

public class Family {
    private String name = "";
    private String relation = "";

    .... 각각의 getter와 setter메서드

}

xml형태로 응답하는 RESTful
import java.util.ArrayList;
import java.util.List;

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

import openframework.common.model.Family;
import openframework.common.model.Person;

import com.sun.jersey.spi.resource.Singleton;

@Singleton
@Path("/person")
public class PersonBean {
    @GET
    @Produces("text/xml")
    public Person getPersonMessage() {
        Person person = new Person();
        person.setId("123");
        person.setName("TEST");

        Family family = new Family();
        family.setName("ttt");
        family.setRelation("형");
        List<Family> familyList = new ArrayList<Family>();
        familyList.add(family);
        person.setFamilyList(familyList);

        return person;
    }
}

JSON형태로 응답하는 RESTful
import java.util.ArrayList;
import java.util.List;

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

import openframework.common.model.Family;
import openframework.common.model.Person;

import com.sun.jersey.spi.resource.Singleton;

@Singleton
@Path("/person")
public class PersonBean {
    @GET
   @Produces("application/json")
    public Person getPersonMessage() {
        Person person = new Person();
        person.setId("123");
        person.setName("TEST");

        Family family = new Family();
        family.setName("ttt");
        family.setRelation("형");
        List<Family> familyList = new ArrayList<Family>();
        familyList.add(family);
        person.setFamilyList(familyList);

        return person;
    }
}

응답을 xml로 하느냐 json으로 하느냐가 영향을 끼치는 것은 사실 @Produces 라는 애노테이션 부분밖에 없습니다. 그외 로직적인 부분은 모두 동일합니다.
실제 응답 메시지를 보면 다음과 같습니다.

☞ XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
    <familyList>
        <name>ttt</name>
        <relation>형</relation>
    </familyList>
    <id>123</id>
    <name>TEST</name>
</person>

☞ JSON
{"familyList":{"name":"ttt","relation":"형"},"id":"123","name":"TEST"}


테스트에 사용한 소스
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class Test {
    public static void main(String[] args) {
        URL url = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try {
            url = new URL("http://localhost:8080/rest/person");
            isr = new InputStreamReader(url.openStream());
            br = new BufferedReader(isr);
           
            while( br.ready() ){
                System.out.println(br.readLine());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

필요한 jar파일들

위 파일은 jersey 홈페이지인 http://jersey.dev.java.net/ 에서 모두 받을 수 있습니다.
실제 위 예제는 가장 간단한 형태로 업무에 사용하기 위해서는 좀더 많은 것을 고려해야 하고 적용해야 합니다.

앞으로 조금씩 내용을 보충하도록 하겠습니다.
기술적인 것도 기술적인 것이지만 REST라는 개념에 대해서도 좀더 공부를 해야 겠습니다. ^^
Posted by fromm0
|