[REST API] REST API(RESTful API)란?

studying  · 3 mins read

REST란?

  • Representational State Transfer의 약자
  • ROA(Resource Oriented Architecture)를 따르는 월드 와이드 웹(www)과 같은 분산 하이퍼 미디어 시스템을 위한 소프트웨어 아키텍처(제약조건의 집합)의 한 형식
  • 컴퓨터 시스템간에 상호운영성을 제공하는 방법 중 하나

REST 아키텍쳐를 따르려면 다음 아래의 스타일을 만족시켜야 한다.

  • REST를 구성하는 스타일

1. client-server

REST client가 REST server로부터의 resource를 요청한다.

client와 server에서의 역할들이 확실히 구분되어 의존성이 줄어든다.

2. stateless

3. cache

4. uniform interface(another architecture)

5. layered system

6. code-on-demand (optional)

코드를 client로 보내서 실행할 수 있어야 함(javascript 파일을 의미)

  • Uniform Interface의 제약조건

1. resource가 uri로 식별되어야 한다.

2. resource를 새로 만들거나 기존의 resource를 삭제하는 등의 resource 조작은 representations를 통해서 이뤄져야 함(http message에 표현을 담아서 전송)

3. self-descriptive messages

4. hypermedia as the engine of application state(HATEOAS): 애플리케이션의 상태는 Hyperlink를 이용하여 전이 되어야 한다(링크를 따라가면서 상태가 전이).

위의 제약조건들을 따르게 되면 server와 client가 각각 독립적으로 진화할 수 있어 서버의 기능이 변경되어도 client를 업데이트할 필요가 없다.

특히 웹에서는 REST가 잘 지켜지고 있다.

(HTTP 1.0 -> HTTP 2.0으로 변경되거나 HTML 버전이 5.0으로 변경되어도 웹은 잘 동작)

REST의 기본 구성 요소

크게 3가지로 구성

1. resource(자원)

모든 자원은 URI로 식별되고 server에 존재한다.

client에서는 URI로 식별된 resource에 대한 조작을 server에게 요청한다.

2. verb(행위)

uri는 리소스를 식별하는 이름일 뿐, 이 리소스를 조작(Create, Read, Update, Delete)할 수 있어야 하고 이러한 조작은 4가지 HTTP method(POST, GET, PUT or PATCH, DELETE)를 통해 이루어진다.

(PUT: 전체 내용을 변경, PATCH: 부분을 변경)

3. representation(표현)

client에서 리소스에 대한 조작을 server로부터 요청하고 요청에 대한 응답을 받을 때 JSON, XML 등의 형태(representation)로 데이터(message)를 주고 받는다.

REST API란?

  • REST 아키텍쳐 스타일을 따르는 API를 구현한 것

하지만 오늘날 REST API로 불리는 것들이 거의 대부분 REST 아키텍쳐를 따르지 않고 있다.

특히 Self-descriptive, HATEOAS 조건을 지키지 않고 있다.

REST API 설계 예시

KakaoTalk_20210604_051439128

REST API 설계 규칙

- URI

  • 리소스는 동사보다는 명사, 대문자보다는 소문자를 사용
  • 리소스의 document 이름으로는 단수 명사를, collection과 store의 이름으로는 복수 명사 사용
  • HTTP method가 URI에 들어가면 안 됨
  • URI에서 변하는 부분은(:id) 하나의 특정 리소스를 나타내는 고유값이어야 함
  • URI의 마지막 문자로 ‘/’를 포함하지 않음
  • ‘_’은 사용하지 않고 긴 URI의 경우에는 ‘-’를 사용
  • 파일확장자는 포함하지 않고 Accept header를 사용

    ex)

    http://www.example.com/developers/front/19/photo.jpg (x)
    

    대신

      GET /developers/front/19/photo HTTP/1.1
      Host: www.example.com
      Accept: image/jpg
    
  • 리소스간에 연관 관계가 있는 경우에는 /리소스명/리소스ID/관계 있는 다른 리소스 명

    ex)

    {
      "posts": [
        {
          "id": 1,
          "title": "React",
          "content": "React is ..."
        },
        {
          "id": 2,
          "title": "Vue",
          "content": "Vue is ..."
        }
      ],
      "comments": [
        {
          "id": 1,
          "content": "good post!",
          "postId": 1
        },
        {
          "id": 2,
          "content": "bad post!",
          "postId": 1
        }
      ]
    }
    

    comments 2번의 element는 posts 1번 element에 종속되어 있다.

    부모가 되는 posts를 앞에 적고 부모의 element id값을 적은 뒤에 자식이 되는 리소스의 이름을 적어서 URI를 표현한다.

    URI: posts/1/comments

    RESTful API란?

    • REST의 기본 원칙을 성실히 지킨 서비스 디자인을 “RESTful”하다고 표현한다.
    • REST 아키텍쳐 스타일을 성실히 따르는 API로서 REST를 REST답게 쓰기 위한 방법으로, 공식적으로 발표된 것은 아니다.

    References