기본정보#

애노테이션#

JAX-RS 애노테이션#

  • @Path
실제 요청 URL을 나타낸다. 이 애노테이션은 클래스 선언부, 메서드 선언부 모두 위치할수 있으며 클래스 선언부에 @Path("/sample"), 메서드 선언부에 @Path("/xml") 이라고 설정한다면 해당 메서드의 호출은 /api/sample/xml 이 된다. 여기서 /api는 web.xml 파일에 설정된 Jersey URL이다.
  • @GET
get방식으로 데이터 추출, 선택가능한 옵션은 @PUT, @DELETE, @POST 등이 있다.
  • @Produces
출력하고자 하는 데이터 포맷을 정의한다. 여기서 사용하는 포맷은 "application/json", "text/xml" 이고 각각 json, xml 타입으로 데이터를 출력한다. 기타 선택가능한 옵션은 "application/atom+xml", "application/x-www-form-urlencoded", "application/octet-stream", "application/svg+xml", "application/xhtml+xml", "application/xml", "multipart/form-data", "text/html", "text/plain" 등이 있다.
  • @QueryParam
파라미터 값에 대한 셋팅이다. 아래는 id, name 두가지를 사용하고 있기 때문에 실제 파라미터까지 고려한 완성된 URL은 http://호스트명/api/sample/xml?id=id값&name=name값이 된다.

Jersey 애노테이션#

  • @Singleton
싱글턴 객체임을 나타낸다. 그외 선택가능한 옵션은 @PerRequest 이다.

Spring 애노테이션#

  • @Component
애노테이션 기반의 셋팅이나 클래스패스 스캐닝을 사용하는 것을 Spring컨테이너에 알린다. @Component와 아래의 @Resource가 관련된다.

기타 애노테이션#

  • @Resource
애노테이션은 Spring의 setter메서드, Lucy의 @Inject 애노테이션과 같은 역할을 한다. name속성에 Spring bean아이디를 적어주면 된다.

Jar파일#

jeysey-spring.jar 파일이 추가적으로 필요하다는 것인데 사실 jersey설정이 정상이라고 가정할때의 설명입니다.

샘플#

applicationContext 샘플#

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:component-scan base-package="openframework.rest"/>

</beans>

Resource샘플#

package openframework.rest.api.resources;

import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

import openframework.rest.bo.SampleBO;
import openframework.rest.common.CacheManager;
import openframework.rest.model.Hello;
import com.sun.jersey.spi.resource.Singleton;

/**
 * 1. 사용목적
 * -> Flash와 Ajax에 던질 데이터 처리를 위한 API 
 * 2. 비고
 * -> Jersey 를 사용해서 REST방식으로 API를 작성한다. 
 * 3. 애노테이션 설명
 *  - @Singleton : 싱글턴 객체임을 나타낸다. 그외 선택가능한 옵션은 @PerRequest 이다. 
 *  - @Path : 실제 요청 URL을 나타낸다. API의 경우 web.xml 에서 /api/ 로 처리하도록 했으니 아래 샘플의 경우 기본 URL은 http://호스트명/api/sample 가 된다. 
 *  - @Component : 애노테이션 기반의 셋팅이나 클래스패스 스캐닝을 사용하는 것을 Spring컨테이너에 알린다. @Component와 아래의 @Resource가 관련된다. 
 *  
 * @author 이동국(fromm0@gmail.com)
 */
@Singleton
@Path("/sample")
@Component
public class SampleResource {
	private static Log log = LogFactory.getLog(SampleResource.class);

	/**
	 * @Resource 애노테이션은 Spring의 setter메서드, Lucy의 @Inject 애노테이션과 같은 역할을 한다. 
	 * name속성에 Spring bean아이디를 적어주면 된다. 
	 */
	@Resource(name = "sampleBO")
	private SampleBO sampleBO = null;
	/**
	 * @Resource 애노테이션은 Spring의 setter메서드, Lucy의 @Inject 애노테이션과 같은 역할을 한다. 
	 * name속성에 Spring bean아이디를 적어주면 된다.  
	 */
	@Resource(name = "cacheManager")
	private CacheManager cacheManager = null;

	/**
	 * 1. 사용목적 : Json형태로 데이터를 추출
	 * 2. 애노테이션 설명
	 * - @GET : get방식으로 데이터 추출, 선택가능한 옵션은 @PUT, @DELETE, @POST 등이 있다. 
	 * - @Path : 위 @Path설명과 동일하다. 
	 * 	클래스 선언부의 @Path 값으로 볼때 http://호스트명/api/sample 였기 때문에 
	 * 	해당 메서드 호출시 실제 완성되는 URL은 http://호스트명/api/sample/xml 이 된다.
	 * - @Produces : 출력하고자 하는 데이터 포맷을 정의한다.  
	 * 	"application/json" 를 사용하면json타입의 데이터를 출력한다. 
	 * 	선택가능한 옵션은 "application/atom+xml", "application/x-www-form-urlencoded", "application/json", 
	 * 	"application/octet-stream", "application/svg+xml", "application/xhtml+xml", "application/xml", "multipart/form-data", 
	 * 	"text/html", "text/plain", "text/xml" 등이 있다. 
	 * - @QueryParam : 파라미터 값에 대한 셋팅이다. 
	 * 	아래는 id, name 두가지를 사용하고 있기 때문에 실제 파라미터까지 고려한 완성된 URL은 http://호스트명/api/sample/xml?id=id값&name=name값이 된다.
	 *  
	 * @param id
	 * @param name
	 * @return
	 */
	@GET
	@Path("/json")
	@Produces("application/json")
	public Hello getHelloJsonFormat(@QueryParam("id") int id, @QueryParam("name") String name) {
		if (log.isDebugEnabled()) {
			log.debug("SampleResource.getHelloJsonFormat() method called");
		}
		return getHello(id);
	}

	/**
	 * 1. 사용목적 : xml형태로 데이터를 추출
	 * 2. 애노테이션 설명
	 * - @GET : get방식으로 데이터 추출, 선택가능한 옵션은 @PUT, @DELETE, @POST 등이 있다. 
	 * - @Path : 위 @Path설명과 동일하다. 
	 * 	클래스 선언부의 @Path 값으로 볼때 http://호스트명/api/sample 였기 때문에 
	 * 	해당 메서드 호출시 실제 완성되는 URL은 http://호스트명/api/sample/xml 이 된다.
	 * - @Produces : 출력하고자 하는 데이터 포맷을 정의한다.  
	 * 	"text/xml" 를 사용하면xml타입의 데이터를 출력한다. 
	 * 	선택가능한 옵션은 "application/atom+xml", "application/x-www-form-urlencoded", "application/json", 
	 * 	"application/octet-stream", "application/svg+xml", "application/xhtml+xml", "application/xml", "multipart/form-data", 
	 * 	"text/html", "text/plain", "text/xml" 등이 있다. 
	 * - @QueryParam : 파라미터 값에 대한 셋팅이다. 
	 * 	아래는 id, name 두가지를 사용하고 있기 때문에 실제 파라미터까지 고려한 완성된 URL은 http://호스트명/api/sample/xml?id=id값&name=name값이 된다.
	 *  
	 * @param id
	 * @param name
	 * @return
	 */
	@GET
	@Path("/xml")
	@Produces("text/xml")
	public Hello getHelloXmlFormat(@QueryParam("id") int id, @QueryParam("name") String name) {
		if (log.isDebugEnabled()) {
			log.debug("SampleResource.getHelloXmlFormat() method called");
		}
		return getHello(id);
	}

	private Hello getHello(int id) {
		Hello hello = null;

		StringBuilder cacheKey = new StringBuilder();
		cacheKey.append("SampleResource.getHelloXmlFormat");
		cacheKey.append("id=" + id);

		try {
			if (cacheManager.getCache(cacheKey.toString()) == null) {
				hello = sampleBO.selectHelloMsg(id);
				cacheManager.setCache(cacheKey.toString(), hello);
			}
		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}

		return hello;
	}
}

로컬로 요청할 경우 각각의 URL은 다음과 같이 된다.

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
png
jersey_spring.png 2.4 kB 1 16-Dec-2008 13:34 DongGukLee
« This page (revision-13) was last changed on 16-Dec-2008 13:37 by DongGukLee