2 분 소요

요즘 많은 곳에서 REST API 작성을 했다. ` REST API를 따른다.`

이런 글 들을 많이 보고 있었고 나 역시도 실전 프로젝트 당시에는 잘 모르고 사용했던 것 같다.

이번 글에서 알아보도록 하려고 한다.

REST

Representational State Transfer의 약자로 월드 와이드 웹 (www)과 같은 분산 하이퍼 시스템 아키텍처의 한 형식.

주고받는 자원(Resource)에 이름을 규정하고 URI에 명시해 HTTP메서드 (GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고받는 것.

API

Application Programming Interface 의 약자로 애플리케이션에서 제공하는 인터페이스를 의미한다.

REST API

REST 아키텍처를 따르는 시스템 / 애플리케이션 인터페이스.

REST의 URI 설계 규칙

  1. URI의 마지막에는 ‘/’를 포함하지 않는다.
  2. 언더바(_)를 사용하지 않는다. 대신에 하이픈(-)을 사용한다.
    • 하이픈의 경우 리소스의 이름이 길어지면 사용
  3. URI에는 행위(동사)가 아닌 결과(명사)를 포함한다.
    • 행위는 HTTP 메서드로 표현할 수 있어야 한다.
  4. URI에는 소문자로 작성한다.
  5. 파일의 확장자는 URI에 포함하지 않는다.
    • HTTP에서 제공하는 Accept - Header를 사용하자.

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 messages
      • 메세지는 스스로를 설명해야 한다.
    • hypermedia as the engine of application state(HATEOAS)
      • Hyperlink를 통한 애플리케이션 상태의 전의

위의 특징들 중 Uniform Interface의 self-descriptive messages, HATEOAS 이 부분을 많은 사람들이 잘 지키지 않는 부분이다. 이 특징들에 대해 알아보도록 하자.

Self-descriptive message

메세지는 스스로를 설명해야한다.

[요청 메세지 1]

GET / HTTP/1.1

요청 메세지 1의 경우 목적지가 없기 때문에 self-descriptive 하지 못하다.

[요청 메세지 1의 self-descriptive 한 메세지]

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

[요청 메세지 2]

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

요청메세지 2의 경우 어떠한 문법으로 작성된 것인지 해석을 못한다.

[요청 메세지 2의 self-descriptive 한 메세지]

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

json-patch+json 의 명세를 보고 어떠한 내용인지 알 수 있다.

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를 통해 전이가 가능하다.

Self descriptive message, HATEOAS 를 만족하지 않아도 관계는 없다.

하지만 REST를 정의한 로이필딩에 의하면 REST라고 할려면 모든 규칙을 만족 해야 한다고 한다.


정보 출처 : 그런 REST API로 괜찮은가?

댓글남기기