웹에서 사용되는 데이터나 자원(Resource)을 HTTP URI로 표현하고, HTTP프로토콜을 통해 요청과 응답을 정의하는 방식
REST API를 디자인 하는 방법 (Richardson의 성숙도 모델)
단계 | 내용 |
---|---|
0단계 | HTTP 사용 |
1단계 | 개발 리소스와의 통신 준수 |
2단계 | HTTP 메소드 원칙 준수 |
3단계 | HATEOAS 원칙 준수 |
실제로 엄밀하게 3단계까지 지키기 어렵기 때문에 2단계까지만 적용해도 "좋은 API디자인" 이라고 하고 이런 경우를 HTTP API라고 부른다.
단순히 HTTP 프로토콜을 사용하기만 해도 된다. 물론 이 경우, 해당 API를 REST API라고 할 수 없으며, 0 단계는 REST API를 작성하기 위한 기본 단계이다.
(허준이라는 이름의 의사의 예약 가능한 시간을 확인하고, 특정 시간에 예약하는 상황의 예시)
/doctors/허준
이라는 엔드포인트를 사용한 것을 볼 수가 있다.slots/123
으로 실제 변경되는 리소스를 엔드포인트로 사용하였다.예시와 같이, 어떤 리소스를 변화시키는지와 어떤 응답이 제공되는지에 따라 각기 다른 엔드포인트를 사용하기 때문에 적절한 엔드포인트를 작성하는 것이 중요하다. 또, 엔드포인트 작성 시에는 동사, HTTP메서드, 혹은 어떤 행위에 대한 단어 사용은 지양하고, 자원(Resource) 에 집중해 명사 형태의 단어로 작성하는 것이 바람직한 방법이다.
또한, 아래의 예시 처럼 리소스 사용에 대한 성공/ 실패 여부 또한 반환을 해야한다.
앤드포인트란 (Endpoint)
HTTP메소드의 POST,GET 같은 같은 URL들에 대해서도 다른 요청을 하게끔 구별하게 해주는 항목이다.
즉, Endpoint 는 API가 서버에서 자원(Resource)에 접근할 수 있도록 하는 URL이다.
HTTP메소드 | 설명 |
---|---|
GET | 조회(Read) |
POST | 추가(Create) |
PUT(교체), PATCH(수정) | 갱신(Update) |
DELETE | 삭제(DELETE) |
CRUD에 맞게 적절한 HTTP메서드를 사용하는 것에 중점을 둡니다.
0,1단계의 예시는 모두 POST메서드를 사용하고 있다. 이는 CRUD에 따른 적합한 메서드를 사용한 것이 아니다.
예시를 예를 들면
1. 예약 가능한 시간을 확인하는 것은 조회(Read)
하는 행위
2. 특정 시간에 예약한다는 것은 특정시간에 예약을 생성(CREATE)
하는 행위
예약 가능한 시간을 확인하는 것은 조회(Read)
하는 행위
서로 의미 하는 것이 있기 때문에 조회(Read)
하기 위해선 GET
메서드를 사용하여 요청을 보내고 이때 GET
메서드는 body
를 가지지 않아 query parameter를 사용하여 필요한 리소스를 전달한다.
특정 시간에 예약한다는 것은 특정시간에 예약을 생성(CREATE)
하는 행위
예약을 생성하기 위해서는 POST
메서드를 사용하여 요청을 보내야 하고, POST
요청에 대한 응답이 어떻게 반환되는지가 중요하다. 이 경우 응답은 새롭게 생성된 리소스를 보내주기 때문에, 응답 코드는 201 Created로 명확하게 작성해야 하며, 관련 리소스를 클라이언트가 Location
헤더에 작성된 URI를 통해 확인할 수 있도록 하면 완벽하게 REST 성숙도 모델의 2단계를 충족한 것이라고 볼 수가 있다.
HTTP 메서드를 사용할 때 유의 해야 할 몇가지 규칙
GET
메서드 같은 경우는 서버의 데이터를 변화시키지 않는 요청에 사용해야 합니다.POST
메서드는 요청마다 새로운 리소스를 생성하고PUT
메서드는 요청마다 같은 리소스를 반환합니다. 이렇게 매 요청마다 같은 리소스를 반환하는 특징을 멱등(idempotent)하다고 합니다. 그렇기 때문에 멱등성을 가지는 메서드 PUT과 그렇지 않은 메서드POST는 구분하여 사용해야 합니다.PUT
메서드와PATCH
메서드도 구분하여 사용해야 합니다.PUT
은 교체,PATCH
는 수정의 용도로 사용합니다.
HATEOAS(Hypermedia As The Engine Of Application State), 하이퍼미디어 컨트롤을 적용한다.
3단계의 요청은 2단계와 동일하지만, 응답에는 리소스의 URI를 포함한 링크 요소를 삽입하여 작성해야한다.
위의 예시와 같이 허준이라는 의사의 예약 가능 시간을 확인한 후, 그 시간대에 예약을 할 수 있는 링크를 삽입하거나, 특정 시간에 예약을 완료하고 나서는 그 예약을 다시 확인할 수 있도록 링크를 작성해 넣는 것 즉,
응답 내에 새로운 링크를 넣어 새로운 기능에 접근할 수 있도록 하는 것이 3단계의 핵심 포인트이다.
정부에서 제공하는 공공 데이터, 쉽게 접근할 수 있도록 정부는 Open API의 형태로 공공데이터를 제공하고 있다. (공공데이터)