CS 지식

REST API에 대해서

Tommy__Kim 2023. 5. 4. 08:35
해당 글에서는 REST API에 대해서 기본적인 원리와 함께 예시로 알아보려고 합니다.

REST

Representational State Transfer의 약자로 www와 같은 분산 하이퍼 시스템 아키텍처의 한 양식입니다.
주고받는 자원(Resource)에 이름을 규정하고 URI에 명시해 
HTTP메서드 (GET, POST, PUT, DELETE)를 통해 자원의 상태를 주고 받는 것을 말합니다.

API

Application Programming Interface의 약자로 애플리케이션에서 제공하는 인터페이스를 말합니다. 
API를 통해 서버 혹은 프로그램 사이를 연결할 수 있습니다. 

REST API

REST 아키텍처를 따르는 시스템 / 애플리케이션 인터페이스 라고 말할 수 있습니다. 

 

REST의 특징 

  • Stateless
    • 서버에 상태 정보를 따로 보관하거나 관리하지 않는다.
    • 서버는 클라이언트가 보낸 요청에 대해 세션이나 쿠키 정보를 별도 보관하지 않는다.
    • 모든 요청에 대해 개별적으로 처리한다.
    • 비즈니스 로직의 자유도가 높고 설계가 단순하다. 
  • Cache
    • Http Cahcing 기능을 사용할 수 있다.
    • 응답 요청 모두 캐싱이 가능한지 명시해야 한다.
    • 클라이언트에 캐시를 저장해두고 같은 요청에 대해서는 해당 데이터를 가져다 사용한다.
    • 서버의 트랜잭션 부하가 줄어 효율적이다.
    • 사용자 입장에서 성능이 개선된다.
  • Layered system
    • REST 서버는 네트워크 상의 여러 계층으로 구성 될 수 있다. 
    • 클라이언트는 서버와 연결되는 포인트만 알면된다.
  • Client - Server architecture
    • REST 서버는 API를 제공
    • 클라이언트는 사용자 정보를 관리하는 구조
  • Uniform Interface
    • Identification of resources
      • 리소스가 URI로 식별되면 된다.
    • Manipulation of resources through representations
      • HTTP 메서드를 통해 해당 자원의 상태를 주고 받는다.
    • Self-descriptive message
      • 메세지는 스스로를 설명할 수 있어야 한다.
      • 서버가 변해서 메세지가 변해도 클라이언트는 보고 해석할 수 있어야 한다.
    • Hypermedia as th engine of application state(HATEOAS)
      • Hyperlink를 통한 애플리케이션 상태의 전이가 일어나야 한다.
      • 링크 정보를 동적으로 변경할 수 있다. 

많은 개발자들이 대부분 잘 지키지만 Uniform Interface의 self-descriptive message, HATEOAS를 잘 지키지 못합니다. 

이 부분에 대해 조금 더 짚고 넘어가 보고자 합니다.

 

Self-Descriptive message

message는 스스로를 설명할 수 있어야 합니다.

예시와 함께 좀 더 알아보도록 하겠습니다. 

GET / HTTP/1.1

해당 메세지의 경우 목적지가 어떻게 되는지 알기 어렵습니다. 때문에 Self-Descriptive한 메세지가 아닙니다. 

해당 메세지를 Self-Descriptive하게 만들기 위해서는 목적지가 존재해야 합니다. 

GET / HTTP/1.1
Host: www.tommyworld.org

HTTP/1.1 200 OK
[
{"op": "remove", "path":"/a/b/c"}
]

해당 메세지의 경우 어떠한 문법에 의해 작성된 것인지 알 수 없습니다. 

해당 메세지를 Self-Descriptive하게 만들기 위해서는 Content-Type이 존재해야 합니다.

HTTP/1.1 200 OK
Content-Type: application/json-patch+json
[
{"op": "remove", "path":"/biscuits"}
]

 

HATEOAS(Hypermedia as the engine of application state)

애플리케이션의 상태는 Hyperlink를 이용해 전이 되어야 합니다. 

HTTP 명세 

GET / HTTP/1.1
Content-Type: text/html

<html>
...
	<body>
		<a href = "/next"> next </a>
	</body>
</html>

Http 명세의 경우  <a> 태그를 통해 전이가 가능합니다. 

 

JSON 명세 

GET / HTTP/1.1
Content-Type: application/json
Link : </post/1>; rel="previous",
			 </post/2>; rel="next"
			
{
	"title" : "hello",
	"content" : "..."
}

Json 명세의 경우 Link를 통해 전이가 가능합니다. 또한 데이터 자체에 링크를 정의 할 수 있습니다.

HTTP/1.1 201 Created
Location: http://localhost:8080/enrollments
Content-Type: application/hal+json;charset=UTF-8
Content-Length: 274

{
  "messageBody" : "수강 신청 완료",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/enrollments"
    },
    "cancel-lectures" : {
      "href" : "http://localhost:8080/enrollments?enrollmentId={enrollmentId}",
      "templated" : true
    }
  }
}

출처 

그런 REST API로 괜찮은가

'CS 지식' 카테고리의 다른 글

PubSub 구조에 대해서  (0) 2023.05.07
강타입 언어에 대해서  (0) 2023.05.05
Polling / Long Polling / Server Sent Event / Web Socket  (0) 2023.05.02
OSI 7계층 TCP / IP 4계층  (0) 2023.04.21