REST(Representational State Transfer)란 용어를 요즈음 많이 들을텐데 ...
이걸 통해서 웹에 대해서 다시 한 번 생각을 하고 우리 App개발에서 되집어볼 요소를 생각해볼 수 있었음한다.
REST란 요즘에는 XML과 HTTP를 사용하는 웹기반인터페이스를 지칭(REST의 원칙을 따르는 웹서비스 혹은 URL구조)하는 것으로 굳어졌지만 원래는
웹과 같은 네트워크 시스템을 위한 원칙을 의미한다.
REST란 말을 그대로 해석한다면 구체적인 상태 전이로 할 수 있을텐데 이것은 웹시스템을 떠올리게 되면 네트워크가 있고
특정 웹에 사용자가 링크를 선택하게 되면 다른 페이지로 전이되는 모습을 설명한것이다. (요청 --> 네트워크 --> 웹페이지 --> 전이 --> 다른 페이지)
REST에서 정의하는 주요 원칙은
- 클라이언트 서버(웹으로 보면 브라우저 / 웹서버) : Stateless
- 보편적인 인터페이스 (HTTP Method로 정의 된다. GET/POST/DELETE/PUT... )
- 자원은 URI를 통해 유일하게 지정된다.
- 각 자원들은 URI를 통해 서로 연결될 수 있다
이 원칙들이 뭐 새로운 건 아니고 웹 자체가 만들어 질 때 설계가 된 것이고 이걸 잘 재정의한게 REST라고 할 수 있는데 몇가지 되집을게 있는데
REST에서 stateless 라면 즉 session, cookie는 사용하지 않는 것이 원칙이다. 이건 REST를 이용한 OPEN API에서 인증키라는 넘으로 표현한다. (매번 인증)
또 하나를 더 보면 웹에서는
GET : URI에 있는 자원 획득, select
POST : URI에 자원을 수용하도록 요구, insert
DELETE : URI의 자원 제거 , delete
PUT : URI에 자원을 위치 , update(어째 파일 업로드가 확 오긴 하지만...)
로 처음 디자인을 했는데 뭐 CRUD에 대한 내용에 대한 정의니까 당연한 디자인이겠지만 브라우저에서 GET/POST만 지원하는 것은
이것만으로도 충분하다고 생각도 된거기도 하고 GET은 조회, POST는 CUD의 역할을 한다고 디자인을 한 것이다.
* 조회하는 성격의 URL을 POST방식으로 하는 것은 웹의 디자인에도 유배될뿐만 아니라 stateless와 원래 용도를 이해한다면 브라우저에서 '만료된 페이지입니다'를 뿌리는 이유를 이해가 될 것이다.
GET의 제한이 있다고 ...조회용 URL을 POST로 한다는 것은 웹디자인상 편의상 규약상 하지말아야 할 일이고 가급적 나머지 등록 등은 POST로 해주는게 좋은 것이다.
전에 내가 이 얘기를 했을 때 누가 나한테 'insert후 결과값을 얻어서 POST 던져서 뿌려줘야 결과 처리 페이지는 어떻게 해요?' 라고 물은 적이 있었는데
당연히 key만 받아서 다시 얻어오는 것이 원칙이다. 주문 완료페이지는 주문 번호만 넘겨서 받아오던가...
(싸이마켓 초창기에 이렇게 되어 있는 것들이 많았지. 실패사례 중 하나)
이제 REST를 stateless와 Uniform interface라는 측면에서 구체적으로 보면서 RESTful App를 보면 다음과 같이 과장해서 정의를 할 수 있는데
HTTP method인 GET/POST/DELETE/PUT 와 리소스에 대한 URI의 결합으로 App의 동작을 정의하는 스킴으로 얘기할 수 있다.
예를 들면 만약 우리가 상품번호가 100번인 상품 정보를 상품정보를
조회 /item/item.do?method=doItemDetailView&goods_no=100 --> REST로 한다고 하면 /item/100 을 GET으로 요청
삭제 /item/item.do?method=doUpdateItem&goods_no=100 --> /item/100 DELETE으로 요청
이런식인데
언뜻 보면 URL의 의미가 명확해지는 듯 하기도 하고 모델만 잘 정의하면
(만약 신규 업무가 나온다고 하면 그 리소스에 대한 정의만 하면 되니까
e.g. 상품 일시 중지는 freeze라는 걸 정의하고 이런식으로 /item/100/freeze를 POST로 날리는 식으로, 삭제는 /item/100/delete 이렇게)
설계도 편하고 너무나 외부에 hackable한 제공을 해 줄 수 있게 보여쥴수 있죠.
(요즈음 블로그 URL을 보면 잘 따르고 있죠.
이 잘정리된 URL이 참 의미가 있는데 ... 웹이 링크로 움직이는 시스템이니까 더더욱 그런데
홈2의 게시물의 주소복사를 하면 이런식으로 되어있긴 한데...눈에 바로 보이는 링크는 이게 아니라서 -한번이라도 덜 타게 하려고 의도적으로 한건지는 모르겠지만
...요즈음 웹을 이렇게 만들면 욕먹는다는 거...우린 더 심하니까 할 말은 없고)
많이 샜는데 REST를 따르는게 많은 장점이 있을 듯 한데 적용하기를 가로막는 단점들이 있는데
일단 브라우저가 GET/POST외에 put/delete는 지원하지 않는다는거와 App의 복잡한 업무가 GET/POST/PUT/DELETE로 정의가 다 될수가 없기 때문에
당연히 custom method에 대한 리소스를 지원해야 하는데 보면...
아까 상품삭제를 /item/100 delete로 요청하는걸 /item/100?method=delete 로 한다고 하면...후자가 오히려 명확하게 보이기도 하고
웹 App의 복잡한 다 일일히 모델을 만들어줘야 하는데 이 작업이 비용이 많이 드는 작업이 되기 때문에 REST의 장점이 오히려
손실이 되기도 한다.
REST스런 App를 전면적으로 만드는건 참 힘들 수 있는 일이긴 하지만 분명
REST스런 App를 만들려고 하는 것은 장점이 많을 수 있고 설계를 하는데 유용한 컨셉이 될 것이다.
설계시
* unique URI
- 리소스에 대한 정의(item, cart, coupon) + action(get/post/delete/put을 염두에 두고)
- 설계한 모델의 리소스의 제대로 된 액션 정의. 만약 method가 getitem 인데 이걸 파라미터로 분기해서 다른 액션을 취하게 하는 건 틀린것이다.
* hackable URI
를 염두에 두고 하면 좋을 것이다
다음은 아마존의 REST방식 OPEN API중 장바구니 추가 예제인데 이걸 보면 좀 더 명확해질텐데
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&SubscriptionId=[Your
Subscription ID
Here]&Operation=CartAdd&CartId=[A Cart
ID]&HMAC=[An HMAC Shopping Cart
Token]&Item.1.ASIN=[An
ASIN]&Item.1.Quantity=1
여기서 subscriptionID는 --> 로그인을 위한 key(stateless)
Operation=CartAdd --> 리소스에 대한 action 정의
결과는 xml형식으로 return 된다.
아마존의 매출의 40%이상이 OPEN API에서 나오고 SOAP, REST방식으로 제공되는 OPEN API중에서
85%이상이 REST로 제공되고 있다.
국내에서는 옥션, GSeshop등이 SOAP으로 제공하고 있으나 별 의미 없는 상태이고
우리도 판매자 연동쪽에서는 OPEN API 제공 요구가 꾸준히 있다. 얼른 해야 할텐데...
참고 URL
http://www.awszone.com/
http://openapi.naver.com/index.nhn
http://www.restlet.org/ : Lightweight REST framework for Java