adsense(728_90)


웹 2.x 시대의 서버측 웹 개발 환경: 1. REST 에 대하여 IT

REST (Representational State Transfer) 라는 것을 아시는지... 본 블로그를 뒤져보니 2003년에 REST를 최초로 언급한 글이 있습니다. 그때는 국내에 REST를 아는 분이 거의 없었고 저 역시 그저 정말 사용하기 쉽구나 정도의 감탄만을 했을 뿐이었는데, 결국은 이렇게 웹 2.0과 함께 화려하게 등장했네요. 결국은!

얼마전 서울 시내 서점에 가서 Web 2.0이나 AJAX관련 책들을 둘러봤습니다. 수많은 AJAX관련 서적에 놀라서 하나씩 하나씩 목차만 보고 넘어갔는데, 거의 대부분은 말 그대로 Open API를 이용해서 매쉬업해서 새로운 클라이언트 애플리케이션을 만드는 내용이었습니다. 기본적으로 자바스크립트와 AJAX, JSON, Dojo, RSS, ATOM등의 기술을 소개하는 책들이 대다수이더군요. 하지만 이러한 클라이언트가 갖다 쓸 수 있는 Open API를 구축하는 기술 및 경험을 다룬 책(번역서 포함)들은 거의 없었습니다. 제가 보지 못한 것일 수도 있으니 좋은 책이 있으면 알려주시면 감사하겠습니다. 이 '웹 2.x 시대의 서버측 웹 개발 환경' 시리즈는 말 그대로 클라이언트 개발자가 아닌, 서비스를 제공하는 서버측 웹 개발자를 위한 기술적인 내용을 다루려고 합니다. 그러려면 이 REST에 대해 보다 조금은 알고 넘어가는 게 좋겠습니다.

REST는 무엇인가요?


REST는 2000년에 Roy Fielding이라는 분이 고안한 소프트웨어 아키텍처입니다. 이 REST를 다룬 최초의 논문은 아래 링크에서 확인하실 수 있습니다.
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
하지만 위의 내용만으로 REST를 이해하기란 여간 어려운 일이 아닙니다. 이러한 난해함은 그것을 정리한 영문 위키 페이지한글 위키 페이지에서도 크게 다르지는 않습니다. REST를 구현해서 쓰기란 참으로 쉬운데 개념은 이토록 추상적이고 오묘해서인지, 국내에 나온 웹 2.0관련 번역서나 저서에서도 알기 쉽게 REST를 설명하지는 않는 듯 합니다. 몰라도 쓰는 데는 큰 지장이 없거든요.
그러면 REST를 이용한 웹 아키텍처의 특징을 하나씩 살펴봅시다.

먼저 REST는 다음과 같은 특징을 갖고 있습니다.
클라이언트- 서버 방식(특히 pull 방식입니다)의 아키텍처 스타일입니다. 또한 Stateless (무상태)의 특성과 느슨한 연결의 특징을 가지고 있으며 어떤 통일된 인터페이스를 가지고 있습니다. 무엇보다도 REST의 특징은 Resource 즉 자원 중심의 아키텍처라는 것입니다.
따라서 저는 REST를 '자원 중심의 클라이언트-서버 아키텍처'라고 정의해도 무방하다고 생각합니다.

REST에서는 모든 행위의 시작은 자원의 인식부터입니다. 이것은 RPC방식과는 다릅니다. 예를 들어 서버에서 제공하는 서비스를 통해 무언가를 주문하는 행위를 하려면 RPC의 경우는 purchase() 함수에 필요한 정보를 담아서 서버에 전달합니다. RPC의 주된 관심은 Call입니다. purchase라는 함수의 호출이죠. 하지만 REST의 방식은 먼저 자원이 인식되어야 합니다. 즉 구매주문서/구매내역 이라는 자원이 먼저 인식된 후 이 자원에 대해 통일된 API(웹의 경우 GET,POST,PUT,DELETE)를 이용하여 주문을 하거나 주문 내역을 보거나 취소하게 됩니다.

위의 예를 이해할 수 있으시겠습니까? 어쩌면 REST는 객체지향 방식이라고도 볼 수 있을 것 같습니다. 객체(자원)를 먼저 정의하고 객체 내부에 행위를 포함하고 있는 형태죠. 다만 이 행위 즉 인터페이스가 모든 객체에게 있어서 동일하다는 것이 일반적인 객체지향 방식과 차이점이라고 봐야합니다.

어쨌든 REST라는 아키텍처는 웹 아키텍처와 너무나 잘 어울리고 딱 들어맞습니다. 웹은 REST의 특성을 지니게 되어 오늘날의 성공을 이루었다고 혹자들은 말을 합니다. 웹을 이 REST에 맞게 쓰는 것은 참으로 쉽습니다.

http://호스트/고객
 GET: 고객들의 목록을 가져온다
 POST: 신규 고객을 추가한다
http://호스트/고객/최진호
 GET: 최진호 고객의 정보를 가져온다
 PUT: 최진호 고객 정보를 업데이트 한다.
 DELTE: 최진호 고객 정보를 삭제한다.

위의 예처럼 일단 자원을 URI 작성 방식에 맞게 정의하고나면 그것으로 취할 수 있는 기본적인 행위를 유추하기란 어려운 일이 아닙니다. 일반적으로 필요한 인터페이스를 웹은 이미 제공하고 있습니다. 따라서 굳이 복잡하게 SOAP이나 RPC를 웹에서 별도로 구현해서 사용할 필요도 없어집니다.

REST의 오해


많은 분들이 REST에 대해 오해하시는 것 중 하나는 REST는 HTTP 프로토콜을 이용해서 직접 XML문서를 전달하는 방식이라는 것. 위에서 언급한 것처럼 REST는 그저 아키텍처 스타일인 것이고 XML로 내용을 보내든 어떤 것을 보내든 그것은 중요한 것이 아니라는 것이죠.
또한 REST는 HTTP method가 제공하는 CRUD (Create, Read, Update, Delete)만을 사용할 뿐이라는 오해입니다. REST를 이용해서 구현할 수 있는 것은 무한합니다. 이 시리즈를 통해 다양한 REST기반 서비스를 구현하는 데 필요한 정보를 얻으실 수 있을겁니다.

RESTful 웹서비스


이렇게 REST 스타일로 웹의 서비스를 구현했을 때 우리는 이를 일컬어 RESTful 웹서비스라고 합니다. 이 RESTful 웹서비스는 세가지 특징을 가지게 되고 이것이 바로 RESTful 웹서비스의 삼위일체설(?)입니다.

즉, RESTful 웹서비스는 자원과 행위와 컨텐츠 타입으로 구성되고 이는 각각 URI와 HTTP Method 그리고 MIME type등으로 이루어지게 됩니다.

RESTful 웹서비스 만드는 순서


이러한 RESTful 웹서비스를 만드는 데도 물론 순서가 있습니다.
  1.  무엇보다 자원 식별 및 자원의 식별자를 정의해야 합니다. 예를 들어 직원 관리 관련 서비스를 만들 때 제공하고자 하는 것이 개별 직원에 대한 것인지 아니면 전체 직원 정보에 대한 것인지에 따라 자원 식별자는 /employees 일수도 있고 /employee/empid1 일 수 있을 것입니다.
  2. HTTP 요청/응답에 관련된 헤더의 내용을 정의해야 합니다. 즉 Accept, Content-Type 등이 포함될 수 있습니다.
  3. 주고받는 데이타의 형식을 정의해야합니다. 크게는 JSON, XML, PDF, 이미지 등이 될 수 있고 다시 세부적인 설계가 필요할 수 있겠지요.
  4. 각 자원들에 대해 어떠한 method를 제공할 지를 결정해야겠죠.
  5. 마지막으로 HTTP가 Return하는 상태 코드(Status code)에 대해 정의해야 합니다. HTTP는 기본적으로 이러한 코드를 이미 제공하고 있습니다. 이에 대한 확장과 재정의 작업을 통해 클라이언트가 보다 세부적인 행동을 취할 수 있게 해야 합니다.
이 다섯가지 단계는 가장 기본적인 순서일 뿐이며 보다 자세한 내용은 다음 글에서 계속 다룰 예정입니다.

매력덩어리 REST


간단하게 REST에 대해 소개하였습니다. REST 방식의 웹서비스는 참으로 단순 명료하기 때문에 다양한 잇점을 가지고 있습니다. 우선 개발이 용이하다는 점이 있고 서비스 운영 측면에서는 클라우드 컴퓨팅에 적용하기 매우 편하다는 점, 캐시같은 여러 기존의 성능 향상 기법을 도입하기 용이하다는 점,URI별로 개별적인 보안 특성을 부여하기가 쉽다는 점등 상당히 많은 장점을 가지고 있습니다. 때문에 구글 뿐만 아니라 Amazon이나 eBay, Yahoo, Twitter등과 같은 웹에 기반한 서비스를 제공하는 기업들은 이 REST기반의 OPEN API를 제공하고 있지요. 다음 글에서는 REST기반의 웹 서비스를 구현하는 보다 자세한 내용을 다룰 것입니다. 또한 RESTful 서비스가 왜 기업환경에서 쓰여야 하며 어떤 효과가 있고 이를 위한 개발 운영환경은 어떠한 것이 고려되어야 할지도 찬찬히 다뤄보겠습니다.

핑백

  • Me, You and Us - calmglow (최진호) : 웹 2.x시대의 서버측 웹 개발 환경: 2. URI 패턴 2009-05-16 01:49:29 #

    ... 째 글이 늦어졌습니다.매일 꼬박꼬박 블로그에 글을 올리는 분들이 정말로 존경스럽습니다. 회사에선 업무보랴, 서핑하랴 집에선 노느라 블로깅 하기가 정말 쉽지가 않으니까요. 각설하고 두번째 글에서 RESTful 서비스는 크게 자원과 행위와 컨텐츠의 타입으로 이루어진다고 언급했습니다. 아울러 REST 서비스를 만들기 위한 절차 등을 간단하게 살펴보았습니다. 무엇보 ... more

덧글

  • 차우차우 2009/04/16 23:11 # 삭제 답글

    좋은 글 잘 봤습니다. 최근에 RESTful웹서비스라는 번역서를 읽고 있는데 참 난해하더군요. -.-
    차라리 원서를 볼껄 후회한다는..

  • Yozz 2009/04/17 00:10 #

    예 저도 서점에 가서 놀란 게 형편없는 번역서가 너무 많았다는 점이었어요. 얼굴이 화끈거릴 정도의 번역이더군요..
  • 써니 2009/04/20 01:09 # 답글

    책 좀 찾아보려 했는데, 위 대화를 읽으니... 그냥 Yozz님 포스팅을 기다리는 게 나은건가요?
    참 번역이라는 게 어려운 일인데, 너무 가벼이 접근하는 경향이 있죠.
  • Yozz 2009/04/20 10:52 #

    제 포스팅은 심심풀이 땅콩 수준이고 사실 위에서 언급한 책등이 좋은 책이긴 한데 번역이 문제인듯 합니다.
댓글 입력 영역


Google Analytics