2011년 6월 20일 월요일

RESTful Web Service 쉽게 만들기

많은 Java 개발자들이 RESTful Web Service을 배우는데 흥미를 가지고 있습니다. 하지만 많은 튜토리얼들이 과도하게 복잡하기만 합니다.
본 글에서는 JDK와 간단한 Notepad같은 Text Editor만 가지고 RESTful Web Service을 개발하는 방법을 설명합니다. 마지막에 배포를 위해서 Tomcat 7는 설치합니다.

모두가 다 아는 이야기를 약간 하고 넘어가겠습니다. RESTful Web Service는 HTTP Protocol 상에서 서비스되게 디자인되어 있습니다. 가장 큰 특징은 HTTP Protocol의 4가지 Method인 “PUT”, “GET”, “POST”, “DELETE”가 Data을 조작하기 위한 Create, Read, Update, Delete에 Match되게 디자인 되어있다는 것입니다.

RESTful Web Service API을 개발할 때는 재일 먼저 API을 URL+Method로 정확히 정의하고 시작해야 합니다. 여기서 다룰 아주 간단한 API라도 말입니다.

“Hello world”  Webservice → “http://localhost:8080/restful/resources/helloworld”, GET
  • http://localhost:8080: Tomcat 7 WAS
  • resetful: 배포될 WAR 명에 따라 변경 됨
  • resources: web.xml에 등록된 RESTful 지원 Servlet URL pattern
  • API 별로 정의해야할 것은 “helloworld”, “GET” 이 두가지 입니다.


JSR-311 Reference 구현 라이브러리: Jersey(http://jersey.java.net)
RESTful Web Service는 JSR-311로 Spec이 발표되었고 이를 구현한 많은 구현 라이브러리가 있습니다. 여기서는 Jersey을 사용하도록 하겠습니다. 이 글을 쓰고 있는 현재 Jersey 버전은 1.7입니다.(JSR-311 버전 1.1을 구현한 라이브러리를 사용합니다.)

jersey을 받고 아래 jar 파일들을 “WEB-INF/lib”에 넣습니다.
  • asm-3.1.jar
  • jackson-core-asl-1.7.1.jar
  • jackson-jaxrs-1.7.1.jar
  • jackson-mapper-asl-1.7.1.jar
  • jackson-xc-1.7.1.jar
  • jersey-client-1.7.jar
  • jersey-core-1.7.jar
  • jersey-json-1.7.jar
  • jersey-server-1.7.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar



Code 작성 하기
위에서 URI을 지정할때 API별로 지정할수 있었던 2가지를 여기서 정의해줍니다.


package com.mcnz.ws;
import javax.ws.rs.*;
@Path("helloworld")
public class HelloWorldResource {
@GET
@Produces("text/plain")
public String getMessage() {
    return "Rest Never Sleeps";
}
}

“@Produces”는 Return의 MIME-TYPE을 정의하는 것입니다. 여기서는 Plain text 형태를 지정하였습니다.

Compile 하기
C:\> c:\_jdk1.6\bin\javac -classpath "C:\_restful\WEB-INF\lib\*"
C:\_restful\WEB-INF\classes\com\mcnz\ws\*.java



web.xml에 Jersey 설정하기
“WEB-INF” 밑에 web.xml 파일을 만들고 아래 내용을 입력합니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns="http://java.sun.com/xml/ns/javaee" version="3.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <servlet>
<servlet-name>RestfulContainer</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>com.mcnz.ws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
<servlet-name>RestfulContainer</servlet-name>
<url-pattern>/resources/*</url-pattern>
 </servlet-mapping>
</web-app>

URL 호출 중 “/resources/”을 포함한 경우는 RESTful Web Service을 호출하는거라 판단합니다.

Deployment and Testing

WAR 파일 만들기
C:\_restful> %JAVA_HOME%\bin\jar -cvf
C:\_tomcat\webapps\restful.war *.*

설치된 Tomcat에 배포


정의한 URL로 호출해 봅니다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...