본문 바로가기

프로그래밍 이야기

Jersey 라이브러리로 REST서버를 만들어보자!

애플리케이션을 개발하다 보면 서버에서 데이터를 받도록 구성하는 경우가 있는데, 이 때 REST서버를 사용하면 애플리케이션에서 서버의 정보를 체계적이고 간단하게 받을 수 있습니다. 이 방식은 트위터나 페이스북과 같은 대표적인 SNS 서비스에서도 채택하고 있는 방식으로, 데이터에 접근하고, 이를 사용하는 것이 직관적이라는 장점이 있습니다.

여기에서는 REST 서버를 쉽게 구축하도록 하는 Jersey 라이브러리를 사용하여 간단한 REST 서버를 구축해보겠습니다.

개발환경 준비

 
 REST 서버 구축을 위해 다음 요소가 필요합니다.

위에 명시된 요소들을 각각 다운로드하여 적절한 위치에 압축해제한 후 다음 단계를 진행합니다.

이 글에서는 Eclipse Indigo, Jersey 1.8, Tomcat 7.0을 기준으로 설명을 진행하겠습니다.

프로젝트 생성
 
이클립스를 열어 메뉴에서 File > New > Dynamic Web Project를 선택하여 프로젝트 추가 마법사를 실행합니다. 처음으로 서버 환경을 구성했다면 Traget Runtime을 설정해야 합니다. 다이얼로그 중간의 New Runtime... 버튼을 누른 후, Apache Tomcat 7.0을 선택합니다. Next 버튼을 누르면 다음과 같이 환경 이름과 Tomcat 설치 경로를 설정하는 화면이 표시됩니다. Tomcat installation directory에 톰캣이 설치된 경로를 지정한 후, Finish를 눌러 런타임 환경을 설정합니다.

런타임 환경을 생성합니다.


런타임 환경을 설정한 후, 프로젝트 추가를 마저 진행합니다. 프로젝트 이름을 입력한 후, 다음과 같이 설정한 후 Finish를 눌러 프로젝트를 생성합니다.

프로젝트를 생성합니다.


프로젝트를 생성한 후, Jersey 라이브러리의 압축을 푼 경로 내의 /lib 디렉터리 하위에 포함되어 있는 라이브러리 파일들을 프로젝트 디렉터리의 /WebContent/WEB-INF/lib 디렉터리 내로 모두 복사합니다.

라이브러리를 프로젝트 디렉터리에 복사합니다.

이제 클라이언트의 요청에 응답하는 부분을 만들어 보겠습니다. 클라이언트의 요청에 결과를 반환하는 클래스를 생성합니다. 이 글에서는 다음과 같이 ExampleResource라는 클래스를 생성합니다.

클래스를 추가합니다.

클래스를 다음과 같이 구현합니다. /example 경로를 루트 경로로 하고, 각각  하위 경로를 지정하여 메서드에 접근할 수 있도록 합니다. getHelloMessage()는 단순히 "Hello, REST!" 메시지를 반환하고, printParamValues()는 인자를 받아 이를 다시 화면에 출력하는 예를 보여줍니다.

package com.androidhuman.example.rest.restexample;

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

@Path("/example")
public class ExampleResource {
	
	@GET
	@Produces(MediaType.TEXT_PLAIN)
	@Path("/hello")
	public String getHelloMessage(){
		return "Hello, REST!";
	}
	
	@GET
	@Produces(MediaType.TEXT_PLAIN)
	@Path("/account/userNum={id}&userName={name}")
	public String printParamValues(@PathParam("id")final int userNum, @PathParam("name")final String userName) {
		return "User number : " + userNum + " name : " + userName;
	}

}

다음으로, 위에서 지정한 구성 요서에 접근할 수 있도록 web.xml 파일을 구성해야 합니다. web.xml 파일을 프로젝트 디렉터리의 /WebContent/WEB-INF 디렉터리에 추가한 후, 다음과 같이 작성합니다.


<?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>Example</display-name>
	<servlet>
		<servlet-name>Example REST Service</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.androidhuman.example.rest.restexample</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Example REST Service</servlet-name>
		<url-pattern>/apis/*</url-pattern>
	</servlet-mapping>
</web-app>

 

위 내용에서 <servlet> 하위의 <init-param>의 두번째 <param-value>에는 위에서 추가한 리소스 클래스가 위치한 곳의 패키지를 넣어 주어야 합니다. 그리고, 아래부분의 <servlet-mapping>의 <url-pattern>에는 이 서비스에서 제공할 루트 경로를 지정합니다. 여기에서는 /apis/*로 지정하였습니다.

위에서 작성한 클래스, 경로, 그리고 루트 경로에 따라 여기에서 작성한 두 메서드에 접근하기 위한 요청의 모습은 다음과 같습니다. (서버의 경로 및 포트번호는 기본 설정을 사용한다 가정합니다)

getHelloMessage()
http://localhost:8080/RestExample/apis/example/hello

printParamValues() - userNum으로 1234, userId로 test를 지정한 경우
http://localhost:8080/RestExample/apis/example/account/userNum=1234&userId=test


이제 테스트를 해볼 차례입니다. 프로젝트를 선택한 후 오른쪽 클릭 - Run As... - Run on Server를 클릭합니다. 다음과 같이 서버 선택 다이얼로그가 나오면 서버를 선택한 후 Finish를 누릅니다.

서버를 선택합니다.


서버가 실행됩니다. 서버가 완전히 실행된 후, 요청을 테스트해보겠습니다. 먼저 getHelloMessage()를 테스트하기 위해 주소창에 http://localhost:8080/RestExample/apis/example/hello 를 입력합니다. 다음과 같이 "Hello, REST!" 가 표시되는 것을 확인할 수 있습니다.

다음, printParamValues() 메서드를 테스트해봅니다. 여기에서는 http://localhost:8080/RestExample/apis/example/account/userNum=1234&userName=test 로 요청을 전달합니다. 다음과 같이 우리가 인자로 넘겨준 값들이 화면에 표시되는 것을 확인할 수 있습니다.

이것으로 간단한 REST 서버를 만들어보는 과정을 알아보았습니다.
이를 응용해서 DB와 연결하고, 적절한 API를 구성하면 데이터를 제공하는 서버를 손쉽게 구축할 수 있을 것입니다.
저도 이번에 처음 시도해 보는 것이라 약간의 시행착오는 있었지만, 이 정도의 난이도라면 금방 능숙하게 다른 기능들을 붙일 수 있을 것 같다는 생각이 듭니다 :)

아래에 프로젝트 파일을 첨부합니다. 혹시나 제대로 되지 않을 경우 참고하세요.

RestExample.zip