REST 기반으로 서비스 API를 구현한 것
리소스를 중심으로 URI를 설계하고 행위는 HTTP Method로 구분하는 방식
요청과 응답은 일반적으로 JSON 또는 XML 형식
아래 예시
GET /items/123
리소스식별자행위즉, REST API는 단순이 요청을 보내는 규칙이 아니라
자원을 어떻게 표현하고, 어떻게 다룰지에 대한 설계 방식
POST /getItemList
POST /createItem
POST /deleteItem
GET /items
POST /items
DELETE /items/123
다양한 이해관계자들이 이해해야 하기 때문에
URL + HTTP Method만 보고도 무슨 API인지 식별할 수 있어야함
HTTP Methd는 해당 요청이 어떤 행동을 하려는지 나타내는 동사 역할
| Method | CRUD | 의미 (행동) |
|---|---|---|
POST | Create | (새로) 생성하라. |
GET | Read | (데이터를) 조회하라. |
PUT | Update | (전체를) 수정하라. (또는 덮어써라) |
DELETE | Delete | (데이터를) 삭제하라. |
PATCH | Update | (일부만) 수정하라. (PUT과 달리 일부 필드만 변경) |
Endpoint는 요청이 도달하는 주소, 행동의 대상이 되는 자원을 표현하는 경로
https://api.example.com + /items
동사보다 명사 사용
가능하면 복수형으로 작성
예시
GET /items
GET /users
GET /orders/1
이렇게 쓰는 이유는 Endpoint가 "행동"보다 "대상 자원"을 표현해야하기 때문
| Endpoint 예시 | 의미 (자원) |
|---|---|
/items | '상품들(items)'이라는 자원 전체 (컬렉션) |
/items/123 | '상품들(items)' 중에서 '123번'이라는 특정 자원 1개 |
/users | '사용자들(users)'이라는 자원 전체 |
/users/5/cart | '5번 사용자'에게 종속된 '장바구니(cart)' 자원 |
여기서 /users/5/cart 는 사용자라는 상위 자원 아래에 장바구니라는 하위 자원이 종속되어 있는 형태로 볼 수 있다.
GET /items/123
DELETE /items/123
PATCH /items/123123은 특정 아이템을 식별하는 값즉, Path는 "무엇을 대상으로 하는가"를 더 정확히 지정할 때 사용
GET /items?sort=new&page=2
GET /items?category=electronics
즉, Query는 "무엇을 조회할지"가 아니라 "어떤 조건으로 조회할지"를 표현하는데 적합
{
"name": "무선 마우스",
"price": 35000,
"category": "electronics"
}
GET은 일반적으로 Body를 사용하지 않는다고 이해하는 것이 좋다.
보내는 Body의 형식을 명시
Content-Type: application/json
"나는 지금 JSON 형식의 데이터를 보냅니다."라는 의미
인증 정보를 담을 때 사용
Authorization: Bearer eyJhbGciOi...
로그인 후 발급받은 토큰 등을 전달할 때 자주 사용
(1) 2xx : 성공 (Success)
200 OK: 조회(GET), 수정(PUT) 성공.
201 Created: 생성(POST) 성공.
204 No Content: 삭제(DELETE) 성공. (응답 Body가 없음)
(2) 4xx : 클라이언트 오류 (요청이 잘못됨)
400 Bad Request: 요청 자체가 잘못됨. (예: 필수 Body 값이 누락됨, JSON 문법 오류)
401 Unauthorized: 인증 실패. (예: 로그인이 필요함, 토큰이 유효하지 않음)
403 Forbidden: 권한 없음. (예: 로그인은 했으나, 관리자 기능에 접근 시도)
404 Not Found: 자원을 찾을 수 없음. (예: GET /items/9999처럼 없는 ID를 조회)
(3) 5xx : 서버 오류 (서버가 문제)
500 Internal Server Error: 서버 내부에서 오류 발생. (예: 코드 로직 오류, DB 연결 실패 등)
상태 코드는 단순 순자가 아니라 API 결과를 설명하는 신호
200 OK만 주는 것보다, 201 Created를 반환하는 것이 의도를 더 잘 드러낸다.대표적으로 많이 보이는건 Content-Type
Content-Type: application/json
즉, 서버가 지금 JSON 형식의 데이터를 돌려준다는 의미
{
"id": 123,
"name": "무선 마우스",
"price": 35000
}
[
{
"id": 1,
"name": "아이템 1"
},
{
"id": 2,
"name": "아이템 2"
}
]
[]
{
"message": "ID 9999에 해당하는 아이템을 찾을 수 없습니다."
}
{
"message": "요청을 처리하는 중 서버에서 오류가 발생했습니다."
}
비슷하게 들리지만 완전히 같은 말로 쓰면 조금 애매하다.
REST : 아키텍처 스타일, 설계 철학
REST API : REST 방식을 기반으로 만든 API
RESTful API : REST 원칙을 비교적 잘 지킨 API
즉, 단순히 HTTP를 사용한다고 해서 모두 RESTful API가 되는 것은 아니다.
POST /getItemList
POST /createItem
POST /updateItem
POST /deleteItem
GET /items
GET /items/123
POST /items
PATCH /items/123
DELETE /items/123
성공 응답만 잘 만드는 것으로는 부족하다.
좋은 API는 실패 응답도 일관성 있게 설계되어야 한다.
{
"error": "잘못된 요청"
}{
"message": "Bad Request",
"code": 400
}{
"timestamp": "2026-04-14T21:00:00",
"status": 404,
"error": "Not Found",
"message": "해당 아이템을 찾을 수 없습니다.",
"path": "/items/9999"
}하나의 엔드포인트에 모든 요청을 몰아넣는 단계
POST /api
Body 안에서 action으로 구분
{
"action": "getItem",
"id": 123
}
리소스별로 URI를 나누는 단계
POST /items POST /users
HTTP Method와 상태 코드를 의미에 맞게 사용하는 단계
GET /items POST /items PATCH /items/123 DELETE /items/123
HATEOAS까지 포함한 단계
{ "id": 123, "name": "무선 마우스", "links": [ { "rel": "self", "href": "/items/123" }, { "rel": "update", "href": "/items/123" } ] }
즉, RESTful API는 단순히 동작하는 API가 아니라 사용하는 사람이 이해하기 쉬운 API라고 볼 수 있다.