[HTTP/네트워크] REST API, Open API와 API Key

jungmin Lee·2023년 9월 12일
0

REST API

REST는 "Representational State Transfer"의 줄임말이며 REST API는 웹에서 사용되는 데이터나 자원(Resource)을 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식이다.

=> REST는 로이 필딩(Roy Fielding) 박사학위 논문에서 웹(http)의 장점을 최대한 활용할 수 있는 아키텍처로써 처음 소개되었다. HTTP 프로토콜을 기반으로 요청과 응답에 따라 리소스를 주고받기 위해서는 알아보기 쉽고 잘 작성된 API가 중요하므로 모두가 잘 알아볼 수 있도록 작성하는 것이 중요하다

REST API 적용하기 위한 4단계 모델

REST API를 작성할 때는 몇 가지 지켜야 할 규칙들이 있으며 로이 필딩이 논문에서 제시한 REST 방법론을 더욱 실용적으로 적용하기 위해 레오나르도 리차드슨은 4단계 모델을 만들었다.

Richardson 성숙도 모델 (RMM)
3단계 - HATEOAS 원칙 준수
2단계 - HTTP 메소드 원칙 준수
1단계 - 개별 리소스와의 통신 준수
0단계 - HTTP 사용

REST 성숙도 모델 0단계

단순히 HTTP프로토콜을 사용하는 것이며, 0단계는 REST API라고 할 수는 없다.

[예약 가능한 시간 확인]

  • 요청
POST /appointment HTTP/1.1 
[헤더 생략]

{
  "date: "2023-02-10",
  "Hair dresser" : "min"
}	
  • 응답
HTTP/1.1 200 OK
[헤더 생략]

{
   "slots": [
      { "Hair dresser" : "min", "start" : "09:00", "end" : "12:00"},
      { "Hair dresser" : "min", "start" : "14:00", "end" : "16:00"},
    ]
}

[특정 시간에 예약]

  • 요청
POST /appointment HTTP/1.1 
[헤더 생략]

{
  "Hair dresser" : "min"
  "start" : "14:00",
  "end" : "16:00",
  "client" : "jin"
}
  • 응답
HTTP/ 1.1 200 OK
[헤더 생략]

=> HTTP 프로토콜을 사용하고 있는 것을 확인할 수 있다


REST 성숙도 모델 1단계

REST 성숙도 모델 1단계에서는 개별 리소스(Resource)와의 통신을 준수해야 한다.
REST API는 웹에서 사용되는 모든 데이터나 자원을 HTTP URI로 표현한다고 말할 수 있는데 여기에서 모든 자원은 개별 리소스에 맞는 엔드포인트(Endpoint)를 사용해야하며 요청하고 받는 자원에 대한 정보를 응답으로 전달해야 한다. 어떤 리소스를 변화시키고 어떤 응답이 제공되는지에 따라 다른 엔드포인트를 사용하므로 적절한 엔드포인트를 작성하는 것이 중요하며 명사 형태의 단어로 작성하는 것이 바람직하다.

[예약 가능한 시간 확인]

  • 요청
POST /Hari dresser/min HTTP/1.1 
[헤더 생략]

{
  "date: "2023-02-10",
}
  • 응답
HTTP/1.1 200 OK
[헤더 생략]

{
   "slots": [
      { "id" : 123, "Hair dresser" : "min", "start" : "09:00", "end" : "12:00"},
      { "id" : 124, "Hair dresser" : "min", "start" : "14:00", "end" : "16:00"},
    ]
}

[특정 시간에 예약]

  • 요청
POST /slots/124 HTTP/1.1 
[헤더 생략]

{
  "client" : "jin"
}
  • 응답
HTTP/ 1.1 200 OK
[헤더 생략]

{
  "appointment": [
    "slot" :  {"id" : 124,"Hair dresser" : "min","start" : "14:00", "end" : "16:00"},
     "client" : "jin"
    ]
}

=> 예약 가능한 시간 확인의 요청 응답으로 받게 되는 자원은 Hair dresser "min"의 예약 가능한 시간대이므로 Hari dresser/min을 엔드포인트로 사용하였으며, 특정 시간으로 예약을 하면 slots라는 리소스의 124라는 id를 가진 리소스로 변경된다. 특정 시간에 예약에서는 /slots/124라는 변경되는 리소스를 엔드포인트로 사용하게 되므로 요청하는 리소스에 따라 다른 엔드포인트로 구분하여 사용한다.

[예약 가능한 시간 확인]

  • 요청
POST /Hari dresser/min HTTP/1.1 
[헤더 생략]

{
  "date: "2023-02-10",
}
  • 응답
HTTP/1.1 200 OK
[헤더 생략]

{
   "slots": [
      { "id" : 123, "Hair dresser" : "min", "start" : "09:00", "end" : "12:00"},
      { "id" : 124, "Hair dresser" : "min", "start" : "14:00", "end" : "16:00"},
    ]
}

[특정 시간에 예약]

  • 요청
POST /slots/124 HTTP/1.1 
[헤더 생략]

{
  "client" : "jin"
}
  • 응답
HTTP/ 1.1 409 Conflict
[헤더 생략]

{
  "appointmentFailure": [
    "slot" :  {"id" : 124,"Hair dresser" : "min","start" : "14:00", "end" : "16:00"},
     "client" : "jin"
      "reason" : "해당 시간이 예약이 마감되었습니다"
    ]
}

=> 요청에 따른 응답으로 리소스를 전달할 때에도 사용한 리소스에 대한 정보, 성공/실패 여부를 반환해야 한다.


REST 성숙도 모델 2단계

REST 성숙도 모델 2단계에서는 CRUD(Create, Read, Update, Delete)에 맞게 적절한 HTTP 메서드를 사용하는 것을 말한다. 조회하기 위해서는 GET 메서드를 사용하여 요청을 보내며 GET 메서드는 body를 가지지 않기 때문에 query parameter를 사용하여 필요한 리소스를 전달한다.
생셩하기 위해서는 POST 메서드를 사용하여 요청을 보내야 하며, POST 요청에 대한 응답이 새롭게 생성된 리소스를 보내주므로 응답 코드는 명확하게 작성되어야 한다. 해당 관련 리소스를 클라이언트가 Location 헤더에 작성된 URI를 통해 확인할 수 있으면 2단계를 충족했다고 볼 수 있다.

HTTP 메서드를 사용할 때 유의해야 할 규칙
리소스(URIs) 작성시 중복되는 의미를 가진 단어를 사용하지 않으며 spinal-Case를 보통 사용한다.

  • GET (조회 / READ) - 서버의 데이터를 변화시키지 않는 요청에 사용 (body x)
  • HEAD - status line, header만 조회
  • POST (생성 / CREATE) - 요청마다 새로운 리소스를 생성 (body o)
  • PUT (갱신 / UPDATE) - 요청마다 같은 리소스를 반환 (멱등(idempotent)), 교체의 용도, 완전히 바꿈 (body o)
  • PATCH (갱신 / UPDATE) - 수정의 용도로 사용, 일부분만 바꿈 (body o)
  • DELETE(삭제) - 해당 자원을 지움 (body x)

[예약 가능한 시간 확인]

  • 요청
GET /Hari dresser/min/slots?date=2023-02-10 HTTP/1.1 
[헤더 생략]
  • 응답
HTTP/1.1 200 OK
[헤더 생략]

{
   "slots": [
      { "id" : 123, "Hair dresser" : "min", "start" : "09:00", "end" : "12:00"},
      { "id" : 124, "Hair dresser" : "min", "start" : "14:00", "end" : "16:00"},
    ]
}

[특정 시간에 예약]

  • 요청
POST /slots/124 HTTP/1.1 
[헤더 생략]

{
  "client" : "jin"
}
  • 응답
HTTP/ 1.1 201 Created
Location: slots/124/appointment
[헤더 생략]

{
  "appointment": [
    "slot" :  {"id" : 124,"Hair dresser" : "min","start" : "14:00", "end" : "16:00"},
     "client" : "jin"
    ]
}

=> 예약 시간을 조회하기 위해서 GET메서드를 사용하였으며, 예약 시간을 생성하기 위해서 POST 메서드를 사용하여 요청을 보냈다. 요청에 대한 응답으로 201 Created라는 응답 코드가 작성되었으며 관련 리소스를 클라이언트가 Location 헤더에 작성된 URI를 통해 확인할 수 있다.

✨ 대부분 2단계까지 적용한 API를 잘 작성되었다고 한다. 로이 필딩은 3단계까지 만족하지 못한 API는 HTTP API라고 불러야 한다고 말하지만 실제로 3단계까지 적용된 경우는 드물다고 한다. 그러므로 무조건적으로 3단계까지 모두 적용해야하는 것은 아니라고 한다.


REST 성숙도 모델 3단계

REST 성숙도 모델 3단계는 마지막 단계이며 HATEOAS(Hypermedia As The Engine Of Application State)로 표현되는 하이퍼미디어 컨트롤을 적용한다. 2단계와 동일하지만, 응답에는 리소스의 URI를 포함한 링크 요소를 삽입하여 작성해야 한다. 링크 요소는 응답을 받은 다음에 할 수 있는 다양한 액션들을 위해 많은 하이퍼미디어 컨트롤을 포함하고 있다.

[예약 가능한 시간 확인]

  • 요청
GET /Hari dresser/min/slots?date=2023-02-10 HTTP/1.1 
[헤더 생략]
  • 응답
HTTP/1.1 200 OK
[헤더 생략]

{
   "slots": [
      { "id" : 123, "Hair dresser" : "min", "start" : "09:00", "end" : "12:00"},
      { "id" : 124, "Hair dresser" : "min", "start" : "14:00", "end" : "16:00"},
    ],
    "links" : {
        "appointment" : {
           "href" : "http://localhost:8080/slots/124",
           "method" : "POST"
        }
    }
}

[특정 시간에 예약]

  • 요청
POST /slots/124 HTTP/1.1 
[헤더 생략]

{
  "client" : "jin"
}
  • 응답
HTTP/ 1.1 201 Created
Location: slots/124/appointment
[헤더 생략]

{
  "appointment": [
    "slot" :  {"id" : 124,"Hair dresser" : "min","start" : "14:00", "end" : "16:00"},
     "client" : "jin"
    ],
        "links" : {
            "self" : {
                 "href" : "http://localhost:8080/slots/124",
                 "method" : "GET"
            },
             "cancel" : {
                 "href" : "http://localhost:8080/slots/124/cancel",
                 "method" : "DELETE"
        }
    }
}

=> 예약이 가능한 시간을 확인한 후 예약을 할 수 있는 링크를 삽입하거나, 특정 시간에 예약을 완료하고 예약을 다시 확인할 수 있는 링크를 적상하여 넣을 수 있으며 이 부분이 3단계의 핵심 포인트라고 할 수 있다

Endpoint

  • root-endpoint(혹은 root-URL)
    API로 요청을 서버와 통신할 때, 서버가 요청을 수락하는 시작점을 뜻한다.
    Github API의 root-endpoint는 https://api.github.com이다. 일반적으로 root-endpoint는 도메인 주소의 루트(/)를 가리킨다.

path
path(또는 url-path)는 API를 통해 서버와 통신할 때, 서버와 통신할 수 있는 key 역할을 하며, 서버에 정의된 문자열에 따라 path가 달라진다. https://api.github.com/user에서는 'user'가 path이다.


참고자료
구글 REST API 작성 가이드라인
https://cloud.google.com/apis/design/resources?hl=ko
마이크로소프트 REST API 작성 가이드라인
https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md

Open API & API Key

정부에서 제공하는 공공데이터가 있으며 공공데이터에 쉽게 접근할 수 있도록 정부는 Open API의 형태로 제공하고 있다. 공공데이터 포털에 접속하여 원하는 키워드를 검색해보면 키워드와 관련된 API를 확인할 수 있다.
Open이라는 단어처럼 누구에게나 열려있는 API라고 볼 수 있지만 무제한으로 이용할 수 있다는 의미는 아니며 이용 수칙이나 제한사항이 있을 수 있으니 확인해야 한다.
API를 이용하기 위해서 API Key가 필요하며 서버의 문을 여는 열쇠라고 할 수 있다. API Key가 필요한 경우에는 로그인한 이용자에게 자원에 접근할 수 있는 권한을 API Key의 형태로 제공하고, 데이터를 요청할 때 API Key를 같이 전달해야 원하는 응답을 받을 수 있다.

profile
Leejungmin

0개의 댓글