개요

“REST는 Architecture다”라는 말을 인터넷 검색을 하며 자주 보았다. 처음엔 이게 무슨 소린가 했다. REST(Representational state transfer)라는 용어를 전혀 몰랐을 땐 '이게 무슨 언어인가?', '프로토콜인가?' 긴가민가 한 상태에서 뜬구름 잡듯이 개념을 파악해야했다.
내가 이해한 형태로 글을 적자면 '네트워크 환경에서 자원에 대한 객체를 주고/받고/조작하는 방법론' 이 아닐까 한다.
네트워크 환경에서 어떤 특정 자원에 접근하자면 그 자원의 위치를 알아야 한다. 현재 REST를 실현하기 위해 이러한 자원 위치를 URI(Uniform Resource Identifier) 형태로 접근 가능하다. 또한, 해당 자원에 대한 정보 교환 및 조작은 CRUD를 기본으로 한다. 일반적으로 REST 구현을 위해 HTTP 프로토콜을 사용하는데 HTTP에서 제공하는 메소드를 통해 CRUD를 실현한다. 그러한 것으로 GET, POST, UPDATE, DELETE가 있다.

REST 구조적 제약

Roy Fielding은 웹의 확장을 위해서는 몇가지 제약사항이 필요하다고 보았다. 이러한 제약이 웹의 확장성을 더 견고히 지켜줄 거라고 본 것 같은데 그러한 제약들이 모여 REST 아키텍처가 되는 것이다. REST 아키텍처 구현을 위한 제약 사항들을 요약하면 Uniform-Layered-Client-Cache-Stateless-Server 라고 표현 가능하다.

Client-Server

클라이언트-서버 구조 제약은 시스템 내에서 클라이언트와 서버의 역할을 분명하게 나누는데 있다. 이는 각각의 관심사를 분리시켜 놓는다. 즉, 클라이언트와 서버 사이에 주고 받을 정보에 대한 일관된 인터페이스를 유지시켜주면 클라이언트가 어떻게 구현되던, 서버가 어떻게 구현되던 상관이 없다. 전송 규칙만 지켜준다면 그게 java로 구현되었든 c로 구현되었든 서로 독립적인 형태로 개발 확장 될 수 있는 것이다.

Stateless

Stateless 제약 조건은 서버가 클라이언트의 상태를 관리할 필요가 없다는 의미다. 따라서 각 클라이언트는 서버와 상호작용하는 관련 상황 정보를 직접 관리해야 한다. 서버는 커뮤니케이션 상태를 관리할 필요가 없으므로 더 많은 클라이언트에게 서비스를 할 수 있다.

Cache

캐시라는 제약 조건에 의해 서버가 응답 데이터마다 캐시 여부를 선언한다. 캐싱 응답 데이터는 클라이언트가 느끼는 지연을 감소시키고 애플리케이션의 전쳊거인 이용성과 안정성을 향상 시키며, 서버의 부하를 감소시킨다.

Uniform Interface

Client는 Server에 Resource를 요청하기 위해서 Uniform Interface를 사용해야한다.
- 각 application마다 어떤 동작(action)을 위해 별도로 정의한 oepration을 사용하지 않는다.

Layered System

Code-On-Demand

# Resource에 대해 요청/제공 하기 위한 구조는 기본적으로 Client-Server 구조를 따라야한다.

# Resource에 대한 interaction은 stateless해야 한다.
- 브라우저나, 서버가 세션 상태등을 저장하고 있어서는 안되며, 필요하다면 이러한 상태 역시 resource로 표현되고 접근 가능해야 한다.

# Resource에 대한 요청 결과는 cache 할 수 있다.
- Client는 cacheable 이라고 표시된 요청 결과들을 나중을 위해 저장해 둘 수 있다.

RESTful

RESTful이란 용어는 REST와 함께 많이 거론되는데 REST의 설계 원칙을 모두 반영한 것을 RESTful 하다라고 표현한다. 이는 앞서 설명한 제약 조건들을 충족한 환경을 의미한다.

참고