1. REST(Representational State Transfer)
: REST는 굉장히 포괄적인 개념이기 때문에, 여러가지 의미로 해석되지만, 사실 그 자체로 아키텍처인 것은 아니다. 하지만 대부분의 개발자들은 REST를 URI와 HTTP를 이용하여 객체화된 자원에 접근하도록 하는 웹서비스 설계로 이해하고 있다.
REST를 이해하기 위해서는 먼저 *ROA와 *URI를 짚어봐야한다.
ROA(Resource Oriented Architecture)
- Resource 중심의 네트워크 설계이다. 모든 서비스는 특정 Resource에 대한 접근이며, URI는 이러한 Resouce 들에 대한 유일한 접근점이다.
URI(Uniform Resource Identifier)
- 자원을 식별하기 위한 고유의 값이다. 웹서비스 환경에서 가장 보편적으로 쓰이는 형태는 URL(Uniform Resource Locator)이다.
ROA는 다음과 같은 특징을 가지고 있다.
-
- Addressablilty
- 제공하는 모든 Resource는 URI로 표현이 가능하다.
ex. 박명하란 사원에 대한 URI > Http://host:port/api/company/employees/myungha-park
-
- Connectedness
- Resource들이 서로 연관되어 있을 경우, URI 또한 서로 연관지어서 표현한다.
ex. company/employees/myungha-park/name,
company/employees/myungha-park/phone
-
- Statelessness
- Client의 상태를 Server에서 관리하지 않으며 모든 요청은 1회성이다.으로 설계한다. 따라서 매 요청마다 필요한 정보를 계속해서 전달해야한다.
ex. 요청에 사용자 인증정보가 필요한 경우, 아래와 같이 할 수 있다. key = “접근이 허용된 사용자에게 발급되는 식별키”를 이용하여 API 설계시..
company/employees/myungha-park/name?key=”xxsasaqweqw”
company/employees/myungha-park/phone?key=”xxsasaqweqw”
-
- Homogeneous Interface
- HTTP에서 제공하는 Method를 이용하여, Resource의 모든 동작을 정의한다. 특정 Resource에 대한 접근은 오로지 하나의 URI로만 접근하며, 동작의 구분은 HTTP Method를 통해서 구분한다.
따라서 REST사상에 기반한 웹 서비스 아키텍처 설계란, 결국 웹 서비스에서 제공하는 모든 Resource들에 대한 접근점을 하나의 URI로 표현하고, 이를 HTTP란 수단을 통해서 전달하는 것을 의미한다. RESTFUL하다는 것은 REST사상(REST+ROA)의 기준/가이드를 충실히 준수하는 웹 아키텍처 설계라고 할 수 있겠다.
2. RESTFULL하게 설계하기
-
- Resource에 대한 URI는 동사보다는 명사를 이용하여 표현한다.
- URI는 Resource를 식별한다. 또한 Resource들간의 관계를 표현한다. 따라서 URI 작성시에는 동작에 해당하는 동사보다는 명사를 이용하여 표현하고, 동작은 HTTP Method를 사용하도록 한다.
URI로 표현되는 Resource 접근법
- Resource 조회
HTTP GET : http://host:port/api/company/employees- Resource 추가
HTTP POST : http://host:port/api/company/employees- Resource 수정
HTTP PUT(PATCH) : http://host:port/api/company/employees- Resource 삭제
HTTP DELETE : http://host:port/api/company/employees
-
- Client와 Server는 서로 독립적이며, 하나의 Server가 다양한 Client에 모두 대응할 수 있다.
- Session과 같은 Client의 상태정보를 Server부터 독립하여, 서로 독립적인 관계를 유지하도록 한다. 따라서 매 요청은 연속적이지 않고, 서로 독립적이다. 매 요청이 독립적이기 때문에, 인증/권한에 대한 정보는 매번 Server로 요청되어야 한다. 대부분의 Open API의 경우, 다양한 방식의 인증정보를 제공하며, 매 요청시 해당정보를 Request에 포함하도록 하고 있다.
-
- Client가 원하는 데이터를 제공한다.
- 각각의 Client들은 서로 다른 방식으로 Resource를 사용한다.(JSON, XML). 따라서 Servers 동일한 Resource에 대하여, Client에서 요청한 형태로 표현할 수 있어야한다. Server는 Request의 HTTP Header 를 통해서 Resource의 표현방식을 결정한다.
ex. HTTP Header : Accept : Application/Json, HTTP Header를 이용할 경우, 하나의 URI로 다양한 형태의 Resource에 요청을 처리할 수 있게된다.
-
- 반응형 웹 환경에서도 동일한 URI를 제공한다.
- Client의 Device type 차이로 인해 반환되어야하는 Resource의 형태가 달라진다 하더라도(ex. www.naver.com, m.naver.com), Resource 자체가 동일한 경우, 하나의 URI로 처리한다. HTTP Header의 User-agent를 이용할 경우, 하나의 URI를 이용해도 반응형 웹의 처리가 가능하다.
-
- 다양한 언어를 동일한 URI로 제공한다.
- HTTP Header의 Accept-Language를 이용하여 다국어지원을 받을 수 있어야한다.
결론적으로 RESTFUL API는 ROA에 입각하여, HTTP를 충실히 활용한 웹 API이다.
모든 Resource를 표현하는 데 있어, 접근은 하나의 URI로만 가능하도록 엄격히 관리되어야 하며, Client 입장에서는 하나의 URI만으로 모든 표현이 가능하도록 쉽게 파악되어야 한다.
RESTFUL하게 작성된 API는 쉽게 이용이 가능하며, 확장이 용이하다. 또한 각 모듈별로 나뉘어서 재사용이 가능하다. 결국 유지/보수가 용이하며, 전체적인 아키텍처 설계에 비용절감의 효과가 있을 수 있겠다.
Ref :
Resource Oriented Architecture
REST란 무엇인가
RESTFUL이란?
RESTFUL이란 무엇인가
RESTFUL API란 무엇인가
REST 아키텍처를 훌륭하게 적용하기 위한 몇가지 디자인 팁
RESTFUL API를 설계하기 위한 디자인 팁