달력

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
업무적인 요건사항도 있거니와 기존에 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
|