프로그래밍/JAVA2011.02.14 15:23
1. Jersey
Jersey는 JAX-RS, 즉 RESTful 웹 서비스용 자바 API(JSR-311)의 오픈 소스 구현체 입니다. JAX-RS는 자바 어노테이션 API로 REST 아키텍처 스타일을 따르는 자바 기반 RESTful 웹 서비스를 손쉽게 작성하도록 지원합니다.



2. Jersey 사용하기
Jersey를 이용해 RESTful 웹 서비스를 구축하기 위해 다음과 같은 파일을 위 사이트에서 다운로드 합니다. 
(이 글을 쓰는 시점에서 jersey의 다운로드 버전은 1.5 입니다.)


  • asm-3.1.jar 
  • jersey-core-1.5.jar
  • jersey-server-1.5.jar
  • jersey-json-1.5.jar
  • jersey-spring-1.5.jar

jersey-json-1.5.jar와 jersey-spring-1.5.jar는 필수 요소는 아니지만 가각, JSON 객체의 JAXB 지원과 Jersey와 Spring의 통합을 위해 필요한 파일 입니다.

그 외 Spring3와 필요한 파일을 다운받아 다음 그림과 같이 라이브러리에 추가합니다.


위 그림에서는 Jersey와 Spring외에 log4j, iBatis, Apache-Commons 파일이 추가되어 있습니다.

다음으로 web.xml을 다음과 같이 편집합니다.


  sample
  Spring-Jersey sample project
  
  
  	contextConfigLocation
  	/WEB-INF/sample-context.xml
  
  
  	org.springframework.web.context.ContextLoaderListener
  
  
  	Jersey Spring Servlet
  	com.sun.jersey.spi.spring.container.servlet.SpringServlet
  	
  		com.sun.jersey.config.property.packages
  		org.itams.sample.rest;
  	
  
  
  	Jersey Spring Servlet
  	/rest/*
  
  
  	encodingFilter
  	org.springframework.web.filter.CharacterEncodingFilter
  	
  		encoding
		UTF-8
  	
  
  
  
    index.html
  

org.itams.sample.rest 패키지 이하의 클래스를 Resource를 사용할 것이며, applicationContext로 sample-context.xml를 사용합니다.

다음은 sample-context.xml의 내용입니다.




	
	
	
	
        
            
                classpath:jdbc.properties
            
        
    
    
    
		
        
        
        
        
    
    
    
    
    
     
    	
    	
    
	
	 
    	
    
    
    
    
    
		
    
    
    
    
    
	
		
	
    
    
    
    
	
		
			
		
	

Spring + iBatis를 DAO 구현은 다음과 같습니다.
package org.itams.sample.rest.hello.dao;

import org.itams.sample.rest.hello.Hello;

public interface HelloDAO {

	public Hello getHello();
	
}
package org.itams.sample.rest.hello.dao;

import org.itams.sample.rest.hello.Hello;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class HelloIBatisDAO extends SqlMapClientDaoSupport implements HelloDAO {

	@Override
	public Hello getHello() {
		return (Hello)getSqlMapClientTemplate().queryForObject("selectHello");
	}

}
JAXB를 통해 XML 또는 JSON객체로 마샬링/언마샬링을 지원하는 POJO객체 Hello는 다음과 같습니다.
package org.itams.sample.rest.hello;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Hello")
public class Hello {

	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
}

마지막으로  RESTful 웹 서비스를 URL을 통해 노출하는 인터페이스 클래스는 다음과 같습니다.
package org.itams.sample.rest.hello.service;

import org.itams.sample.rest.hello.Hello;

public interface HelloService {

	public Hello getHello(String accept);
	
}
package org.itams.sample.rest.hello.service;

import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.apache.log4j.Logger;
import org.itams.sample.rest.hello.Hello;

@Path("/hello")
public class HelloServiceImpl implements HelloService {

	private Logger logger = Logger.getLogger("org.itams.sample.service");

	private HelloServiceDelegate delegate;
	
	public HelloServiceImpl(HelloServiceDelegate delegate) {
		this.delegate = delegate;
	}

	@Override
	@GET
	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
	public Hello getHello(@HeaderParam("Accept") String accept) {
		logger.info("Method: GET, Accept: "+accept);
		return delegate.getHello();
	}
	
}
package org.itams.sample.rest.hello.service;

import org.itams.sample.rest.hello.Hello;
import org.itams.sample.rest.hello.dao.HelloDAO;

public class HelloServiceDelegate {

	private HelloDAO dao;
	
	public HelloServiceDelegate(HelloDAO dao) {
		this.dao = dao;
	}
	
	public Hello getHello() {
		return dao.getHello();
	}
	
}
RESTClient를 통해 RESTful 서비스의 정상 구동을 확인합니다.


서버로부터 리턴받을 데이터의 mime-type을 Accept로 명시하여 사용할 수 있습니다.
Accept가 생략될 경우 데이터의 기본 mime-type은 application/xml로 처리됩니다.
신고
Posted by devop