안녕하세요.
오늘은 REST API
에 대해서 포스팅 합니다.
REST
아키텍쳐를 웹 아키텍쳐중 하나인 HTTP 프로토콜과 동일 선상에서 해석하는 자료가 많았습니다.
재밌는 사실은 REST
창시자인 로이 필딩은 HTTP에 대해 전혀 언급하지 않았으며 순수하게 REST
시스템을 구성하는 방법에 대해서만 소개 하였습니다.
이번 포스팅의 목적은 웹과 무관한 REST
시스템을 본질을 이해하고, HTTP 프로토콜을 이용한여 REST
시스템을 설계하는 방법에 대해 이해하는 것 입니다.
REST
REST
는 간단하게 말하자면, 존재하는 자원의 식별하고 제어하는 방법론 입니다.
REST
에서 정의 하는 자원
에 대한 정의를 알아보고 자원의 제어
와 자원의 표현
은 무엇인지 알아봅시다.
자원 (Resource)
자원
이란 일이 처리되는 비용을 의미합니다.
REST
는 소프트웨어 아키텍쳐 이므로 컴퓨터의 자원을 의미합니다.
컴퓨터의 자원은 CPU가 수행하는 명령, 하드디스크에 저장되는 파일들, 메모리에 저장되는 데이터들을 의미합니다.
REST
는 컴퓨터 자원을 사용하여 처리하는 한 단위의 작업을 식별할 수 있어야 합니다.
REST
는 자원
을 식별 할 수 있는 식별자가 필요합니다. 예를든다면 TIMESTAMP 나 UUID 같은 중복되지 않는 정보들을 식별자로 사용할 수 있습니다.
자원의 제어 (Resource Methods)
자원의 제어
는 흔히 CRUD 라 부르는 생성, 읽기, 변경, 삭제 행위를 자원
에 수행하는것을 의미합니다.
이때 제어 방법은 일관적인 인터페이스로 구성되어야 합니다. 이는 소프트웨어의 API 처리 법칙을 정하면 일관적이게 규칙을 따라야 한다는 것입니다. 예를들어 웹 기반(HTTP)의 시스템에서 자원의 변경을 POST 메소드로 한다면(PUT이 더 어울릴지라도) 자원의 변경은 POST 메소드로 일관적이게 처리해야 한다는 점입니다.
자원의 표현 (Resource Representation)
자원의 표현
은 조회한 순간의 자원 상태를 의미합니다. REST
시스템의 자원의 표현
은 자기 서술적인(self-descriptive) 메시지와 HATEOAS(hypermedia as the engine of application state)로 구성됩니다. 이는 데이터를 설명하는 메타 데이터, 다음 자원으로의 이동을 안내하는 하이퍼 텍스트 등이 포함 되는 데이터를 의미합니다. REST
시스템은 클라이언트가 자원의 표현
만 보더라도 이해되는 것을 목표로 합니다.
웹 기반(HTTP)의 REST
많은 자료들이 설명하고 있는 REST
시스템은 HTTP 기반으로 구성된 REST
시스템 입니다.
HTTP 기술을 통해 REST
시스템을 어떻게 구현하는지 알아봅시다.
자원의 식별
HTTP는 REST
시스템이 요구하는 자원의 식별
을 URI의 정의로 처리합니다.
자원
은 명사로 커뮤니케이션을 하기 때문에 많은 웹 기반 REST
시스템 선구자들은 URI을 명사구로 표현함으로써 자원
을 나타내려고 노력했습니다.
다음과 같은 URI 표기법을 따릅니다.
- URI의 세그먼트는 동사가 아닌 명사 사용.
- users/mommoo/name (O)
- users/mommoo/getName (X)
- 만약 컨트롤 자원이라면 예외적으로 동사구 허용.
- users/mommoo/name/duplicate (중복 이름 검사 API)
- 자원의 관계가 표시되도록 작성.
- users/mommoo/devices/android-phone
위 예시는 유저 목록중 Mommoo를 의미하고, Mommoo가 가지고 있는 디바이스들을 의미하며, 디바이스들중 안드로이드 폰을 의미합니다.
자원의 제어
HTTP는 자원의 제어
를 HTTP Method로 표현합니다. 대표적으로 POST
, GET
, PUT
, DELETE
4개의 Method를 사용 합니다.
자원
을 URI로 식별하고 URI에 행위를 붙여줌으로써 자원
을 제어합니다.
아래는 자원 제어
의 예시입니다.
- GET users/mommoo/name (이름을 조회합니다.)
- POST users/mommoo/name (이름을 등록합니다.)
- PUT users/mommoo/name (이름을 수정합니다.)
- DELETE users/mommoo/name (이름을 삭제합니다.)
자원의 표현
HTTP는 자원의 표현을 HTTP 응답 메시지로 구현합니다.
REST
자원의 표현의 특징인 self-descriptive과 HATEOS를 만족하기 위해 ContentType 또는 커스텀 HTTP 헤더에 메타데이터 명시, 데이터에 링크를 포함하는 등의 기법을 사용합니다.
응답 예시는 https://slides.com/eungjun/rest#/79/0/1 참고해주세요.
REST-FUL
REST
시스템의 구성 요소는 다음과 같이 6개로 구성됩니다.
- Client-Server
- Stateless
- Cacheable
- Unitform-Interface
- Layered-System
- Code on demand (optional)
위 6가지 항목을 만족하는 HTTP REST
시스템을 구현한다고 가정할때, Unitform-Interface 항목을 제외한 나머지 항목들은 자연스럽게 구현이 되거나 조금만 신경을 쓴다면 어렵지 않게 구현할 수 있습니다.
왜 Unitform-Interface 항목은 제외가 됬을까요? Unitform-Interface를 제공하기 위해 수행해야할 특징 중 self-descriptive과 HATEOS는 HTTP 시스템에서 자연스럽게 처리 되지 않기 때문입니다.
사실 self-descriptive과 HATEOS 속성은 데이터가 독립적으로 자생하기 위해 필요한 요소들이라 볼 수 있습니다. 그렇다보니 HTTP 서버 스펙을 구현할 때 데이터 독립적인 요소들까지 챙기지 않는 경우도 많습니다. 하지만 REST
의 철학을 따르므로 REST
시스템이라 부르고 있습니다.
REST
의 구성요소를 완벽하게 지키지 않은 REST
시스템을 구분하기 위해서인지 REST
의 구성요소 (특히 Unitform-Interface)를 완벽하게 지킨 REST
시스템을 REST-FUL
시스템이라 부르고 있습니다.
로이 필딩은REST
시스템의 규칙을 하나라도 제공하지 않는다면REST
시스템이 아니라고 주장합니다.
정리하자면 REST
시스템으로 소개 되고 있는 시스템은 Unitfor-Interface의 self-descriptive 와 HATEOS가 지켜지지 않는 경우도 많으며, 나머지 항목까지도 완벽히 구현한 시스템을 REST-FUL
하다고 표현 합니다.
REST-API
API는 컴퓨터의 자원 제어
방법의 집합입니다.
그렇다면 REST-API
는 REST
시스템의 자원 제어 방법의 집합으로 정의할 수 있습니다.
한단계 더나아가 REST-FUL API
는 REST
의 구성요소를 완벽히 따른 시스템의 자원 제어 방법의 집합이라 정의 할 수 있겠습니다.
오늘 포스팅은 여기까지 입니다.
읽어주셔서 감사합니다.
참고문헌
'네트워크' 카테고리의 다른 글
[네트워크] OSI 7계층 (0) | 2021.07.26 |
---|---|
[네트워크] HTTPS 프로토콜 (1) | 2021.07.16 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.
Uploaded by Notion2Tistory v1.1.0