 |  |
|
난이도 : 중급 Indrajit Poddar, Advisory Software Engineer, IBM Zhi Gan, Software Engineer,
IBM
Yue Lin Liu, Software Engineer,
IBM
2007 년 5 월 08 일 세 번째 시리즈에서도 비즈니스 서비스를 실행하는 복합 애플리케이션(composite application)을 방법을 설명합니다. 이번에는 Representational State Transfer (REST) 아키텍처 스타일을 중점적으로 설명합니다. REST 스타일 인터페이스로서 facade 컴포넌트를 사용함으로써, 기존 SOAP 스타일의 웹 서비스는 커스터마이징 가능한 URL, 다중 리소스 포맷 표현, 브라우저 응답 캐시(cache), 대형 어태치먼트 스트리밍, HTTP 메소드를 사용한 리소스 조작 등을 지원할 수 있습니다.
머리말
Representational State Transfer (REST) 아키텍처 스타일은 웹 서비스를 사용하는데 있어서 장벽이 낮은 엔트리 포인트를 제공한다. 전형적인 REST 스타일 애플리케이션의 외부 인터페이스는 Uniform Resource Identifier (URI)로 접근할 수 있는 많은 리소스들과 Create, Read, Update, Delete (CRUD) 같은 몇 가지 연산들로 구성된다. 이러한 아키텍처 스타일의 장점은 단순함이다.
개발자이자 작가인 Paul Prescod는 REST 웹 서비스를 "HTTP 프로토콜의 신택스와 의미를 사용하여 이것의 기능을 URI로 접근할 수 있는 리소스로서 전달하는 웹 서비스"로 정의하고 있다. (참고자료) World Wide Web도 REST 스타일이다. 웹을 기반으로 하는 HTTP 프로토콜은 Uniform Resource Locators (URLs)를 사용하여 리소스와 GET, POST, PUT, HEAD, DELETE 같은 잘 알려진 HTTP 메소드를 통해 리소스를 조작한다. 이러한 단순한 아키텍처 스타일은 웹의 약결합 된 분산 인프라스트럭처를 재사용 함으로써 확장성과 상호 작동성을 가능케 한다.
이 글에서는 모기지(mortgage) 이율을 Bankrate 같은 애그리게이터(aggregator) 웹 사이트로 퍼블리시 하는 은행용 비즈니스 서비스 예제를 설명한다. (참고자료보기) 애그리게이터 웹 사이트는 다양한 공급자들에게서 정보를 모아서 이것을 클라이언트 측 매시업(mashup)에 모은다. 이는 composition on the glass라고도 일컬어지며, 복합 애플리케이션으로 간주될 수도 있다. 매시업을 쉽게 만들려면, 서비스 공급자는 단순화 된 인터페이스를 노출해야 한다. REST 아키텍처 스타일은 이러한 요구 사항에 딱 맞는다.
이 글에서는 기존 SOAP 스타일 웹 서비스에 REST 스타일 인터페이스를 제공할 때 facade 컴포넌트를 사용하는 방법을 설명한다. 컴포넌트의 훌륭한 기능들을 설명하고, Rational® Software Architect Reusable Asset Specification (RAS) 패턴에서 이러한 기능들을 파악한다. 이 패턴은 기존 웹 서비스의 엔드포인트와 연산에 의해 매개변수화 된다. 이 패턴은 전개 가능한 Java™ 2 Enterprise Edition (J2EE) 서블릿으로 변형되어 기존 웹 서비스를 호출할 수 있다. 생성된 서블릿은 브라우저 캐싱, 리소스 콘텐트 포맷 협상, SOAP Attachment for Java (SAAJ) 표준을 사용한 대형 어태치먼트의 HTTP 스트리밍 같은 REST 스타일의 기능들을 지원한다.
URI, CRUD, 매시업, facade 패턴, SOAP 스타일 웹 서비스, RAS 패턴, SAAJ에 대한 추가 정보는 참고자료 섹션을 참조하라.
REST 스타일 facade 컴포넌트의 매력적인 기능들
다음은 REST 스타일 facade 컴포넌트의 매력적인 기능들이다.
- REST 스타일의 리소스를 나타내는 커스터마이징 가능한 URL
- REST 아키텍처 스타일은 세분화된 리소스에 대한 액세스에 URL을 사용한다. 예를 들어, 모기지 애플리케이션에서, 은행이 특정 날짜에 제공하는 모기지 이율은 필요한 리소스가 될 수 있다. 다른 URL이 각각의 세분화된 리소스를 나타내면 이메일 같은 다른 애플리케이션들은 그러한 리소스들을 쉽게 참조할 수 있다. 또한, Ajax 같은 Web 2.0 기술을 사용하여 클라이언트 측 리소스들을 합성할 수 있다. 따라서, 웹 서비스 facade 컴포넌트는 애플리케이션 개발자들이 리소스를 나타내는 URL을 커스터마이징 할 수 있도록 한다.
-
GET, POST, DELETE, PUT, TRACE, OPTIONS 같은 HTTP 메소드로 리소스 조작하기
- REST 스타일 웹 서비스는 잘 알려진 연산 세트들을 통해 리소스에 액세스 하여 리소스를 표현하고, 리소스에 대한 정보를 모으고, 리소스를 조작할 수 있다. HTTP 프로토콜은 이미 연산 세트(
GET, POST, PUT 등)를 정의하고 있다. (참고자료) facade 컴포넌트는 이러한 HTTP 메소드의 사용을 지원한다. SOAP 웹 서비스용 Web Service Description Language (WSDL) 1.1은 HTTP POST 메소드만 지원한다. WSDL 2.0은 HTTP GET 바인딩 지원을 추가하여 이를 보완했지만, WSDL 2.0은 WebSphere® Application Server V6.1에서는 아직 지원되지 않는다. HTTP DELETE, PUT, TRACE, OPTIONS 메소드들은 자주 사용되지 않으며, 방화벽에 의해 종종 차단된다.
- 리소스 표현과 콘텐트 포맷 협상
- URL에 의해서 액세스 된 각각의 리소스는 리소스에 액세스 하는 클라이언트에 따라서 다양한 폼으로 표현될 수 있다. 클라이언트는 데스크탑 머신의 HTML 브라우저, 또 다른 SOAP 웹 서비스, Ajax 또는 JavaScript Object Notation (JSON) 클라이언트가 될 수 있다. (참고자료) facade 컴포넌트는 HTTP 요청의
Accept 헤더 필드를 쿼리하여 클라이언트에 맞는 응답 포맷을 결정하고 알맞은 포맷으로 리소스를 제공한다.
- 리소스 표현의 브라우저와 게이트웨이 프록시 캐싱
- REST 스타일 인터페이스는 HTTP
GET 메소드를 사용하여 리소스에 액세스하는데 가장 일반적으로 사용된다. HTTP GET 요청의 경우, REST 스타일의 웹 서비스는 HTTP 응답 헤더 필드를 설정하여 리소스가 리턴했던 유효 또는 무효 정책 중 어떤 것이 캐시되고, 얼마나 오래 캐시될 수 있는지에 대한 힌트를 웹 브라우저 캐시에 제공한다. 응답 캐시를 실행하면 애플리케이션의 확장성을 높일 수 있다. facade 컴포넌트는 HTTP 헤더 Cache-Control 응답 명령어를 PUBLIC, PRIVATE으로 설정한다.
- SAAJ를 사용하여 SOAP 스타일 웹 서비스 호출하기
- SOAP 스타일 웹 서비스는 XML로 응답을 리턴하는데, 이것은 REST 스타일 클라이언트에 맞는 리소스 표현 포맷이다. 따라서 facade 컴포넌트는 XML로 된 SOAP 응답 메시지에 직접 액세스 하여 불필요한 언마샬링(unmarshalling) 오버헤드를 방지한다. 이를 위해, facade 컴포넌트는 SAAJ를 사용하여 기존 웹 서비스를 호출한다. SAAJ는 웹 서비스 응답의 어태치먼트에 많은 데이터를 HTTP를 통해 스트리밍 할 수 있다.
 |

|
REST 스타일 웹 서비스 facade용 RAS 패턴
간단히 말해서, RAS 패턴은 해당 정황에서 발생하는 문제에 대한 솔루션을 기술하는 재사용 가능한 자산이다. (참고자료) 패턴들은 솔루션 개발을 자동화 하는 IBM Rational Software Architect (RSA) 같은 툴을 사용하여 파악될 수 있다. 다음 섹션에서는 REST 스타일의 웹 서비스 facade의 바람직한 기능들을 파악하는 RAS 패턴에 대해 설명하겠다.
패턴의 다운로드와 설치
REST 패턴과 재사용 가능한 에셋으로 압축된 변형 플러그인은 다운로드 섹션을 참조하라. 이것을 RSA에 설치하는 단계는 다음과 같다.
- 다운로드 패키지의 압축을 푼다.
- Rational Software Architect에서 File>Import 윈도우를 통해 RestFeature.ras 에셋 파일을 반입한다. Import 윈도우에서 RAS Asset 유형을 선택한다. 마법사 페이지로 가서 에셋을 반입한다.
-
Help>About IBM Rational Software Development Platform을 클릭한다.
- 플러그인이 성공적으로 설치되었는지를 확인하려면 Plug-ins Details 윈도우에서 RestPattern Plug-in과 RestPatternTransform Plug-in을 찾아보라. (그림 1)
그림 1. 플러그인 보기
패턴 인스턴스 만들기
다음은 패턴 인스턴스를 생성하는 단계이다.
-
Window>Show View>PatternExplorer로 Pattern Explorer 뷰를 연다. 이 패턴은 Web 2.0 그룹 속에 있다. (그림 2)
그림 2. Pattern Explorer 뷰에서 새로운 패턴 보기
- RSA에서 Modeling 퍼스펙티브를 열고, 새로운 모델링 프로젝트를 만든다.
- 새롭게 생성된 프로젝트에서 비어있는 UML 모델을 만든다.
- 패턴을 새롭게 생성된 모델로 드래그(Drag and drop) 한다.
이제 RESTWebServiceFacade 패턴의 인스턴스를 만들었다. 다음 단계는 매개변수에 채우는 단계이다.
패턴 매개변수 지정하기
RESTWebServiceFacade 패턴 인스턴스에 다음과 같은 매개변수들을 설정한다.
표 1. REST 패턴에서 지원되는 매개변수들
| 매개변수 이름 | 용도 |
|---|
ExistingWebServiceEndPoint
| 기존 SOAP 웹 서비스의 엔드포인트. 이 패턴은 이것을 위해 J2EE 서블릿 facade를 생성한다. SOAP 웹 서비스의 WSDL 파일에서 이 값을 찾을 수 있다. |
NameSpace
| 기존 SOAP 웹 서비스의 네임스페이스. 이 매개변수는 SOAP 요청 메시지를 만들 때 사용된다. SOAP 웹 서비스의 WSDL 파일에서 이 값을 찾을 수 있다. |
Operation
| 관심 있는 리소스로 액세스 하는 기존 웹 서비스에 있는 단일 연산. |
Parameter
| 연산을 호출하는데 필요한 모든 매개변수 리스트. |
FacadeURLContextPath
| 대상 웹 프로젝트의 콘텍스트 경로. REST 스타일의 서비스에 액세스 하는 URL의 첫 부분이다. 다중 J2EE 웹 컴포넌트들은 콘텍스트 경로를 공유할 수 있다. |
FacadeURLServletPath
| facade에 의해 표현된 리소스에 액세스 하는 URL의 커스터마이징 가능한 부분을 지정한다. |
HTTPMethod
| 지원되는 HTTP 메소드의 리스트. 현재는 GET, POST, DELETE만 지원된다. |
ReplyFormat
| 지원되는 리소스 표현 포맷(예, XML 또는 HTML). facade는 HTTP 요청의 Accept 헤더를 체크하여 지원되는 포맷이 요청되었는지 여부를 확인하고, 지원될 경우 요청된 포맷으로 리소스를 제공한다. |
Cache
| HTTP 응답 헤더의 Cache-Control을 Public으로 설정하여, 응답이 캐싱 가능한지 여부를 설정한다. |
그림 3은 이 패턴의 인스턴스이다. 인스턴스는 다음과 같은 매개변수들과 함께 기존 웹 서비스 연산을 위한 facade로서 사용될 수 있다.
- 엔드포인트는
http://localhost:9081/RESTRouter/service/RatesFacade이다.
- 연산 이름은
queryRate이다.
- 네임스페이스는
http://ejbs이다.
- 매개변수는
prodId(Mortgage 같은 값이 있음)와 prodType(30-year fixed 같은 값이 있음)이다.
REST 스타일의 이율 리소스에 액세스 하는 URL 예제는 http://localhost:9080/bank/rate?prodId=Mortgage&prodType=30-year%20fixed이다. 여기에서, servletPath는 매개변수에서 /rate로 설정되고 contextPath는 /bank로 설정된다. 서비스 응답에서 지원되는 리소스 표현 포맷들은 XML과 HTTP이고, 응답은 캐시가 가능하다.
그림 3. RESTWebServiceFacade 패턴의 패턴 인스턴스
패턴을 J2EE 서블릿으로 변형하기
다음은 패턴을 J2EE 서블릿으로 변형하는 단계이다.
- 동적 웹 프로젝트를 만든다.
- 패턴을 오른쪽 클릭하고, Transform>Pattern to WebServiceFacadeServlet를 선택한다. (그림 4)
- 1 단계에서 만들었던 새롭게 생성된 웹 프로젝트를 설정한다.
그림 4. 변형 실행하기
그림 5는 생성된 래퍼 서블릿 모습이다.
그림 5. 래퍼 서블릿
생성된 J2EE 서블릿 코드의 업데이트, 전개, 호출
생성된 코드를 업데이트 하여 추가 리소스 표현 포맷을 지원하고, SOAP 메시지에서 어태치먼트를 가져오는 방법은 다음과 같다.
- 생성된 서블릿 코드를 본다.
- 지정된 HTTP 메소드들은 J2EE
HttpServlet 추상 클래스를 확장하고, doGet, doPost, doDelete 같은 상응하는 J2EE 서블릿 메소드를 구현함으로써, 생성된 facade 서블릿에서 지원된다.
- Listing 1은 생성된 코드로서, SAAJ를 사용하여 기존 웹 서비스를 호출한다.
Listing 1. SAAJ를 사용하여 기존 SOAP 웹 서비스 호출하기
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
//Create objects for the message parts
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
envelope.getHeader().detachNode();
//Populate the body
//Create the main element and namespace
SOAPElement bodyElement = body.addChildElement(envelope
.createName(operation, "req", ns));
//Add content
bodyElement.addChildElement("prodid").addTextNode(para0);
bodyElement.addChildElement("prodtype").addTextNode(para1);
//Save the message
message.saveChanges();
URL endpoint = new URL(endPoint);
SOAPMessage respMsg = connection.call(message, endpoint)
|
- Listing 2는 생성된 코드가 브라우저 캐시를 지원하는 방법이다.
Listing 2. 브라우저 캐싱 HTTP 헤더 설정 예제
response.setHeader("Cache-Control", "public");
|
- Listing 3은 올바른 리소스 표현을 파악하고 MIME 콘텐트 유형을 설정하는 코드 모습이다.
Listing 3. 리소스 표현과 콘텐트 포맷 협상 예제
String[] pattern_accepts={"text/xml"};
String req_accepts = request.getHeader("Accept");
RESTResourceRepresentationContext repContext =
new RESTResourceRepresentationContext();
String format_decision = repContext.getAcceptFormat(pattern_accepts,
req_accepts);
response.setContentType(format_decision);
repContext.registerDefaultStrategies();
repContext.generateAppropriateResourceRepresentation(respMsg,printer);
|
- 생성된 코드를 업데이트 한다. 다음과 같은 유형의 코드 수정이 필요하다.
- 새로운 리소스 표현 포맷을 지원한다. 커스텀 응답 포맷을 만들기 위해서는,
RESTResponseStrategy 클래스에서 상속을 받고 이를 RESTResourceRepresentationContext 클래스의 registerStrategy() 연산으로 등록하여 새로운 전략을 만든다.
- SAAJ를 사용하여 HTTP를 통해 스트리밍 할 대형 어태치먼트를 받는다.
SoapMessage#getAttachments() 메소드를 사용하여 SOAP envelope에서 어태치먼트를 추출할 수 있다. 이 같은 방식으로 추출된 어태치먼트를 HTTP 응답 객체를 통해 클라이언트로 보낼 수 있다.
- 웹 프로젝트를 J2EE 1.4 애플리케이션 서버에 전개한다. (Figure 5)
- 매개변수에서 만들어진 URL을 사용하여 facade를 호출한다. http://localhost:9080/<FacadeURLContextPath>/<FacadeURLServletPath>?<Parameter=value>[: Parameter=value]
- REST 서비스 클라이언트에서 연산 결과를 본다. (그림 6)
그림 6. 웹 브라우저상에 나타난 REST 래퍼
패턴 플러그인용 소스 코드
패턴 플러그인에 맞게 소스 코드를 수정하여(다운로드) REST 스타일의 웹 서비스 facade를 만들 때 자신의 개발 조직에 맞는 베스트 프랙티스를 파악할 수 있다.
REST 아키텍처 스타일을 사용하지 않아야 할 때
REST 아키텍처 스타일이 여러 상황에서는 매우 매력적이지만, 어떤 경우에는 맞지 않는다. 다음과 같은 경우이다.
- 원격 프로시저 호출 스타일의 서비스 호출이 구조화 되지 않은 요청 또는 응답 포맷 보다 더 선호되는 경우
- 두 계좌 간 돈을 이체하는 트랜잭션 웹 서비스를 생각해 보자. 트랜잭션 무결성 지원은 REST 스타일의 웹 서비스에서는 기본적으로 되지 않지만, 이것은 SOAP 스타일의 웹 서비스에는 추가될 수 있다.
- 서비스 호출에 다중 프로토콜들이 개입된 경우
- 동기식 스타일 보다는 비동기식 스타일의 인터페이스를 지원할 경우가 그렇다.
- Business Process Execution Language (BPEL)를 통한 비즈니스 프로세스로의 통합이 선호될 경우
- 현재 BPEL 프로세스는 REST 스타일의 인터페이스를 지원하지 않는다. Service Component Architecture (SCA) 컴포넌트만 BPEL 프로세스에 구성될 수 있다.
결론
REST 스타일의 웹 서비스 facade는 다중 리소스 포맷 표현, 응답의 브라우저 캐싱 지원, PUT, TRACE, DELETE 같은 HTTP 메소드 지원 등의 훌륭한 기능들을 제공한다. RAS 패턴 에셋은 REST 스타일의 웹 서비스 facade를 개발할 때 알맞다.
감사의 말
REST 스타일 facade의 기능과 관련하여 조언을 준 Lawrence Mandel, Thomas Schaeck, Chris Brealey, Christopher Hepper, Stefan Hepper, Kelvin Lawrence, Noah Mendelsohn, Mark Phillips, Luciano Resende, Arthur Ryman, Tony Storey에게 감사의 말을 전한다. 또한, 편집에 맡은 Aimee Dean과 Patrick Flanders에게도 감사의 말을 전한다.
기사의 원문보기
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| REST Web Service RAS pattern | restsrc.zip | 318KB | HTTP |
|---|
| RestFeature RAS files | RestFeature.ras | 525KB | HTTP |
|---|
참고자료 교육
토론
필자소개  | |  | Indrajit Poddar는 IBM Software Group Strategy 부서의 Strategy, Technology, Architecture and Incubation 팀의 일원이다. 이곳에서, 복합 비즈니스 서비스들을 구현하기 위한 여러 통합 개념 정의를 수행하고 있다. Penn State University에서 컴퓨터 공학 및 엔지니어링 석사 학위를 받았으며, Indian Institute of Technology에서 컴퓨터 공학 및 엔지니어링 학사 학위를 받았다. 자바 툴용 Memory Dump Diagnostic 기여에 대해서 2005년 IBM Outstanding Technical Achievement Award를 수상했다. |
 | |  | Zhi Gan은 IBM China Development Lab의 소프트웨어 엔지니어이다. 그는 Shanghai JiaoTong University에서 컴퓨터 보안 부분 박사 학위를 받은 후 IBM에 입사했으며 SOA, AOP, Eclipse로 경력을 넓혀가고 있다. 요즘에는 모델 중심 개발에 관심을 갖고 있다. |
 | |  | Yue Lin Liu는 J2EE, SOA, MDA, PKI, AOP, 그리드 컴퓨팅 애플리케이션의 소프트웨어 아키텍처 및 개발에 8년의 경력을 갖고 있으며 엔터프라이즈 애플리케이션의 패턴과 아키텍처를 집중적으로 다루고 있다. |
기사에 대한 평가
|  |