레이블이 REST인 게시물을 표시합니다. 모든 게시물 표시
레이블이 REST인 게시물을 표시합니다. 모든 게시물 표시

2012년 5월 15일 화요일

REST 알아보기 - 2부, 웹에서 뭐가 그리도 좋을까?

출처 : http://dreamgoer.net/200


이 글은 REST에 대해 정리하는 두편의 글중 두번째 글입니다. 따라서 1부("REST 알아보기 - 1부, 연동의 역사", 클릭)를 읽지 않으신 분은 먼저 1부부터 보시고 본 글을 읽어주시길 바랍니다. 1부 글은 왠만하면 반복하지 않을테니까 말입니다. 


[1부를 아주 간단히 요약해버리자면]

REST도 네트웍에 물려있는 서비스 자원들간의 연동이라는 이슈에서 나온 것으로써, 1부에서 네트웍에서 연동의 역사를 한번 나름대로 짚어보았습니다. RPC - CORBA - RMI - SOAP - REST에 이르기까지, 그 기술들이 진화하며 해결한 부분들을 파악했습니다. 

REST는 "Representaional State Transfer"의 약자로써, 웹프로토콜(HTTP)을 활용하여, Resource 중심으로 연동 인터페이스를 정의하고 사용하는 방법을 제안한 것입니다. 한마디로 웹(HTTP) 프로토콜을 최대한 그대로 사용하여, Open API를 만드는 스타일가이드라고 할 수 있습니다. 

그러나, 이런 개념적인 얘기로는 개발자가 아니신 분들이라면 잘 이해가 가지 않을 것입니다. 그래서 오늘은 좀 더 명확하게 이해할 수 있도록 REST가 좋은 이유를 구체적으로 설명하도록 하겠습니다. 
 


[REST는 뭐가 그리 좋은가?]

1. 웹친화적이다.
이미 웹 친화적이라는 말씀은 서두에서 드렸으므로, 더이상 설명할 필요는 없을 것 같습니다. 요새는 방화벽을 넘어서 연동해야 하는 경우가 허다합니다. 그럴때 SOAP이나 REST를 제외한 다른 연동프로토콜들을 대부분 방화벽에서 문제를 야기합니다. 
(출처: http://olivecentre.org.uk)


2. 웹서버로 해결이 가능하다
REST는 HTTP 동사를 그대로 사용합니다. 앞서서 얘기했듯이 HTTP request, response 전부 재활용합니다. 심지어 Error 상태 code까지도 말입니다. 게다가 결과를 주고받는 것도 웹브라우저에서 지원되는 XML 또는 JSON입니다. (JSON은 자바스크립트에서 XML보다 데이타를 쉽게 전달하는 방법이지요) 따라서 대부분의 서버프로그램을 제외하면 REST를 운용할 수 있는환경이 웹서버하나로 해결되는 셈입니다. (참고로 요새 공유기, IP전화기, 각종 셋탑 등 모든 IP장비는 웹을 통해 설정을 할 수 있게 되어 있습니다. 그 얘기는 그런 장비들에 웹서버들이 모두 들어간다는 것입니다.)
(출처: http://www.symbian-freeware.com)

3. 캐슁(Caching)도 된다
REST 방식을 제대로 적용한다면, 즉 ReSTful하게 잘 만든다면, 웹에서 캐쉬기능도 그대로 활용할 수 있습니다. 아시다시피, 웹에서는 동일한 내용을 계속조회할때 중간노드에서 프락시를 사용하여 트래픽을 줄이기도 합니다. (IE 브라우저 옵션에 보시면 HTTP-Proxy 설정부분이 있는데 바로 그 부분을 말합니다) 그런데, 웹서비스도 알고보면 업데이트보다는 조회가 훨씬 많다는 것이고, 그 조회의 대답은 앞단에서 Proxy가 캐쉬한 값을 전달해서 처리할 수도 있다는 얘기입니다. 잘 사용하면 서버 부하, Response time을 확 줄일 수 있겠죠. 
(출처: http://knowledgehub.zeus.com/media/caching_01.png)


4. 개발자에게 상당히 직관적이다. 
이것도 앞에서 말씀드렸던 내용인데, HTTP 동사를 그대로 사용하고, 예외코드도 그대로 사용하므로, 개발자 관점에서는 상당히 익숙하고 직관적으로 이해할 수 있습니다. 즉 REST로 OpenAPI를 제공하면, 매개변수와 URI에 집중하면 되고, 함수를 실제 호출하고 사용하는 방식에 있어서, 많은 부분 RESTful하다는 얘기로 설명이 된다는 부분입니다. 
(출처: http://4.bp.blogspot.com)


5. 컨텐츠 협상(Negotiation)이 가능하다. 
아니 프로그램에서 웬 협상하실 겁니다. 그런데, Open API는 클라이언트 서버처럼 Tight couple된 관계가 아니라서, 어떤 놈이 HTTP-request를 날릴지 모르는 것이고, 그 놈이 서버에서 제공해주는 HTTP-response를 다 알아 먹을 수 있는지도 알 수 없다는 점입니다. 즉, Response가 기본 한글인데, 함수를 호출한 놈은 영문만 받아들 일 수 있다면, HTTP에서는 컨텐츠 협상을 통해, 이 요구에 대해서는 좀 다르게 응답을 할 수도 있는 것이지요. (아마 HTTP request를 할때, 본문에서 Accept-Language header를 활용하여 이런 협상을 하게되겠죠)
(출처: http://www.isoc.org/inet96)

일반적으로 서버 프로그램하면서 이런 것까지 다 고려해서, 확장성을 확보하기는 사실 어렵습니다. 기껏 한다고 해봐야, if절이나 예외처리(Try catch) 몇개로 해결할 뿐이죠. 그런데 HTTP는 언어나 미디어타입(MIME)까지 기본적으로 협상할 수 있게 왁꾸가 되어 있는 것입니다. 제게는 이런 Feature가 참 아름다운데, 그렇지 않으신지요 ^^; 
(출처: http://www.bbc.co.uk)


6. 웹 기술은 다 써먹을 수 있다. 
데이타를 주고받는데 가장 확장성있는 방법은 누구나 인정하듯 XML입니다. 그래서 웹에서 XML은 엄청 널리 쓰이고 있습니다. REST에서는 결과값을 전달하는 데 있어서 복잡한 내용도, 구조적인 결과도 XML로 처리할 수 있는 것입니다. 
(출처: http://esto.nasa.gov)

아울러 웹은 HTTP-response로 전달될 결과값이, 그리 복잡한 구조도 아니고, 아주 간편한 처리를 할 수 있도록 할 경우 JSON을 쓰기도 합니다. (JSON은 JavaScript에서 손쉽게 구조적인 값을 주고받는 방식이지요) REST에서도 이 방식도 그대로 사용할 수 있습니다. (JSON을 쓸경우, HTTP request의 헤더중에 "Accept: application/json"이 들어가게 되겠지요)

결국 REST에서는 널리 사용되는 웹기술(HTTP + URI + XHTML + XML + JSON ...)을 그대로 받아들여 OpenAPI를 아주 실용적인 관점에서 접근하게 해주는 셈입니다. 


[끝으로 한마디]

제가 설명한 것외에도 HTTP 프로토콜을 사용함으로 얻는 이점은 더 많이 있을 것입니다. HTTP를 아는 사람이라면 새로 배울 필요가 없다, 개발툴, 검증/테스트가 쉽다 등등 말입니다. 그래서 REST는 OpenAPI로 각광받는 것이며, 아울러 계속해서 발전 진화하고 있습니다. WOA(Web oriented architecture)나 WOT(Web of things)같은 게 그발전, 활용도의 극대화 예라고도 할 수 있겠습니다. 

아무쪼록 웹하시는 분들, 매쉬업 아이템을 기획하시는 분들은 REST의 기본개념은 알아두시기 바랍니다. 


REST 알아보기 - 1부, 연동의 역사

출처 : http://dreamgoer.net/199


2000년대 후반부터 웹에서 OPEN API하면 REST가 항상 언급됩니다. 그리고 제가 WOT(Web of things) 소개하면서 쓴 글("왜 WOT인가? - 1부", 클릭)에도, REST가 핵심이라고 했습니다. 그래서 오늘은 웹기반 Open API의 표준 연동방식처럼 회자되는 REST라는 놈에 대해 정리를 해보고자 합니다. 

우선 REST는 무엇일까요? REST(Representaional State Transfer의 약자)는 웹프로토콜(HTTP)을 활용하여, Resource 중심으로 연동 인터페이스 구조를 제안한 것입니다. 그런데 리소스 중심이라는 얘기나, HTTP라는 얘기 모두 감이 잘 오지 않을 것입니다. 일단은 웹서비스를 Open API로 연동하는 데 있어서, 어떻게 HTTP를 사용하면 좋다는 스타일 가이드라고만 해두고 REST가 나오기까지의 히스토리를 좀 짚어보겠습니다. 왜냐하면 웹세상 이전으로 돌아가서, 고전적인 시스템(클라이언트-서버)간 연동 문제가 어떻게 해결되어 왔는지 그 실타래를 따라가다보면 REST가 어떻게 Open API의 강자가 되었는지를 저절로 이해하게 되기 때문입니다. 



[프로그램간 연동 - 고민의 시작]

개발의 기본은 무엇인가요? 라이브러리화(쉽게 말해 함수화하는 것)입니다. 그렇게 함으로써 소스코드를 쉽게 재활용할 수 있게 하고, 특히 라이브러리를 공유함으로 나혼자가 아니라, 다른 사람들도 이어서 개발을 할 수 있는 기반이 됩니다. 그런데, 이렇게 하는 것도 하나의 컴퓨터에서나 가능할 뿐, 네트웍을 넘어갈 순 없었습니다. 즉 A컴퓨터에서 B의 컴퓨터에 있는 라이브러리를 호출할 수는 없다는 것이었습니다. 

그래서 B의 컴에 네트웍을 통해 호출받을 수 있도록 좀 작업을 하기 시작합니다. 그게 소위 RPC 데몬이라는 놈인데, Remote Procedure Call의 약자로 주로 유닉스에서 사용되었었습니다. 하지만 이놈은 보안에도 문제가 좀 있었고, 네트웍 자원 활용이나 함수를 동적으로 사용하는데 있어서도 제약이 있었습니다. (프로그래밍 안해보신 분들은 아래그림보고 그냥 이런게 있구나 하고 넘어가시면 되겠습니다)

(출처: http://www2.cs.uregina.ca)

그래서, 이 문제를 해결하는 김에, 아예 프로그램언어, OS와도 무관하게 해결해보자는 시도가 있게됩니다. 바로 그게 CORBA였습니다. CORBA는 A컴에 있는 C++ 프로그램이, B컴에 있는 자바 서버의 함수도 호출할 수 있게 한다는 뭐 그런 취지였습니다. 원리는 대강 이렇습니다. IIOP라는 프로토콜을 통해서, 프로그램 언어에 상관없이 인터페이스를 정의(IDL)하고, 그걸 기반으로 각 언어에서 CORBA 플랫폼을 통해 개발하면 C++로 짜놓은 함수도, 자바에서 호출할 수 있게 되는 것이었습니다. 

(출처: http://img.zdnet.com)

그런데 CORBA는 무겁고 비쌌습니다. (참고로 많이는 아니지만, Iona의 Orbix와 볼랜드의 Visibroker라는 대표적인 Corba 플랫폼을 다 만져볼 기회가 있었습니다.) 클라이언트는 무료였지만, 서버쪽 CORBA 플랫폼은 2000년 초반가격으로도 1억이 넘었습니다. 게다가 연동오버헤드도 무거운 편이어서, 개발해보면 서버쪽 HW도 어느정도 빠방해야 했지요. 결국 프로그램간 연동을 쉽고 경제적으로 하기 위해 나온 놈이 비싸고 쉽지 않았던 겁니다. 

그래서 Java 진영에서는 RMI (RPC의 자바버전)를 소개합니다. 제가 NMS 개발하면서 사용해보았는데, 쉽고 아주 편했습니다. 하지만 이 놈도 사내 네트웍에서는 연동이 쉬웠지만 방화벽에서는 늘 상 걸리곤 했습니다. 방화벽은 기본적으로 HTTP만 열어주지요. 





[HTTP - 웹서비스 화두를 열다]

그래서 HTTP로 무엇인가 연동하는 방안을 고민했었고, 그게 바로 XML과 HTTP를 결합한 SOAP기반의 웹서비스였습니다. 일단 SOAP은 HTTP를 활용할 수 있므로, 방화벽문제는 어느정도 해결했습니다. 그런데 문제는 여전히 좀 어려웠다는 겁니다. SOAP기반 웹서비스는 근본적으로 서비스지향 구조(Service-Oriented Architecture)로써, SOA라고 불리는데요. 서비스를 자유자재로 정의할 수 있다는 게 매력인 동시에 그만큼 복잡해질 수도 있다는 게 문제였습니다. 

즉 서비스를 정의하는 것 자체도, WSDL이란 놈을 만들어 함수명부터 시작해서 매개변수, 결과값까지 세부적인 사항 하나하나를 정의합니다. 그리고 이를 UDDI(인터넷에서 DNS같은 거라고 이해하시면 됩니다)라는 놈에 등록해서 외부에서 발견할 수 있게 하는 구조였습니다.

(출처: http://nuwanbando.com)

그러다가, 서비스지향으로 바라보기 보다는 리소스기반(Resource-Oriented Architecture: ROA)으로 정의하면 어떻겠느냐는 아이디어가 나옵니다. 잘 아시듯, 웹이라는 놈 자체가 리소스기반입니다. 웹에서는 모든 문서, 객체(URI를 통해 가져올 페이지를 표시하지요)를 대상으로 해서, HTTP Get하는 게 기본 조작입니다. 그래서 자원관점으로 보면, 웹에서 사용하는 HTTP Primitive (GET, PUT, POST, DELETE)를 그대로 쓸 수 있지 않겠냐는 생각을 하게 된거죠. 바로 그게 REST인겁니다. 

결국 REST는 SOAP기반의 웹서비스인 SOA(Service-Oriented Architecture)와 대비되는 자원기반의 ROA(Resource-oriented Architecture) 연동방식인 것입니다. 참고로 ROA는 더 확장해서 WOA 즉 Web Oriented Architecture로까지 발전됩니다. 아래 그림은 ROA의 대표격인 REST를 포함해서, 이를 더 넓게 그린 WOA를 보여줍니다. 


참고로 저는 SOAP시대까지만 프로그램에 손을 대었는지라, REST로 직접 개발을 해본 경험은 없습니다. 대신 REST 책은 한권 읽어보았고, 그걸 기반으로 아는체 하고 있는 겁니다. 따라서 REST 개발자분들께서 댓글을 달아주시면 저와 읽는 분들 모두 다 행복해지겠지요.


[ROA - 생각해보면 그럴싸하다]

SOA에서는 WSDL에 호출할 함수명을 마음대로 정의할 수 있습니다. 즉 id로 이름을 가져오는 웹서비스를 만든다고 할때, getName, retrieveName, findName 모두 사용할 수 있습니다. 그런데 과연 이런 자유도가 중요할까요? 알고보면 이름은 거기서 다 거기인 셈입니다. 

REST는 모든 것을 리소스기반으로 보기때문에, 위의 함수(getName, retrieveName, findName)를 만드는데 사용하는 함수명은 HTTP의 Get임이 자명합니다. 그리고 특정 ID로 이름을 입력하려면 HTTP POST, 갱신하려면 HTTP PUT, 삭제하려면 HTTP Delete를 사용하면 될 것입니다. 바로 이 부분에서만 해도, REST는 개발상 굉장히 직관적인 셈입니다. 

리소스 관점으로 보는 대표적인 예가 DB입니다. DB안에 있는 것은 모두 리소스입니다. 그러면 DB를 조작하는 데 사용하는 SQL의 Primitive는 무엇이 있습니까? 아래 그림 가운데 있는 insert, select, update, delete입니다. 

위에 보시는 것처럼, 각각은 알고보면 HTTP의 기본동사(Primitive)와도 1:1 대응이 됩니다. 그리고 프로그램할때, 특정 변수에 대해 생각해볼 기본조작 함수인 CRUD(Create, Read, Update, Delete)도 알고보면 HTTP 기본동사(Primitive)에 대응이 되는 셈입니다. 즉 REST는 나름 우리가 표준적으로 사용하는 프로그래밍 패러다임과 쉽게 매핑이 된다는 얘기입니다. 

※ SDK를 보신 분들이라면, 메쏘드 이름을 떠올려보세요. 객체지향 프로그램을 하는 분들은 다 공감하실 것이, 객체를 생성하거나, 삭제하는 것을 제외하면, 대부분 함수는 Getter와 Setter로 구성된다는 겁니다. 즉 GetXXX, SetXXX식의 함수가 되버리죠. 물론 Go, run, doIt 같은 함수들도 돌리지만, 그게 알고보면 Create, Delete, GetXXX, SetXXX로 구성될 수 있는 것들입니다. 


[그러면 매개변수와 결과값은 어떻게 전달해주나요?]

아마 누군가가 벌써 질문하고 있을 겁니다. 기존프로그램에서는 함수라는 게 알고보면 함수명만 있는 게 아니고 매개변수고 있고, 결과값도 있는데 그게 어떻게 처리되냐고 말입니다. 일반적인 함수의 형식은 이렇지요. 
  • NameType GetName(String id);

위에서 말한 것처럼, GetName에 해당하는 부분은 HTTP의 GET인 셈입니다. 그리고 Name이라는 부분은 URI를 통해서 이뤄지는데, 아마도 http://abc.com/employee/name?id="ooo" 같은 식으로 HTTP-Request의 GET에서 충분히 표현이 될 것입니다. 그리고 그 결과값(위에서는 NameType)은 형식만 정의하면(보통 XML이나 JSON으로 정의합니다) HTTP response로도 정리가 될 것이구요. 

특히 HTTP는 RESPONSE W3C에서 표준 코드로 인터넷에서 발생할 수 있는 상황을 모두 고려하여 정리되어 있습니다. 즉 결과값에서 200OK뿐만 아니라, 다음과 같은 상태 코드들이 나올 수 있고, 그에 대한 대응도 대부분의 브라우저는 다 알고 있습니다. 다시말해 웹개발을 해본 사람들은 누구나 쉽게 이해할 수 있으며, 이에 맞게 대응할 수 있다는 얘기입니다. (아래는 Status code 일부만 표시해본 것입니다)
  • 301 Moved permanently
  • 302 Found
  • 303 See Other
  • 403 Forbidden
  • 404 Not Found
상기의 HTTP-response 코드는 단순해보이지만, Loosely coupled 된 웹을 지켜주는 오랜 경험의 산물입니다. 실상 이 코드에 따라 IE나 파폭, 크롬, 사파리같은 웹브라우저는 알지도 못하는 아프리카의 한 웹사이트에서 오는 가끔 에러를 발생시키는 검증안된 웹 response에도 걸맞게 대응할 수 있는 것입니다. 

REST에서는 힘하나 안들이고, 상기의 HTTP 프로토콜에서 제공해주는 메커니즘을 그대로 활용하고 있는 셈입니다.

※ 물론 연동방식을 결정하실때 REST로 하자고만 하면 다 해결되는 것은 아닙니다. REST는 RESTful approach, 즉 하나의 방식이라는 표현을 사용하고 있는데 그 이유는 REST가 HTTP Primitive + URI를 사용하여, HTTP-request를 날리고, HTTP-response를 통해 응답결과를 주고받으라는 방식을 지정했을 뿐, 실제 결과 데이타의 표현형식은 개발자가 알아서 정해야 하기 때문입니다.(보통 XML이나 JSON으로 정합니다) 이 점에서 REST는 나름 꽤 열려있지만, 그만큼 REST 이름만 빌릴 뿐 RESTful하지 않은 OpenAPI가 마구 나올 수 있다는 얘기가 됩니다.



[정리하자면...]

REST는 네트웍상에서 원격에 있는 서버의 서비스(API)를 사용할 수 있게, 그것도 방화벽이라는 제약을 넘어서 가능하게 하자는 취지에서 나왔습니다. 이런 시도는 서비스지향의 SOAP기반의 웹서비스도 있었으나 REST는 좀더 실용적인 접근을 했고, 그 실용성, 이해하기 쉬움, HTTP의 Verb, request, response를 그대로 사용한다는 특징덕에 현재는 가장 각광받는 Open API 방식이 되었습니다. 

2부에서는 상기 이유외에도, 아니 상기 이유를 좀 더 구체적으로 명기하여 왜 REST가 OpenAPI의 대명사가 되었는지를 설명하도록 하겠습니다. 

왜 Web of Things인가? - 2부

출처 : http://dreamgoer.net/198


이미 앞글(왜 WOT(Web of things) 인가? - 1부)에서 왜 Web of things인가에 대해 썰을 좀 풀어놓았습니다. 사물들이 똑똑해졌고, 그래서 사물들끼리도 통신을 하게 해서 뭔가 가치있는 서비스 환경을 만들겠다는 야그인데, 그 환경을 이루는 기본 프로토콜로써, 웹 기술을 사용하는 것이 바로 Web of things다 라고 하였습니다. 

특히 웹(Web/HTTP)을 쓰는 이유는 HTTP라는 놈이, 인터넷 정보 객체들간의 프로토콜로써, 10년간 시장에서 사용성이 충분히 입증되어 왔고, 프로그램간에도 이를 통해 통신하는 게 여러모로 좋다는 게 증명되어 왔기때문에, 사물들간의 상위 프로토콜로 딱이다 뭐 이런 내용이었습니다. 

여기서 웹이라고 함은 단순 HTML 페이지를 의미하는 것이 아닙니다. 여기서의 웹은 HTML이 아니라 HTTP에 촛점을 맞추고 있으며, 더 정확하게는 현재 Open API의 표준 방식처럼 회자되는 REST를 지칭하는 것입니다. 

※ REST를 포함, WOT, 미래인터넷에 대한 글도 아래 모두 포스팅해두었으니, 한번쯤 참고하시기 바랍니다. 
 


[WOT에서 REST가 의미하는 바는 무엇인가?] 

WOT에서는 물건들(Things)를 가지고 직접 매쉬업하는 게 가능하게 됩니다. 기존에 얘기되던 사물통신(M2M)에서는 사물들에 통신모듈을 담는 게 핵심이었습니다. 물론, 당연히 서버와 모듈간의 데이타 전송을 위해 Proprietary하게 통신방식을 설정해야 했지요. 그리고 여기서 조금 더 발전하여, 미디어를 전송할때 나름 표준을 만들자는 정도의 얘기들이 있었을 겁니다. 그러나 M2M에서의 통신은 여전히 주로 서버 플랫폼과 단말간의 통신만을 고려한 것이지, 단말의 통신 방식이 얼마든지 확장될 수 있게 하자는 WOT 개념은 부족하다고 생각합니다. 

그런데 WOT에서는 단말이 REST를 수용합니다. 이 말은 단말 자체가 제공하는 데이타 역시 웹상에서 서비스될 수 있는 공용자원으로 본다는 것입니다. 따라서, 단말도 웹서비스를 제공하는 주체가 된다는 것이지요. (REST가 제공되려면 실제로 단말안에 웹서버가 올라가야 합니다) 

(출처: http://www.ektron.com/uploaded_images/openApi.png)

잘 이해가 안가실 수도 있겠지만, 이는 조금만 생각해보면 기존의 M2M 방식과는 철학적으로 굉장히 다른 접근 방식인 겁니다. 즉 M2M에서는 단말은 그냥 원격에 있는 프락시일 뿐, 그 놈이 서비스의 주체는 아닌 것입니다. M2M에서는 나중에 사물과 관련된 새로운 서비스 아이디어가 생겨서 추가 서비스를 만들려고 해도, 항상 M2M 플랫폼을 거쳐야만 가능할 것입니다. 단말을 Tight하게 통제하는 M2M 플랫폼이 제공하는 API를 살펴보고, 이 서비스가 유효한지 검증해야 할거라는 얘기입니다. (물론 단말과 플랫폼사이의 Proprietary 통신방식을 그대로 수용해서, 노가다로 만든다면야 상관없겠지만, 그 부분은 쉽게 외부에 노출된 정보도 아닐 것이며, 액세스도 쉽지 않을 것입니다 )

따라서, 단말에 REST가 올라간다는 것은 WOT단말 + WOT 플랫폼 두가지 모두를 통해서 새로운 서비스를 생성하는 것도 가능해진다는 것입니다. 신나지 않나요? 좀 상상력의 나래를 비약해서 펼쳐본다면, 집에 있는 밥통을 가지고 프로그램을 할 수 있다는 게. 주방에 있는 커피포트와 트위터를 연결할 수 있다는 게, 집전화와 TV를 뽕잡해서 스마트폰으로 확인할 수 있는 그 무엇인가를 쉽게 개발할 수 있다는 게 말입니다. 



[원초 아니 원시적인 WOT PoC 사례]

PoC는 Proof of Concept으로 WOT 개념이 어떻게 실제 적용될 수 있는지를 유식한말로 써본 것입니다. WOT를 열심히 연구하고 있는 Dominique Guiniard라는 사람일 실제로 만들어 본 사례입니다. 이름하야 Energy Visible 이라는 것인데, 구글계정으로(아이구글) 로그인 하면, 로그인 하자마자, 실제 자신이 사용하고 있는 물건의 전력량을 실시간으로 보여주는 것입니다. 

일단 동영상을 보시지요. 

아직 사물들이 WOT 개념을 받아 들인 것은 아니므로, 여기서는 Plogg라는 전력 센서장치를 통해 WOT를 구현하고 있습니다. Plogg는 블루투쓰 기능을 통해, 현재의 전력량을 서버(아마도 PC로 했겠죠)로 보내고, PC는 그 사용량을 다시 구글로 보내 사용자 iGoogle에서 실시간으로 확인할 수 있게 하고 있는 겁니다. 

iGoogle의 케이스는 아니지만, Plogg를 스마트폰에 활용한 구성도는 위의 그림을 이해하는 데도 어느정도 도움이 됩니다. 

(출처: http://www.likecool.com/Home/Appliance/Plogg-Blu/Plogg-Blu-.jpg)

만약 휘센 냉장고가 WOT를 직접 지원해서 전력량외에 각종 정보를 export할 수 있다면, 그리고 그 정보를 LG 전자 휘센 REST API 문서만 보고 쉽게 접근할 수 있다면, 잔머리(?) 굴리기 좋아하는 사람들은 또다시 별의별 서비스를 다 만들어 낼 겁니다. 



[표준화쪽에도 WOT에 대한 움직임이 있을까?]

M2M은 오랜 화두라고 이미 말씀드렸습니다. 이미 2002년부터, NGN을 정립하는 차원에서 사물통신도 포함시키려는 시도가 있었습니다. 아래는 그 사례를 보여주는 그림이라고 할 수 있습니다. 

(출처: ITU-T Y.2002, “Overview of ubiquitous networking and of its support in NGN”)

상기 그림의 오른쪽을 보면 Object를 통신 대상으로 놓고 그림을 그리고 있습니다. 네, 2002년부터 사물들이 통신할 시대가 올 것은 기대하고 있었던 것입니다. 그러나, 이게 현실화되는 데 오랜 시간이 걸렸고, 유비쿼터스라는 화두의 Hype이 좀 지나가면서 최근에 들어와서야 통신방식에 대한 구체적인 얘기도 나오고 있는 것입니다. 

그래서 올 4월에 TTA 표준화 관련 소식에 "유비쿼터스 네트워킹 지원을 위한 Web of Things 표준화"에 대한 얘기가 있었습니다. (관련 링크: "[NGN] ITU-T에서의 “Internet of Things” 관련 표준화")

"... Y.2002에서 유비쿼터스 네트워킹을 지원하기 위한 핵심 능력 중의 하나로 개방형 웹 기반 서비스 환경을 명시해 두고 있다. 실제 사물이 단순한 사물에 머물지 않고 네트워킹 기능을 가진 “smart object”가 되어 실제 응용 서비스에 활용 가능하도록 하기 위하여 web 기술과 접목하려는 다양한 기술 개발이 진행되고 있다. 이를 “Web of Things(WoT)”이란 용어로 표현한다. 4월에 개최된 Q12/13 회의에서 WoT 위한 신규 권고안 작업을 제안하였다. 지금까지 주로 웹 서비스 관련 권고안 작업은 많이 해 왔지만 사물 통신을 지원하기 위한 목적의 웹 관련 권고안 작업은 처음이다. 그런 측면에서 회의에서 무엇보다 WoT에 대한 이해와 기존에 진행해 왔던 관련 권고안 작업들과의 차별성에 대한 많은 논의가 있었다. ..."

특히 Y.WoT에서는 우리나라(ETRI의 이강찬, 이승윤님)에서도 주도적으로 참여한다고 하니 기대가 됩니다. 


[WOT로 가능해질 세상을 다시 보면]

이미 한번 소개한 바 있는 동영상이지만, 엔드유저 입장에서 WOT로 가능할 세상을 소개하는데 있어 아직 이 영상만큼 좋은 것은 없는 것 같습니다. 이 동영상은 제목이 Internet of things 즉 IOT이긴 합니다만, 엔드유저 즉 서비스를 활용하는 최종사용자 입장에서는 WOT나 IOT, M2M이 다 같아 보일 것입니다. 
오늘은 이 동영상으로 포스팅을 마무리 하도록 하겠습니다. 영어의 압박이 있더라도 꼭 한번씩들 보시기를... 

Rest 알아보기 1,2부

출처 : http://www.rcy.co.kr/xeb/411


2000년대 후반부터 웹에서 OPEN API하면 REST가 항상 언급됩니다. 그리고 제가 WOT(Web of things) 소개하면서 쓴 글("왜 WOT인가? - 1부", 클릭)에도, REST가 핵심이라고 했습니다. 그래서 오늘은 웹기반 Open API의 표준 연동방식처럼 회자되는 REST라는 놈에 대해 정리를 해보고자 합니다. 

우선 REST는 무엇일까요? REST(Representaional State Transfer의 약자)는 웹프로토콜(HTTP)을 활용하여, Resource 중심으로 연동 인터페이스 구조를 제안한 것입니다. 그런데 리소스 중심이라는 얘기나, HTTP라는 얘기 모두 감이 잘 오지 않을 것입니다. 일단은 웹서비스를 Open API로 연동하는 데 있어서, 어떻게 HTTP를 사용하면 좋다는 스타일 가이드라고만 해두고 REST가 나오기까지의 히스토리를 좀 짚어보겠습니다. 왜냐하면 웹세상 이전으로 돌아가서, 고전적인 시스템(클라이언트-서버)간 연동 문제가 어떻게 해결되어 왔는지 그 실타래를 따라가다보면 REST가 어떻게 Open API의 강자가 되었는지를 저절로 이해하게 되기 때문입니다. 



[프로그램간 연동 - 고민의 시작]

개발의 기본은 무엇인가요? 라이브러리화(쉽게 말해 함수화하는 것)입니다. 그렇게 함으로써 소스코드를 쉽게 재활용할 수 있게 하고, 특히 라이브러리를 공유함으로 나혼자가 아니라, 다른 사람들도 이어서 개발을 할 수 있는 기반이 됩니다. 그런데, 이렇게 하는 것도 하나의 컴퓨터에서나 가능할 뿐, 네트웍을 넘어갈 순 없었습니다. 즉 A컴퓨터에서 B의 컴퓨터에 있는 라이브러리를 호출할 수는 없다는 것이었습니다. 

그래서 B의 컴에 네트웍을 통해 호출받을 수 있도록 좀 작업을 하기 시작합니다. 그게 소위 RPC 데몬이라는 놈인데, Remote Procedure Call의 약자로 주로 유닉스에서 사용되었었습니다. 하지만 이놈은 보안에도 문제가 좀 있었고, 네트웍 자원 활용이나 함수를 동적으로 사용하는데 있어서도 제약이 있었습니다. (프로그래밍 안해보신 분들은 아래그림보고 그냥 이런게 있구나 하고 넘어가시면 되겠습니다)


그래서, 이 문제를 해결하는 김에, 아예 프로그램언어, OS와도 무관하게 해결해보자는 시도가 있게됩니다. 바로 그게 CORBA였습니다. CORBA는 A컴에 있는 C++ 프로그램이, B컴에 있는 자바 서버의 함수도 호출할 수 있게 한다는 뭐 그런 취지였습니다. 원리는 대강 이렇습니다. IIOP라는 프로토콜을 통해서, 프로그램 언어에 상관없이 인터페이스를 정의(IDL)하고, 그걸 기반으로 각 언어에서 CORBA 플랫폼을 통해 개발하면 C++로 짜놓은 함수도, 자바에서 호출할 수 있게 되는 것이었습니다. 


그런데 CORBA는 무겁고 비쌌습니다. (참고로 많이는 아니지만, Iona의 Orbix와 볼랜드의 Visibroker라는 대표적인 Corba 플랫폼을 다 만져볼 기회가 있었습니다.) 클라이언트는 무료였지만, 서버쪽 CORBA 플랫폼은 2000년 초반가격으로도 1억이 넘었습니다. 게다가 연동오버헤드도 무거운 편이어서, 개발해보면 서버쪽 HW도 어느정도 빠방해야 했지요. 결국 프로그램간 연동을 쉽고 경제적으로 하기 위해 나온 놈이 비싸고 쉽지 않았던 겁니다. 

그래서 Java 진영에서는 RMI (RPC의 자바버전)를 소개합니다. 제가 NMS 개발하면서 사용해보았는데, 쉽고 아주 편했습니다. 하지만 이 놈도 사내 네트웍에서는 연동이 쉬웠지만 방화벽에서는 늘 상 걸리곤 했습니다. 방화벽은 기본적으로 HTTP만 열어주지요. 





[HTTP - 웹서비스 화두를 열다]

그래서 HTTP로 무엇인가 연동하는 방안을 고민했었고, 그게 바로 XML과 HTTP를 결합한 SOAP기반의 웹서비스였습니다. 일단 SOAP은HTTP를 활용할 수 있므로, 방화벽문제는 어느정도 해결했습니다. 그런데 문제는 여전히 좀 어려웠다는 겁니다. SOAP기반 웹서비스는 근본적으로 서비스지향 구조(Service-Oriented Architecture)로써, SOA라고 불리는데요. 서비스를 자유자재로 정의할 수 있다는 게 매력인 동시에 그만큼 복잡해질 수도 있다는 게 문제였습니다. 

즉 서비스를 정의하는 것 자체도, WSDL이란 놈을 만들어 함수명부터 시작해서 매개변수, 결과값까지 세부적인 사항 하나하나를 정의합니다. 그리고 이를 UDDI(인터넷에서 DNS같은 거라고 이해하시면 됩니다)라는 놈에 등록해서 외부에서 발견할 수 있게 하는 구조였습니다.


그러다가, 서비스지향으로 바라보기 보다는 리소스기반(Resource-Oriented Architecture: ROA)으로 정의하면 어떻겠느냐는 아이디어가 나옵니다. 잘 아시듯, 웹이라는 놈 자체가 리소스기반입니다. 웹에서는 모든 문서, 객체(URI를 통해 가져올 페이지를 표시하지요)를 대상으로 해서, HTTP Get하는 게 기본 조작입니다. 그래서 자원관점으로 보면, 웹에서 사용하는 HTTP Primitive (GET, PUT, POST, DELETE)를 그대로 쓸 수 있지 않겠냐는 생각을 하게 된거죠. 바로 그게 REST인겁니다. 

결국 REST는 SOAP기반의 웹서비스인 SOA(Service-Oriented Architecture)와 대비되는 자원기반의 ROA(Resource-oriented Architecture) 연동방식인 것입니다. 참고로 ROA는 더 확장해서 WOA 즉 Web Oriented Architecture로까지 발전됩니다. 아래 그림은 ROA의 대표격인 REST를 포함해서, 이를 더 넓게 그린 WOA를 보여줍니다. 


참고로 저는 SOAP시대까지만 프로그램에 손을 대었는지라, REST로 직접 개발을 해본 경험은 없습니다. 대신 REST 책은 한권 읽어보았고, 그걸 기반으로 아는체 하고 있는 겁니다. 따라서 REST 개발자분들께서 댓글을 달아주시면 저와 읽는 분들 모두 다 행복해지겠지요.


[ROA - 생각해보면 그럴싸하다]

SOA에서는 WSDL에 호출할 함수명을 마음대로 정의할 수 있습니다. 즉 id로 이름을 가져오는 웹서비스를 만든다고 할때, getName, retrieveName, findName 모두 사용할 수 있습니다. 그런데 과연 이런 자유도가 중요할까요? 알고보면 이름은 거기서 다 거기인 셈입니다. 

REST는 모든 것을 리소스기반으로 보기때문에, 위의 함수(getName, retrieveName, findName)를 만드는데 사용하는 함수명은 HTTP의 Get임이 자명합니다. 그리고 특정 ID로 이름을 입력하려면 HTTP POST, 갱신하려면 HTTP PUT, 삭제하려면 HTTP Delete를 사용하면 될 것입니다. 바로 이 부분에서만 해도, REST는 개발상 굉장히 직관적인 셈입니다. 

리소스 관점으로 보는 대표적인 예가 DB입니다. DB안에 있는 것은 모두 리소스입니다. 그러면 DB를 조작하는 데 사용하는 SQL의 Primitive는 무엇이 있습니까? 아래 그림 가운데 있는 insert, select, update, delete입니다. 

위에 보시는 것처럼, 각각은 알고보면 HTTP의 기본동사(Primitive)와도 1:1 대응이 됩니다. 그리고 프로그램할때, 특정 변수에 대해 생각해볼 기본조작 함수인 CRUD(Create, Read, Update, Delete)도 알고보면 HTTP 기본동사(Primitive)에 대응이 되는 셈입니다. 즉 REST는 나름 우리가 표준적으로 사용하는 프로그래밍 패러다임과 쉽게 매핑이 된다는 얘기입니다. 

※ SDK를 보신 분들이라면, 메쏘드 이름을 떠올려보세요. 객체지향 프로그램을 하는 분들은 다 공감하실 것이, 객체를 생성하거나, 삭제하는 것을 제외하면, 대부분 함수는 Getter와 Setter로 구성된다는 겁니다. 즉 GetXXX, SetXXX식의 함수가 되버리죠. 물론 Go, run, doIt 같은 함수들도 돌리지만, 그게 알고보면 Create, Delete, GetXXX, SetXXX로 구성될 수 있는 것들입니다. 


[그러면 매개변수와 결과값은 어떻게 전달해주나요?]

아마 누군가가 벌써 질문하고 있을 겁니다. 기존프로그램에서는 함수라는 게 알고보면 함수명만 있는 게 아니고 매개변수고 있고, 결과값도 있는데 그게 어떻게 처리되냐고 말입니다. 일반적인 함수의 형식은 이렇지요. 
  • NameType GetName(String id);

위에서 말한 것처럼, GetName에 해당하는 부분은 HTTP의 GET인 셈입니다. 그리고 Name이라는 부분은 URI를 통해서 이뤄지는데, 아마도 http://abc.com/employee/name?id="ooo" 같은 식으로 HTTP-Request의 GET에서 충분히 표현이 될 것입니다. 그리고 그 결과값(위에서는 NameType)은 형식만 정의하면(보통 XML이나 JSON으로 정의합니다) HTTP response로도 정리가 될 것이구요. 

특히 HTTP는 RESPONSE W3C에서 표준 코드로 인터넷에서 발생할 수 있는 상황을 모두 고려하여 정리되어 있습니다. 즉 결과값에서 200OK뿐만 아니라, 다음과 같은 상태 코드들이 나올 수 있고, 그에 대한 대응도 대부분의 브라우저는 다 알고 있습니다. 다시말해 웹개발을 해본 사람들은 누구나 쉽게 이해할 수 있으며, 이에 맞게 대응할 수 있다는 얘기입니다. (아래는 Status code 일부만 표시해본 것입니다)
  • 301 Moved permanently
  • 302 Found
  • 303 See Other
  • 403 Forbidden
  • 404 Not Found
상기의 HTTP-response 코드는 단순해보이지만, Loosely coupled 된 웹을 지켜주는 오랜 경험의 산물입니다. 실상 이 코드에 따라 IE나 파폭, 크롬, 사파리같은 웹브라우저는 알지도 못하는 아프리카의 한 웹사이트에서 오는 가끔 에러를 발생시키는 검증안된 웹 response에도 걸맞게 대응할 수 있는 것입니다. 

REST에서는 힘하나 안들이고, 상기의 HTTP 프로토콜에서 제공해주는 메커니즘을 그대로 활용하고 있는 셈입니다.

※ 물론 연동방식을 결정하실때 REST로 하자고만 하면 다 해결되는 것은 아닙니다. REST는 RESTful approach, 즉 하나의 방식이라는 표현을 사용하고 있는데 그 이유는 REST가 HTTP Primitive + URI를 사용하여, HTTP-request를 날리고, HTTP-response를 통해 응답결과를 주고받으라는 방식을 지정했을 뿐, 실제 결과 데이타의 표현형식은 개발자가 알아서 정해야 하기 때문입니다.(보통 XML이나 JSON으로 정합니다) 이 점에서 REST는 나름 꽤 열려있지만, 그만큼 REST 이름만 빌릴 뿐 RESTful하지 않은 OpenAPI가 마구 나올 수 있다는 얘기가 됩니다.



[정리하자면...]

REST는 네트웍상에서 원격에 있는 서버의 서비스(API)를 사용할 수 있게, 그것도 방화벽이라는 제약을 넘어서 가능하게 하자는 취지에서 나왔습니다. 이런 시도는 서비스지향의 SOAP기반의 웹서비스도 있었으나 REST는 좀더 실용적인 접근을 했고, 그 실용성, 이해하기 쉬움, HTTP의 Verb, request, response를 그대로 사용한다는 특징덕에 현재는 가장 각광받는 Open API 방식이 되었습니다. 

2부에서는 상기 이유외에도, 아니 상기 이유를 좀 더 구체적으로 명기하여 왜 REST가 OpenAPI의 대명사가 되었는지를 설명하도록 하겠습니다. 

 
---- 1부 끝 ----
 
이 글은 REST에 대해 정리하는 두편의 글중 두번째 글입니다. 따라서 1부("REST 알아보기 - 1부, 연동의 역사", 클릭)를 읽지 않으신 분은 먼저 1부부터 보시고 본 글을 읽어주시길 바랍니다. 1부 글은 왠만하면 반복하지 않을테니까 말입니다. 


[1부를 아주 간단히 요약해버리자면]

REST도 네트웍에 물려있는 서비스 자원들간의 연동이라는 이슈에서 나온 것으로써, 1부에서 네트웍에서 연동의 역사를 한번 나름대로 짚어보았습니다. RPC - CORBA - RMI - SOAP - REST에 이르기까지, 그 기술들이 진화하며 해결한 부분들을 파악했습니다. 

REST는 "Representaional State Transfer"의 약자로써, 웹프로토콜(HTTP)을 활용하여, Resource 중심으로 연동 인터페이스를 정의하고 사용하는 방법을 제안한 것입니다. 한마디로 웹(HTTP) 프로토콜을 최대한 그대로 사용하여, Open API를 만드는 스타일가이드라고 할 수 있습니다. 

그러나, 이런 개념적인 얘기로는 개발자가 아니신 분들이라면 잘 이해가 가지 않을 것입니다. 그래서 오늘은 좀 더 명확하게 이해할 수 있도록 REST가 좋은 이유를 구체적으로 설명하도록 하겠습니다. 
 


[REST는 뭐가 그리 좋은가?]

1. 웹친화적이다.
이미 웹 친화적이라는 말씀은 서두에서 드렸으므로, 더이상 설명할 필요는 없을 것 같습니다. 요새는 방화벽을 넘어서 연동해야 하는 경우가 허다합니다. 그럴때 SOAP이나 REST를 제외한 다른 연동프로토콜들을 대부분 방화벽에서 문제를 야기합니다. 


2. 웹서버로 해결이 가능하다
REST는 HTTP 동사를 그대로 사용합니다. 앞서서 얘기했듯이 HTTP request, response 전부 재활용합니다. 심지어 Error 상태 code까지도 말입니다. 게다가 결과를 주고받는 것도 웹브라우저에서 지원되는 XML 또는 JSON입니다. (JSON은 자바스크립트에서 XML보다 데이타를 쉽게 전달하는 방법이지요) 따라서 대부분의 서버프로그램을 제외하면 REST를 운용할 수 있는환경이 웹서버하나로 해결되는 셈입니다. (참고로 요새 공유기, IP전화기, 각종 셋탑 등 모든 IP장비는 웹을 통해 설정을 할 수 있게 되어 있습니다. 그 얘기는 그런 장비들에 웹서버들이 모두 들어간다는 것입니다.)

3. 캐슁(Caching)도 된다
REST 방식을 제대로 적용한다면, 즉 ReSTful하게 잘 만든다면, 웹에서 캐쉬기능도 그대로 활용할 수 있습니다. 아시다시피, 웹에서는 동일한 내용을 계속조회할때 중간노드에서 프락시를 사용하여 트래픽을 줄이기도 합니다. (IE 브라우저 옵션에 보시면 HTTP-Proxy 설정부분이 있는데 바로 그 부분을 말합니다) 그런데, 웹서비스도 알고보면 업데이트보다는 조회가 훨씬 많다는 것이고, 그 조회의 대답은 앞단에서 Proxy가 캐쉬한 값을 전달해서 처리할 수도 있다는 얘기입니다. 잘 사용하면 서버 부하, Response time을 확 줄일 수 있겠죠. 


4. 개발자에게 상당히 직관적이다. 
이것도 앞에서 말씀드렸던 내용인데, HTTP 동사를 그대로 사용하고, 예외코드도 그대로 사용하므로, 개발자 관점에서는 상당히 익숙하고 직관적으로 이해할 수 있습니다. 즉 REST로 OpenAPI를 제공하면, 매개변수와 URI에 집중하면 되고, 함수를 실제 호출하고 사용하는 방식에 있어서, 많은 부분 RESTful하다는 얘기로 설명이 된다는 부분입니다. 


5. 컨텐츠 협상(Negotiation)이 가능하다. 
아니 프로그램에서 웬 협상하실 겁니다. 그런데, Open API는 클라이언트 서버처럼 Tight couple된 관계가 아니라서, 어떤 놈이 HTTP-request를 날릴지 모르는 것이고, 그 놈이 서버에서 제공해주는 HTTP-response를 다 알아 먹을 수 있는지도 알 수 없다는 점입니다. 즉, Response가 기본 한글인데, 함수를 호출한 놈은 영문만 받아들 일 수 있다면, HTTP에서는 컨텐츠 협상을 통해, 이 요구에 대해서는 좀 다르게 응답을 할 수도 있는 것이지요. (아마 HTTP request를 할때, 본문에서 Accept-Language header를 활용하여 이런 협상을 하게되겠죠)

일반적으로 서버 프로그램하면서 이런 것까지 다 고려해서, 확장성을 확보하기는 사실 어렵습니다. 기껏 한다고 해봐야, if절이나 예외처리(Try catch) 몇개로 해결할 뿐이죠. 그런데 HTTP는 언어나 미디어타입(MIME)까지 기본적으로 협상할 수 있게 왁꾸가 되어 있는 것입니다. 제게는 이런 Feature가 참 아름다운데, 그렇지 않으신지요 ^^; 


6. 웹 기술은 다 써먹을 수 있다. 
데이타를 주고받는데 가장 확장성있는 방법은 누구나 인정하듯 XML입니다. 그래서 웹에서 XML은 엄청 널리 쓰이고 있습니다. REST에서는 결과값을 전달하는 데 있어서 복잡한 내용도, 구조적인 결과도 XML로 처리할 수 있는 것입니다. 

아울러 웹은 HTTP-response로 전달될 결과값이, 그리 복잡한 구조도 아니고, 아주 간편한 처리를 할 수 있도록 할 경우 JSON을 쓰기도 합니다. (JSON은 JavaScript에서 손쉽게 구조적인 값을 주고받는 방식이지요) REST에서도 이 방식도 그대로 사용할 수 있습니다. (JSON을 쓸경우, HTTP request의 헤더중에 "Accept: application/json"이 들어가게 되겠지요)

결국 REST에서는 널리 사용되는 웹기술(HTTP + URI + XHTML + XML + JSON ...)을 그대로 받아들여 OpenAPI를 아주 실용적인 관점에서 접근하게 해주는 셈입니다. 


[끝으로 한마디]

제가 설명한 것외에도 HTTP 프로토콜을 사용함으로 얻는 이점은 더 많이 있을 것입니다. HTTP를 아는 사람이라면 새로 배울 필요가 없다, 개발툴, 검증/테스트가 쉽다 등등 말입니다. 그래서 REST는 OpenAPI로 각광받는 것이며, 아울러 계속해서 발전 진화하고 있습니다. WOA(Web oriented architecture)나 WOT(Web of things)같은 게 그발전, 활용도의 극대화 예라고도 할 수 있겠습니다. 

아무쪼록 웹하시는 분들, 매쉬업 아이템을 기획하시는 분들은 REST의 기본개념은 알아두시기 바랍니다. 


---- 2부 끝 ----

왜 WOT(Web of things) 인가? - 1부

출처 : http://dreamgoer.net/194


이미 앞서 포스팅에서 미래인터넷(내가 관심있는 미래인터넷 그리고 WOT, 클릭)을 얘기하면서 WOT(Web of things)에 대해 앞으로 소개를 하겠노라고 얘기했었습니다. 그래서 오늘 그 시작을 해볼까 합니다. 

WOT라는 놈이 그리 쉽게 이해가 될 놈이 아니기 때문에, WOT 관련해서는 기존에 나와있는 자료들을 좀 활용하여 설명해보고자 합니다. (설명하면서 제 스스로도 정리해보는 시간으로 활용할 계획이기도 합니다)

먼저 이 얘기를 풀 중심자료로 슬라이드 쉐어에 있는 "Web of Things - Connecting People and Objects on the Web"라는 자료를 선정해보았습니다. 먼저 자료 전체는 아래와 같습니다. 

슬라이드쉐어에 가서 Web of things 검색하면 여러가지 자료가 나옵니다. 그 중에 이 자료가 설명하는데 편할 것 같아, 이 놈을 선정한 거구요. 이 자료를 설명하는 데 있어서도 지루하지 않도록 3번에 나눠서 포스팅을 하도록 하겠습니다. 오늘은 M2M, IOT도 있는데, 왜 WOT까지 나왔느냐에 대한 얘기입니다. 


[영리해지는 Things들]
가전은 우리 생활에 뗄레야 뗄수 없는 Things 들입니다. 그런데 이 놈들이 갈수록 영리해지고 있습니다. 이제 가전제품에 CPU가 안들어가는 게 거의 없습니다. 밥솟만 해도, 버튼을 누르면 각종 메뉴별로 알아서 요리를 해주는데, 이런 식의 프로그램이 돌기 위해서는 낮은 성능이라도 CPU가 들어가게 됩니다. CPU라는 놈은 제가 그 옛날 정보처리기사딸때 외웠던 한글이름으로는 "중앙연산처리장치"이며, 컴퓨터에서 머리역할을 한다고 외웠던 놈입니다.네치에 머리역할을 할 수 있는 CPU가 들어가는 것을 볼때 장치는 분명 똑똑해지고 있는 것입니다. 


생각해보세요. 80년대 거실을 차지하던 아날로그 전화기가 지금은 스마트폰으로 얼마나 똑똑해졌는지. 그냥 전파 받아서, 채널별로 변복조 하여 디스플레이하던 아날로그 TV가 IPTV로 변모되면서 셋탑에 무엇(CPU, 하드디스크 등등)이 들어가는지 말입니다. 



[혼자 영리해봐야 별 수 없다]

그런데 그 놈들이 혼자 영리해져봤자 그리 요긴하지는 않습니다. 밥솥이 아무리 지혼자 잘나서 영리해져봤자, 사용자가 무엇을 요리할지 선택해주지 않는 한, 지가 알아서 할 수 있는 게 없습니다. 

JJ가 함부로 마구 만든 예를 들어보죠. 이를테면 화려한 싱글을 즐기는 한 아가씨가 있다고 해봅시다. 이 아가씨는 집을 정말 좋아하고, 온갖 자동화기기(Home automation)로 집을 단장했습니다. 이 아가씨는 딱 자신이 원하는 취향대로 설정을 잘 해둡니다. 즉 저녁에 집에 돌아올 시간 20분전에, 냉난방이 가동되도록 하고, 10분전에 샤워를 위한 온수가 준비되게 하고, 그게 끝나면 맛있는 잡곡밥을 먹을 수 있도록 30분전에 밥통이 요리를 시작하는 겁니다. (물론 쌀과 물은 아침 출근시간에 미리 들어가 있다는 전제겠지요)


그런데 갑자기 왠일. 갑작스레 상사가 고객사의 요청으로 함께 저녁을 할 일이 생긴겁니다. 당장 집까지 가서 예약해둔, 냉난방 가동, 온수 예약, 밥통설정을 취소할 수도 없고... 지혼자 잘난 물건들도 내 앞에 없으면 다 허사가 되고 마는 겁니다. 아마 아침도 잘 안먹는 이 아가씨로서는 내일 저녁이나 되서, 하루지난 밥으로 저녁을 떼워야 할 겁니다. 


그래서 Thing 혼자 독립적으로 영리한 것보다, 적당히 멍청해도 connected 되는 게 어찌보면 더 중요합니다. 왜냐하면 입출력만 잘 할 수 있고 그것을 외부로 전달할 수 있으면, 외부에 더 강력한 CPU와 메모리를 갖춘 놈이 더 영리한 짓거리를 할 수 있기 때문입니다. (아 바로 그게 소위 요새 말하는 클라우드 컴퓨팅이라는 거겠죠)

생각해보십쇼. 그 아가씨가 사용하는 에어컨, 밥통, 보일러가 모두 통신칩이 내장되어 있다면, 좀 다른 상황이 만들어질 수도 있었을 겁니다. 이를테면, 그 아가씨가 스마트폰을 사용하여 캘린더에 저녁식사 일정을 넣자마자, 개인 일정 프로그램이 저녁이라는 키워드를 알아듣고, 집안에 예약된 각종 물건들의 예약을 알아서 취소하거나, 고객과의 미팅이 끝나는 시간에 맞춰 다시 예약설정을 하는 겁니다. 좀 억지스럽긴 하지만 기술적으로 가능은 한 것이죠.



[그래요. 그런데 왜 그런 서비스가 안되나요?]

앞에서도 제가 좀 억지스럽다는 말씀을 드렸습니다. 이유야 들자면 여러가지가 있겠지만, 무엇보다도 각 물건들은 제조사도 틀리고, 통신기능을 담는다고 해도, 통신하는 방식에 대한 표준이 없으므로, 클라우드에 존재할 개인 일정프로그램이 이 걸 다 지휘(Ochestrate)할 여력이 없기 때문입니다. 


만약 세상에 하나의 제조사만 있어서, 표준통신 방식을 정해놨다면 몰라도, 각 물건마다 상이한 기능셋, 그리고 이를 접근하는 프로토콜별로 제어하는 어플을 개발하려고 하면 정말 난감할 것입니다. (각종 물건별로 통신을 맞추는 것은 정말 롱테일 마켓에 엄청난 노가다로 들이대는 겪일 겁니다) 그래서 M2M이란 놈이 아직까지도 한계를 겪는 것이기도 할 겁니다. 

M2M(Machine to Machine)이라는 놈 자체가, 애초에 이통사업자들의 떨어지는 ARPU를 보전하기 위한 수단으로 시작되었습니다. 모든 개인에게 휴대폰이 주어지자 음성 통신 사업이 포화상태에 이르렀고, 사업자들끼리 가격경쟁을 하면서 ARPU도 떨어지자, 다른 수익원을 찾아 눈을 돌린 것입니다. 사람에서 눈을떼자 사람보다 더 많은 Things로 넘어갔고, 그래서 각종 원격검침에서부터 M2M 어플이 시작된 겁니다. 어쨋든 제가 하고 싶은 얘기는 M2M은 통신료 수익을 내기 위한 부분에 집중을 하고 있다는 얘기이며, 그 얘기는 이통사업자별로 수익과 관련된 부분이므로 상위 프로토콜에 있어서도 표준보다는 자신의 플랫폼에 Lock-in을 시킬 수 있는 방향으로 흘러가게 되었다는 것입니다.  
따라서 필요한 것은 범용적인 프로토콜입니다. 고성능 CPU가 들어가지 않더라도, 가볍고, 간단하게 정보를 주고 받을 수 있는 그런 프로토콜 말입니다. 그리고 그게 표준이 있다면 더욱 좋겠지요. 


그런데 그런 프로토콜을 만들기는 쉽지 않습니다. 삼성이 만들면, 경쟁사인 LG는 다른 쪽을 택할 것이고, 아마 소니, GE 등등 각 가전회사는 이 표준에 있어서 어느 누구에게도 양보하려고 하지 않을 것입니다. 물건들의 통신 프로토콜 표준을 리딩한다는 것은 가전시장에서 갖는 파워가 엄청날테니까요. (그래서 표준이라는 게 항상 쉽지 않은 거겠죠) 



[아차, 그런데 웹(HTTP)이 있었군요!] 

그런데 통신의 표준하면 떠오르는게 있었군요. 바로 웹이지요. 제가 14,400bps 모뎀을 통해, 하이텔, 천리안을 쓰던 시절, 윈도우 3.1이 나오고 나서 좀 있다보니까, 각 통신사의 접속 프로그램들이 윈도우 기반으로 바뀌기 시작했습니다. Dos 방식과 달리, 그래픽으로 사용하기도 쉬워집니다. 하이텔도, 천리안, 유니텔, 채널아이등 모두 GUI기반으로 바뀐 겁니다. 그런데 이들은 각각 자기들 세계에서만 놀 뿐 이쪽에서 저쪽으로 정보를 공유하지도 못했고, 접속할때마다 다른 프로그램을 설치해야 했습니다. 

그런데 웹이 나오면서 이들이 설자리를 모두 잃어버리게 됩니다. 웹은 하이텔, 나우누리, 천리안 뿐만 아니라, 이 프로토콜만 지키면 개인조차도 홈피를 만들어 정보를 공유할 수 있게 된 겁니다. (그러자 다음, 네이버, 야후 등이 하이텔, 천리안, 나우누리의 자리를 완전히 뺏어가 버리게 되었지요) 

그렇다면, 왜 Things에서도 그게 안되겠느냐 하는 겁니다. 즉 Things간에 주고받는 프로토콜도 어느 한 대기업의 지적재산권에 종속되느니, 아예 HTTP기반으로 적용해버리자는 거지요. 사실 웹(HTTP)은 10년이상의 세월을 거쳐, 보완 발전되고, 증명되었습니다. 전세계를 커버할 정도로 Scalability가 입증되었고, 어느 한 사이트가 무너진다고 다른 사이트가 연쇄적으로 영향을 받지도 않게 되어 있습니다 (즉 충분히 Loosely coupled되어있습니다) 게다가 많은 개발자들이 이미 익숙해져 있는 프로토콜이고, 툴도 사방에 깔려 있습니다. 


아마 이쯤되면, 흠 쫌 말이 되긴 하는 것 같은데... 뭔가 논리적인 비약이 있는 것 같아 하실 겁니다. 그렇게 생각하셨다면 정말 예리하신 겁니다. 네. 사실은 제가 웹(HTTP)라는 말로 좀 어설프게 넘어갔습니다. 사실 HTTP에서 주고받는 HTML로 웹페이지 만들어 놨다고 해서 지능적이 되는 것은 아닙니다. 왜냐하면 기본적인 HTML 웹페이지는 인간이 잘 읽을 수 있도록 마크업해놓은 언어일뿐, 실제 기계가 무엇인가 이를 보고 해석할 수 있게 되어 있는 구조는 아니기 때문입니다. 

그래서 WOT에서 얘기하는 HTTP란 그 안을 들여다 보면, 지금 웹 개발자들이 프로그램들끼리 연동할 수 있는 그 HTTP를 말하는 겁니다. 이 말은 좀 더 구체적으로 말하자면, 요새 유행하는 웹기반의 Open API 방식인 RESTful Approach를 말하는 겁니다. 기술 모르는 분들은 구글맵이랑 부동산을 엮은 매쉬업 프로그램을 생각하시면 됩니다. 서로 다른 웹인데, 프로그램들끼리 HTTP를 주고 받아서 새로운 웹 페이지를 생산해 내는 바로 그런 구조를 말하는 겁니다. 

결국 웹/HTTP(Restful 웹)이 프로그램들끼리 매쉬업을 할 수 있듯이, 사물에도 그렇게 HTTP를 적용해보면 사물들끼리도 communication이 가능해진다는 얘기입니다. 게다가 이 기술은 이미 검증되어 많은 개발자들이 알고 있는 기술이고, 툴도 많으며, 사실상 웹세계의 표준이므로 M2M 세계의 상위 프로토콜로는 Best-fit이라는 얘기입니다.


아마 REST 라는 놈을 모르시는 분들은 뭔가 하실 겁니다. 다음 포스팅(2부)에서는 REST라는 놈에 대해 기술적으로 좀 더 심도있게 들어가서, 되든 안되든 제 블로그 독자님들의 동의를 끌어내 볼 생각입니다. (참고로 보시면서궁`금하신 사항이 있으면 언제든지 댓글 달아주세요. 비록 제가 정답을 드린다는 보장은 없지만서도 ㅠㅠ...)