2013년 4월 16일 화요일

Embedded jetty Server에서 Jersey 사용하기기

최근 WebService는 Mobile 단말기와 서버와의 API는 HTTP 기반의 Restful Webservice을 사용하는게 표준화되어 있다. 하지만 HTTP을 기반으로 API을 제공하기 위해서는 어떤 형태로든 WAS을 기반으로 제공되게 되어 있다. 기존에 TCP 형태의 API을 제공하는 서버가 있다고 할때 최소 비용(시간과 노력)으로 Restful을 제공할 수 있는 방법을 제안하도록 하겠다.

"Jetty"의 특징은 Tomcat처럼 독립실행도 하지만, 코드 레벨로 WAS기능을 Embedded 시킬수 있다는게 가장큰 특징이다.

JAX-RS(JSR 311)을 완벽하게 구현시킨 오픈소스 RESTFul Webservice 라이브러리다.
보통 Spring RESTful을 많이 사용했겠지만, 이식성 및 표준 준수 여부 생각해서 Jersey을 선택했다.

Jetty Server in Maven
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
</dependency>
Jersey in Maven
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.17.1</version>
</dependency>

Jetty Server 코드 레벨에서 실행 하기
Jetty Server을 코드 레벨에서 실행하는 방법은 여러가지 입니다.
사용자가 만든 Servlet을 등록하여 사용하는 방법, war형태로 배포하는 방법 등 많지만 여기서는 Jersey 사용을 위한 Servlet 등록 및 초기파라미터 지정하는 방법만 살펴 봅니다.

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.sun.jersey.spi.container.servlet.ServletContainer;
...

protected Server createJettyServer() {
   Server server = new Server(8888);
   
   ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
   context.setContextPath("/openapi");
   server.setHandler(context);
   ServletHolder holder = new ServletHolder(ServletContainer.class);
holder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", "com.sun.jersey.api.core.PackagesResourceConfig");
holder.setInitParameter("com.sun.jersey.config.property.packages", "com.mypackage");
holder.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
   context.addServlet(holder, "/*");
   
   return server;
}


public void start() throws IOException {
   server = createJettyServer();
   try {
       server.start();
       server.join();
   } catch (Exception e) {
       throw new RuntimeException(e);
   }
}
http://localshot:8888/openapi 로 Jersey Servlet이 등록 되었습니다.
com.mypackage” --> jersey openAPI Resource가 있는 패키지 위치
"com.sun.jersey.api.json.POJOMappingFeature"을 꼭 해줘야 요청에 대하여 POJO Object을 Json으로 자동 변경해줍니다.

Jersey을 이용한 OpenAPI 만들기
위에서 정의한 “com.mypackage”에 OpenAPI Resource을 만듭니다.

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.hs.uc.protocol.http.vo.UserVO;

@Path("/user")
public class UserCertificateResource {

@POST
@Path("/hello")
@Produces({ "text/plain" })
public String seyHello() {
return "Hello UC";
}

@GET
@Path("/getUser")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public UserVO getUserJson() {
UserVO user = new UserVO();
user.setName("HandyUC User");
user.setAge(18);
return user;
}

@GET
@Path("/getUser")
@Consumes({ MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_XML })
public UserVO getUserXML() {
UserVO user = new UserVO();
user.setName("HandyUC User");
user.setAge(18);
return user;
}

@POST
@Path("/setUser")
@Produces({ MediaType.APPLICATION_JSON })
public UserVO setUser(@FormParam("name") String name,
@FormParam("age") int age) {
UserVO user = new UserVO();
user.setName(name);
user.setAge(age);
return user;
}
}

Pojo class: UserVO

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement --> 이걸 꼭해줘야 XML로도 변경됩니다.
public class UserVO {

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

private String name;
private int age;

public UserVO() {

}
}

Rest Client로 테스트 해보기
위의 Jetty 서버 코드가 있는 부분을 실행합니다.

그리고 Rest Client로 확인해보면
http://localhost:8888/openapi/user/getUser, GET, Content-Type: application/json
http://localhost:8888/openapi/user/getUser, GET, Content-Type: application/xml

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

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