태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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

2011.07.21 20:34

애플리케이션을 개발하다 보면 서버에서 데이터를 받도록 구성하는 경우가 있는데, 이 때 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

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

커니 프로그래밍 이야기 , , , , , , , , , , ,

  1. Blog Icon
    으압

    커니님, 오랜만에 새 글 올리셨네요. 요새 앱 개발하시는 게 있나 싶어서 들어왔어요. 아무래도 안드로이드에서 앱 수도 적을 뿐만 아니라 개발자 자체가 적은 것 같기도 하고. 시간이 어느 정도 지나야 애플 수준이 될지, 기다리면 그렇게 되긴 될지, 허니콤의 미래가 과연 밝을지 고민이 돼요. 막상 10.1이 손에 들어오기 직전이 되니까 싱숭생숭하네요 ㅠㅠ 즐거운 주말 보내세요~

  2. ㅠㅠ 허니컴 지원하도록 업그레이드 하고있는데... 책 개정 준비랑 겹치다보니 늦어지네요 ㅎㅎ 완성되면 허니컴용 팁도 좀 올리려했는데 시간이 걸릴것같네요!!!

    제 생각엔.... 허니컴은 왠지 안드로이드 2.0~2.1과 같은 양상을 보일 것 같고... (메이저긴 메이전데 약간 어정쩡한 메이저) 아이스크림샌드위치가 나오면 좀 많이 확산될 것 같네요 'ㅁ'

  3. Blog Icon
    자바스터디

    예제 중에 printParamValues() 메서드를 테스트 부분을 실행하면 404 에러가 발생하네요. hello는 잘 나오는데.. 왜 그럴까요? 그리고, example이라는 root 패스가 잡혀 있어, printParamValues() 메서드 테스트시 경로가 ~/RestExample/example/account/userNum=1234&userId=test 로 되어야 하는것은 아닌지요?

  4. 으익 example 을 중간에 빼먹었네요....글 내용 수정했습니다.

    /RestExample/example/accout/... 로 하는게 맞습니다. 지적 감사합니다 :)

  5. Blog Icon
    깜모

    정말 알기 쉽게 쓰셨네요.
    감사합니다~

  6. Blog Icon
    밈밈

    커니님 글 그대로 따라했는데 실행하자마자 404에러가 뜨네요....
    서버에 관한 배경지식이 거의 전무한지라 어떻게 대처해야 할지 무척 난감합니다.

    써버
    HTTP Status 404 - /Test_Apache/

    --------------------------------------------------------------------------------

    type Status report

    message /Test_Apache/

    description The requested resource (/Test_Apache/) is not available.

    --------------------------------------------------------------------------------

    Apache Tomcat/7.0.12

    콘쏠
    he APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:

    에는 이렇게 뜨는데, 구글에 콘솔에 있는 에러메세지 뜨면 tcnative-1.dll을 받아서 /bin폴더에 넣으라고 했는데 /bin에는 tcnative-1.dll파일이 이미 있고, 인터넷에서 새로 받아서 넣어도 메세지는 변하지 않고 ㅠ_ㅠ 서버를 선택하는 과정에서 잘못된건가용

  7. Blog Icon
    밈밈

    그리고 글에있는 RestExample.zip파일을 프로젝트에 등록해도 같은 에러가 나네요 ㅜㅜ 어디서 잘못된건지 모르겠어요

  8. 흠... 정확히 어떤 문제인지 저도 잘 감이 안오네요.
    느낌상 톰캣 자체가 동작을 제대로 하지 않는 것 같은데, 톰캣을 다시 설치하면 어떤가요?

  9. Blog Icon
    남광우

    움.. 실제 Rest원칙에 맞게하려면.. UserNum 과 같은 것들은 PathParam이 아니라 QueryParam으로 해야하는거 아닌가요?

  10. 그러면 @QueryParam 이런 식으로 적어주면 되는건가요?
    저도 이 분야는 잘 알지 못해서, 제가 인터넷 검색 등을 통해 알아낸 방법으로 설명을 작성하였습니다.

  11. Blog Icon
    모구니

    밑에 수행주소가 userid 가 아니라 userName 이 맡는거 같습니다.^^
    http://localhost:8080/RestExample/apis/example/account/userNum=1234&userName=test

  12. 지적 감사합니다. 수정완료했습니다~

  13. Blog Icon
    1234

    감사합니다!