336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
앞의 포스트에서는 WCF와 ASP.NET Ajax의 연동을 살펴 보았습니다. 이번에는 2006년도부터 새롭게 부상해 온 REST 웹 서비스가 무엇인지 또한 WCF에서는 어떻게 구현할 수 있는지 살펴보도록 하겠습니다.

서비스의 새로운 패러다임 REST(Representational State Transfer)

2006년부터 크게 이슈가 된 기술이 바로 REST라는 방식의 웹 서비스 입니다. REST는 웹 2.0의 패러다임으로 등장했던 Open API 보다 간단하게 제공하기 위해서 사용되었던 방식입니다. REST는 2000년도에 외국의 어떤 박사의 학위 논문에서 처음으로 제안되었습니다. 그 당시는 대규모의 네트워크 시스템을 위한 방법이라는 뜻으로 발표한 것이었지만 최근 이용되고 있는 REST는 HTTP와 XML을 이용하여 데이터를 주고 받는 웹 서비스를 이용하는 것으로 쓰이고 있습니다. REST 방식의 웹 서비스를 쉽게 이해하기 위해서 어떻게 메시지를 주고 받게 되는지 동작 아키텍처를 살펴보도록 하겠습니다. 먼저 기존의 SOAP을 이용한 일반적인 웹 서비스 방식은 다음과 같습니다.


[일반적인 웹 서비스]
 
반면에 REST는 URL을 요청하게 됩니다. 복잡한 SOAP 메시지를 호출하지 않아도 URL을 이용해서 데이터를 요청해야 한다는 것이죠.

[REST 방식의 웹 서비스]

위의 그림을 보면 12133이라는 URL을 통하여 데이터를 요청하고 있고 그 데이터는 XML 형식으로 반환하게 됩니다. 반환되는 XML 형식은 다음과 같습니다.
 
 
http://blog.hoons.kr/member/12133
 
[GET 요청]
 
 
<ArrayMember
 xmlns=”http://schemas.datacontract.org/2004/07/wcf“
xmlns:i=http://www.w3.org/2001/XMLSchema-instance>
    <member>
      <name>HOONS</name>
      <birth>1983</birth>
    </member>
</ArrayMember>
 
[반환데이터]

REST는 표준으로 지정된 기술이 아닙니다. 일단, 기술 표준을 제정하는 것은 쉬운 일이 아니고 많은 시간을 필요로 합니다. 하지만 그와 반대로 웹 기술은 매우 빠르게 변해가고 있습니다. OPEN API를 SOAP으로만 이용하기에는 심플하지 못하다는 것이고 때문에 그 SOAP에 대한 대안으로 REST가 발전해오게 된 것입니다.


 
그럼 REST얼마나 이용하고있을까?

REST가 얼마나 활용되고 있는지 살펴보도록 하겠습니다. 먼저 구글의 OPEN API는 처음에 SOAP을 이용한 방식의 Open API를 제공했습니다. 하지만 2006년 12월 5일에 SOAP 대신 REST를 기반으로 한 Ajax Search API를 제공한다는 발표를 하게 되었습니다. 그 당시 구글은 SOAP을 지원 안 한다는 메시지를 올려서 많은 우려와 비난의 목소리들이 있었지만 얼마 안 있어 SOAP API는 유효하고 기존의 서비스는 계속 유지될 수 있다는 사과의 글이 올라 왔었다. (OPEN API의 한계를 보여주는 사례이기도 하네요)

[구글의 Search API]

또한 아마존의 경우 SOAP과 REST 두 개 방식 모두 지원하고 있었습니다. 그럼 클라이언트들은 어떤 메시지를 더 많이 사용할 까요? 작년에 아마존이 발표한 통계는 다음과 같습니다.


[작년에 발표한 아마존의 OPEN API 사용률]


그럼 국내 포털의 OPEN API 는 어떨까요?
[네이버의 OPEN API]

 
네이버의 경우 REST 방식으로 질의하면 RSS 검색 결과로 그 값을 반환해 주게 됩니다. 하지만 RSS를 파싱할 수 있는 엔진이 제공되지 않았다는 점에서 조금 아쉽다는 목소리들이 많이 있지만 REST를 지원해준다는 점에서는 만족을 보이고 있습니다.

이처럼 클라이언트는 간단한 REST 방식을 더 선호하고 있고 또한 여러 업계들은 이미 REST 방식의 웹 서비스를 제공하고 있는 것을 볼 수 있습니다.

 
닷넷으로 REST 서비스를 구현하려면?

MS에서는 이미 이런 URL 요청방식의 기반한 데이터 서비스의 개발을 진행해왔습니다. 그 코드명은 “ASTORIA”입니다. (공식사이트 -  ADO.NET Data Services) 현재는 개발 진행중에 있으며 CTP 버전을 다운 받아 사용할 수 있습니다. 이 서비스를 이용하면 데이터와 URL을 쉽게 매칭하여 작업할 수 있습니다. 하지만 아직 개발 진행 중이고 CTP 버전이라는 부분이 당장 서비스를 구현하기에는 조금 이른 감이 있습니다.

REST서비스를 물론 손수 구현할 수도 있을 것입니다. 하지만 직접 발한다는 것은 개발 생산성이나  관리적인 측면에서 융통성이 없겠죠. 때문에 지금 REST방식의 웹 서비스를 구현하기 위한 방법으로는 WCF 서비스를 이용하는 것이 지금으로서는 최선입니다. 닷넷3.5에서는 보다 쉽게 REST를 구현할 수 있도록 지원하고 있습니다. 시대 패러다임에 맞추어 JSON 데이터 타입을 지원했던 것처럼 WCF에서는 보다 쉽게 REST 방식의 서비스를 구현할 수 있게 지원해준 것입니다. 물론, 기존의 닷넷3.0의 WCF에서도 REST 방식의 서비스를 구현할 수 있었지만 코드가 WCF 스럽지 못했습니다. 이번에 WCF 3.5에서는 WebGet이라는 어트리뷰트가 추가되면서 아주 쉽게 REST 서비스를 구현할 수 있습니다.


How to Coding?
 
WCF에서 REST 서비스를 구현해 보도록 하겠습니다. 앞에서 설명한 것처럼 WebGet을 이용하면 아주 쉽게 구현할 수 있습니다. 먼저 WebGet을 지원하기 위해서 바인딩을 다음과 같이 설정합니다.
 

<servicename="Service"behaviorConfiguration="ServiceBehavior"><?xml:namespace prefix = o /><?xml:namespace prefix = o />
  <endpointaddress=""behaviorConfiguration="WebBehaviors"binding="webHttpBinding"contract="IService"> </endpoint>
</service>

..
생략..

<
endpointBehaviors>
  <behaviorname="WebBehaviors">
    <webHttp />
  </behavior>
</endpointBehaviors>

[Web.Config]

여기서 <webHttp>와 binding의 설정을 꼭 추가해주어야 합니다. 다음은 서비스 인터페이스에 [WebGet] 어트리뷰트를 선언해줍니다.
 

[ServiceContract]
publicinterfaceIService
{

    [OperationContract]
    [WebGet]
    string GetHoonsName();

    [OperationContract]
    [WebGet( UriTemplate = "GetHoonsInfo/{id}")]
    Human GetHoonsInfo(string id);
}

[DataContract]
publicclassHuman
{
    int birth = 1983;
    [DataMember]
    publicint Birth
    {
        get { return birth; }
        set { birth = value; }
    }

    string name = "HOONS";
    [DataMember]
    publicstring Name
    {
        get { return name; }
        set { name = value; }
    }

    ArrayList hobby = newArrayList();
    [DataMember]
    publicArrayList Hobby
    {
        get { return hobby; }
        set { hobby = value; }
    }
}

[서비스 인터페이스]
 
이렇게 인터페이스를 만들고 서비스를 구현해주면 완성되는 것입니다. 그럼 직접 URL을 요청해 보도록 하겠습니다. 
 

[Service.svc/GetHoonsName]


WebGet의 URL을 지정하지 않았기 때문에 주소 뒤에 메서드 명을 쓰게 그 메서드가 호출됩니다. 다음은 XML 데이터를 반환하는 GetHoonsInfo를 호출한 예제입니다.

[Service.svc/GetHoonsInfo/1577]


기본 포맷은 XML입니다. 여기서 반환 타입을 JSON으로 변환할 수도 있습니다.

[OperationContract]
[WebGet(UriTemplate = "GetHoonsInfo/{id}"
       ,ResponseFormat=WebMessageFormat.Json)]
Human GetHoonsInfo(string id);

[ResponseFormat]

여기서 Response 포맷을 Json으로 설정하게 되면 다음과 같은 형식의 메시지가 반환됩니다.

 
{"Birth":1983,"Hobby":["Drum","Guitar"],"Name":"HOONS"}
 
[Json Return]


정리

예전에 HOONS는 K모바일 뉴스에서 주최한 “차세대 웹 기술& RIA 컨퍼런스” 에서 RIA 기반의 SOA가 필요하다는 메시지를 전한 적이 있습니다. 즉, HTML, XML, SOAP, JSON등과 같은 데이터 포맷을 유연하게 제공해 줄 수 있는 서비스가 필요하다는 것이죠.

[RIA를 위한 SOA의 아키텍쳐]

여기서 WCF3.5 버전이 발표되면서 벤더의 통합까지는 아니더라도 그림과 같은 데이터 포맷을 어느정도 유연하게 지원해주면서 SOA에 한발짝 다가 섰다고 볼 수 있습니다.

서비스의 형태도 IT의 흐름처럼 빠르게 바뀌어 가고 있습니다. 이런 REST 방식의 웹 서비스가 등장하게 된 것도 바로 SOAP 보다 간단한 표준이 정의되어 있지 않았기 때문이고 또한 REST가 그만큼 심플합니다. 거기에 시대적으로 OPEN API가 뒷받침 되기 때문에 REST방식의 웹 서비스가 하나의 패러다임으로 등장하게 된 것입니다. 최근에 이렇게 유행되고 있는 것들은 다 과거에 존재했던 개념들입니다.무엇보다도 표준기술, 대안기술들을 이해하기 위해서 우리는 보다 넓게 볼 수 있는 시야가 필요합니다. 그 기술을 자세히는 몰라도 대충 어떤 용도이며 어떻게 사용되는지는 알고 있어야 한다는 것입니다. 적어도 시대를 따라가는 개발자가 되겠다면 말이죠.

출처 : http://blog.hoons.kr/blog_post_22.aspx

'-- IT Trend' 카테고리의 다른 글

SOAP(Simple Object Access Protocol)란?  (0) 2010.03.02
웹서비스(Web Service)란?  (0) 2010.03.02
Representational State Transfer(REST)란?  (0) 2010.02.18
REST API (Representational State Transfer)  (0) 2010.02.18
CAPTCHA  (0) 2009.12.07
posted by 어린왕자악꿍