728x90
반응형

Jersey로 구현하는 자바 REST 서비스


 

이번 회에서는 REST의 개념을 바탕으로 JAVA 언어로 REST를 구축하는 방법에 대해서 알아보도록 한다.

JAVA 기반의 REST구현 방법에는 여러 가지가 있으나 근래에 웹서비스처럼 REST도 구현을 쉽게 도와줄 수 있는 프레임웍을 제공한다. 웹서비스의 구현 개발 표준이 JAX-WS였다면 REST에 대한 구현 표준은 JAX-RS이며 그 레퍼런스 구현으로는 Apache CXF Sun(지금은 오라클) Jersey가 있다. 본 문서는 Sun Jersey를 기준으로 작성되었다.

기본 REST 서비스 구현

먼저 이클립스를 인스톨하고 New > Project > Dynamic Web Project로 새로운 프로젝트를 생성한다.



프로젝트가 생성되었으면 Jersey를 사용하기 위해서 라이브러리의 설정등을 해야한다.



REST를 실행하는 서블릿 컨테이너를 서블릿으로 등록하고, 이 웹애플리케이션의 모든 URL REST 컨테이너내에서 실행되도록 <servlet-mapping> 부분에 url-pattern으로 정의한다. (특정 URL 패턴만 REST로 실행하도록 하고 싶으면 이 url-pattern 부분만 조정하면 된다.)

이제 앞의 연재에서 .NET WCF로 진행한 것과 같은 예제를 JAVA Jersey로 구현해보자



먼저 ValueObject를 위와 같이 구현한다. ValueObject REST 구현체상에서 JAVA XML을 상호 변환하여 맵핑 시켜주는 역할을 하며 이는 Java XmlBinding 프레임웍인 JAXB를 사용한다. Serialize되기 때문에 클래스 선언시에는 반드시 Serializable 인터페이스를 implements 하도록 한다.

반드시 클래스 앞에 @XmlRootElement Annotation을 이용해서 본 클래스가 JAXB를 이용해서 XML 변환을 사용할것이라는 것을 지정한다. 이때 name을 지정해서 XmlElement의 이름을 명시적으로 지정한다. (본 예제에서는 클래스명이 ContactVo이기 때문에 명시적으로 이름을 정해주지 않으면 Xml 로 변환시 클래스 이름을 따라서 <contactVo>로 변환된다.)

위의 ValueObject Xml로 변환되면 다음과 같은 모양이 된다.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

- <Contact>

  <email>111</email>

  <name>22</name>

  <phone>123123</phone>

  </Contact>

다음으로는 이 ValueObject들을 저장할 Dao를 작성한다. 나중에 DB에 연동하고 싶으면 이 Dao 부분을 DB 연동 부분으로 바꾸면 되지만, 본 예제는 REST 자체의 구현에 집중하기 때문에, 간단하게 HashTable ContactVo email Key 값으로 저장한다



다음으로는 실제 CREATE,READ,UPDATE,DELETE를 지원하는 REST 서비스를 작성한다.



클래스에 @Path 어노테이션을 이용하여 REST 리소스의 URI 경로를 정의한다. URI FULL 경로는 http://웹서버/{WebApplication(WAR) URI}/{@Path 어노테이션으로 정의한 경로}이다.
REST 애플리케이션은 FirstREST라는 경로에 배포되는 것으로 설정하였기 때문에 이 리소스의 경로는 http://localhost/FirstREST/Contact이 된다.

각각의 HTTP Method Java 메서드를 맵핑 시키기 위해서는 각각 @PUT,@GET,@POST,@DELETE  Annotation을 사용한다. 여기서 주목해야 하는 부분은 URI를 통해서 인자를 넘겨 받는 부분인데, @Path Annotation을 사용하여 URI상에 인자가 있을 경우 정의하고, 인자를 @PathParam을 통해서 실제 Java 변수와 맵핑 시켜줘야 한다. 예를 들어 ../Contact/{email} URI에서 {email}을 인자로 사용하고 싶으면 위의 Delete 메서드와 같이 @Path(“{email}”)로 정의하고, URI @PathParam(“email”)String email 로 맵핑 시켜줘야, Java 변수 email로 값이 맵핑 된다.

여기까지 했으면 기본적인 REST가 컴포넌트가 완성되었다. 이제 컴파일을 하고 Eclipse에서 Project > Export 메뉴를 이용하여 WAR Export하여 Tomcat이나 JBoss등의 Web Application 서버에 배포하고 테스트를 진행하면 된다.

REST 구현에 있어서 자주 사용되는 Annotation들은 다음과 같다.

@QueryParam

URI QueryString 을 사용하여 method parameter를 전달한다. Parameter의 값은 자동으로 decoding 되며 자동 deocoding을 사용하지 않을때에는 @Encoded 를 사용한다.

@PathParam

URI path String 을 사용하여 method parameter를 전달 한다. Parameter의 값은 자동으로 decoding 되며 자동 deocoding을 사용하지 않을때에는 @Encoded 를 사용한다.

@Context

annotation 을 사용하여 UriInfo , Request, HttpHeader 같은 값들을 class field , method parameter로 전달한다.

@CookieParam

HTTP Cookie 의 값을 method parameter로 전달한다.

@HeaderParam

HTTP header 의 값을 method parameter  전달한다.

REST 컴포넌트 테스트 (SOAP UI)

불행히도 Sun Jersey Implementation .NET WCF와는 달리 별도의 REST 테스트 기능을 지원하지 않는다. 그래서 별도로 테스트 환경을 설정해야 한다. 가장 널리 사용되는 REST 테스트 도구로는 soapUI라는 도구가 있다. http://www.soapui.org 에서 다운받을 수 있다. 다운을 받아서 설치를 한 후 실행을 한다.

File> New SoapUIProject를 선택하여 새로운 테스트 프로젝트를 생성한다. 생성된 프로젝트에서 New REST Service를 선택하면 새로운 서비스 EndPoint를 넣게 되는데, 서비스명은 테스트할 서비스 이름 (아무거나)을 넣고, EndPoint에는 웹서버의 URL(IP,PORT)를 넣는다.



다음으로 Resource를 정의해야 하는데, Create,Delete,Put ./Contact/{email} 형태의 리소스이고, Post ./Contact 형태의 리소스이기 때문에, 먼저 ./Contact 리소스를 만들고 ./Contact/{email}리소스를 그 차일드 리소스로 만든다. 위에서 만든 서비스에서 New Resource를 선택하고 리소스명은 “Contacts” EndPoint /FirstREST/Contact (FirstREST는 이 REST 서비스가 배포되는 URI) 을 입력한다.



다음으로 해당 리소스에 New REST Method를 이용하여 새로운 메서드를 추가하는데, POST에 대한 메서드를 추가한다.



POST REST Request가 만들어 졌다. 이제 해당 Request를 선택하여 테스트창을 열어보자



테스트 창에서 아래 부분에 POST로 보낼 HTTP BODY XML 데이터를 입력하고 실행 버튼을 누르면 POST 요청을 보낸 것이다좌측의 Raw 탭을 이용하면 실제로 전송되는 HTTP Request를 볼 수 있다.



이제 HTTP GET을 이용해서 Resource가 제대로 생성되었는지 확인을 하자.

앞에서 생성한 Contacts 리소스에서 오른쪽 버튼을 클릭하여 New Child Resource 메뉴를 선택한다. Resource 이름을 Contact으로 정의하고, end Point“/{email}”을 추가하고, Extract Param 버튼을 클릭하면 이 {email}을 변수로 취급해준다. 이때 중요한 것이 Style인데, Template으로 선택되어야 한다. Style에 따라서 변수를 HTTP URI에 실어서 보낼지, HTTP Header에 넣을지, Query String등에 넣을지를 선택할 수 있다.



마찬가지로 New Method 메뉴가 나오는데, HTTP GET 메서드로 선택하고 getMethod라는 이름으로 새로운 메서드를 정의한다.



새로 생성한 메서드를 테스트 해보자, 위의 그림처럼 좌측 부분에 앞에서 정의한 email 변수에 값을 지정할 수 있다. 앞의 POST 메서드에서 “carry” 라는 이름으로 리소스를 만들었으니 emailcarry를 지정하고 실행 버튼을 누르면 위의 좌측 메뉴 처럼 XML로 리턴값을 보여준다.

같은 방법으로 PUT,DELETE에 대한 테스트 케이스를 만들 수 있다

본 예제에서는 가장 기본적인 부분만 설정하였는데, SoapUI의 경우 부하테스트를 통한 성능 측정까지 가능하기 때문에 Micro benchmark등에 활용이 가능하니 참고하기 바란다.

List 형 데이터 처리

자아 지금까지 단순한 REST 구현에 대해서 알아보았다. 이번에는 List 타입을 어떻게 핸들링하는지 알아본다. List 타입을 리턴하기 위해서는 ContactService.java에 다음 메서드를 추가한다.

이때 반드시 리턴 데이터 타입에 <ContactVo> List 개별 항목이 어떤 데이터 타입을 가지고 있는지를 정의해줘야 자바 객체를 JAXB XML 변환할 있다.

//ContactService.java 추가

@GET

    @Produces("text/xml")

    public List<ContactVo> GetList()

    {

        return dao.getList();      

    }

 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

- <contactVoes>

- <Contact>

  <email>bycho</email>

  <name>Byungwook.Cho</name>

  <phone>123123</phone>

  </Contact>

- <Contact>

  <email>carry</email>

  <name>Carry.Cho</name>

  <phone>123123</phone>

  </Contact>

</contactVoes>

에러처리

에러 처리역시 매우 단순하다.

WebApplicationException을 사용하되, HTTP Error코드를 인자로 넘겨주면 된다.

Throw new WebApplicationException (400)                             

@Consumes @Produce

JAX-RS에서는 @Consume @Produce라는 Annotation을 지원하는데, @Consume HTTP Request를 받을 때 어떤 형태로 받을 것인 가이다. 현재는 디폴트로 xml request로 받게 되어 있지만, json이나 mime 타입 같은 확장 타입도 지원한다반대로 @Produce는 생성해내는 결과값의 형태에 대해서 정의하는데, @Produce에서 단순하게 타입을 json으로만 정해주면 결과값이 XML이 아닌 json 형태로 리턴된다..

 

3회에 걸쳐서 REST에 대한 개념, .NET JAVA를 이용한 실제 코드 구현에 대해서 살펴보았다. 다음회에서는 마지막으로 엔터프라이즈 시스템에 REST를 적용할 때 필요한 아키텍쳐 적인 면에 대해서 살펴보도록 하겠다.

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,