Rest Api

ZeroJun·2022년 6월 10일
0

Computer Science

목록 보기
1/9

REST API에서 REST는 “Representational State Transfer”의 약자로, 로이 필딩 (Roy Fielding)의 박사학위 논문에서 웹(http)의 장점을 최대한 활용할 수 있는 아키텍처로써 처음 소개되었다. REST API는 웹에서 사용되는 데이터나 자원(Resource)을 HTTP URI로 표현하고, HTTP 프로토콜을 통해 요청과 응답을 정의하는 방식을 말한다.

📌 Rest Api 성숙도

![](https://velog.velcdn.com/images/zer![](https://velog.velcdn.com/images/zer0jun/post/59711678-7041-46f0-a946-cb1e55266c7c/image.png)
0jun/post/ec359926-143a-44db-8dca-780ce680df32/image.png)

🤔 Level 0

이 모델의 시작점은 웹 매커니즘은 전혀 사용하지 않고 HTTP를 단순히 원격 통신을 위한 전송 시스템으로 사용하는 것이다. 하나의 End-point를 사용해서 HTTP Method도 반드시 POST가 된다. 그래서 서로 다른 매개변수를 통해서만 여러 동작을 하게 된다.

다음은 유저 정보를 요청하는 0단계 REST API다.

// request
POST /api/user    // 하나의 EndPoint
{
  "function": "getUser",
  "arguments" [
    "1"
  ]
}

// respone
HTTP/1.1 200 OK
{
  "result" {
    "id": "1"
    "name": "honey",
  }
}

// CRUD, 하나의 endpoint
CREATE : POST /api/user
READ :   POST /api/user
UPDATE : POST /api/user
DELETE : POST /api/user

이렇게 단순히 HTTP 프로토콜을 사용하는 것이 REST API의 출발점이다.

🤔 Level 1

Level 1은 개별 Resource와의 통신을 준수해야 한다. 또한 요청하는 리소스가 무엇인지에 따라 각기 다른 엔드포인트로 구분하여 사용한다. 또한 응답 시 사용한 리소스에 대한 정보와 함께 리소스 사용에 대한 성공/실패 여부를 반환해야 한다.

다음은 users정보로 id을 요청하여 있는 경우와 없는 경우를 표현하고, 없는 경우 새롭게 생성하는 것을 표현한 Level1 REST API다.

// request
GET /api/user/1

// respone
HTTP/1.1 200 OK
{
  "result" {
    "id": "1"
    "name": "지영준",
  }
}


// request
GET /api/user /2

// respone
HTTP/1.1 409 Conflict
{
  "result" {
    "error": "요청한 ID가 존재하지 않습니다."
  }
}

// request
POST /api/users/create
{
  "id": 2
  "name": "홍길동"
}

// respone
HTTP/1.1 200 OK


// 상황에 따라 다른 endpoint
CREATE : POST /api/users/create
READ :   GET /api/users/1
UPDATE : POST /api/users/update
DELETE : POST /api/users/remove/1

🤔 Level 2

Level2에서는 CRUD에 맞게 적절한 HTTP메서드를 사용하는 것에 중점을 둔다.
POST 요청에 대한 응답이 어떻게 반환되는지가 중요하다. 이 경우 응답은 새롭게 생성된 리소스를 보내주기 때문에, 응답 코드는 201 Created 로 명확하게 작성해야 하며, 관련 리소스를 클라이언트가 Location 헤더에 작성된 URI를 통해 확인할 수 있도록 하면 완벽하게 REST 성숙도 모델의 2단계를 충족한 것이라고 볼 수 있다.

아래는 Level 2 Rest Api다.

POST /api/users
{
  "name": "honey"
}

HTTP/1.1 201 Created
Content-Type: application/json
Location: result/id/1
{
  "result" {
    "id": "1",
    "name": "honey"
  }
}
CREATE : POST /api/users
READ :   GET /api/users/1
UPDATE : PUT /api/users/1
DELETE : DELETE /api/users/1

GET, HEAD, PUT, DELETE 메서드는 멱등성을 가지며 POST, Fetch는 그렇지 않다.

Put은 요청한 내용을 교체하는 것이라 계속 요청해도 항상 같은 결과지만 수정의 용도로 사용하는 Fetch의 경우는 수정하는 내용이 일정하면 Put과 결과가 같지만, 가령 나이 데이터의 값을 1씩 증가시키는 요청을 보낸다면 수행할 때마다 데이터가 달라져서 멱등성을 가지지 않는 것이다.

🤔 Level 3

마지막 단계는 HATEOAS(Hypertext As The Engine Of Application State)라는 약어로 표현되는 하이퍼미디어 컨트롤을 적용합니다. 3단계의 요청은 2단계와 동일하지만, 응답에는 리소스의 URI를 포함한 링크 요소를 삽입하여 작성해야 합니다.즉, 어떤 request의 다음 request에 필요한 endpoint까지 제공한다. 클라이언트에게 다음에 어떤 동작이 가능한지 힌트를 제공할 수 있다.

GET https://api/users/1

HTTP/1.1 200 OK
Content-Type: application/json
{
 "result" {
    "id": "1",
    "name": "yoonyoung",
    "nextActions": {
       "/api/users/{userId}/roles",
     }
  }
}

📌 Open API

정부에서 제공하는 공공데이터가 있다. 공공데이터에 쉽게 접근할 수 있도록 정부는 Open API의 형태로 공공데이터를 제공하고 있다. 공공데이터 포털에 접속해 원하는 키워드를 검색하면, 해당 키워드와 관련된 API를 확인할 수 있다.

이 API에는 "Open"이라는 키워드가 붙어 있다. 글자 그대로 누구에게나 열려있는 API다. 그러나 "무제한으로 이용할 수 있다"라는 의미는 아니다. API마다 정해진 이용 수칙이 있고, 그 이용 수칙에 따라 제한사항(가격, 정보의 제한 등)이 있을 수 있다.

https://openweathermap.org/api : 날씨 API
프리플랜에서 분당 60번, 달마다 100번 호출이 가능하다. Json형태로 응답한다.

https://developers.naver.com/docs/common/openapiguide/apilist.md : 네이버 open API

API Key

API key는 단어 그대로 api 서버를 여는 key다. 서버를 운용하는 것도 결국 비용이므로 익명의 클라이언트에게 아무 조건 없이 데이터를 제공할 의무가 없다. (api key가 없어도 되는 경우도 있긴하다.)

💡API key가 제공하는 것

  • 프로젝트 식별 : API를 호출하는 애플리케이션이나 프로젝트를 식별한다.
  • 프로젝트 승인 : 호출하는 애플리케이션에 API를 호출하는 액세스 권한이 부여되었고 프로젝트에서 API가 사용 설정되었는지 여부를 확인한다.

호출하는 애플리케이션에선 데이터를 요청할 때 API key를 같이 전달해야 원하는 응답을 받을 수 있다.

0개의 댓글