a
HTTP 메서드(HTTP Methods)는 클라이언트가 웹 서버에게 원하는 동작을 알려주는 방식으로, HTTP 프로토콜에서 요청의 목적과 종류를 나타내는 수단이다. 각 메서드는 서버 자원에 대해 수행하고자 하는 행동을 정의한다.
RESTful API는 HTTP 메서드를 활용하여 자원(Resource)에 대한 CRUD(Create, Read, Update, Delete) 연산을 수행하는 인터페이스로, 웹의 기존 구조와 HTTP 프로토콜의 장점을 최대한 활용하는 아키텍처 스타일이다.
즉, HTTP 메서드는 웹 통신에서 클라이언트와 서버 간의 상호작용 방식을 정의하는 표준화된 약속이다.
HTTP 메서드는 다음과 같은 기본적인 특성을 가진다.
HTTP 메서드의 주요 목적은 클라이언트와 서버 간의 효율적이고 명확한 통신을 가능하게 하는 것이다. 각 메서드는 자원에 대한 특정 작업을 나타내며, 이를 통해 웹 애플리케이션은 일관되고 예측 가능한 방식으로 동작할 수 있다. 예를 들어, 온라인 쇼핑몰에서 상품 정보를 조회할 때는 GET 메서드를, 새로운 주문을 생성할 때는 POST 메서드를 사용하는 등 각 상황에 맞는 메서드를 선택하여 사용한다.
HTTP 프로토콜에서 가장 흔히 사용되는 메서드들은 다음과 같다:
GET /api/users?id=123 HTTP/1.1
Host: example.com
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com"
}
PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"role": "admin"
}
DELETE /api/users/123 HTTP/1.1
Host: example.com
기본 메서드 외에도 다음과 같은 추가 메서드들이 사용된다:
PATCH /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"email": "newemail@example.com"
}
HEAD /api/users/123 HTTP/1.1
Host: example.com
OPTIONS /api/users HTTP/1.1
Host: example.com
| 메서드 | 안전성 | 멱등성 | 캐시 가능성 |
|---|---|---|---|
| GET | O | O | O |
| POST | X | X | X(일부 가능) |
| PUT | X | O | X |
| DELETE | X | O | X |
| PATCH | X | X(일반적) | X |
| HEAD | O | O | O |
| OPTIONS | O | O | X |
REST 아키텍처에서는 HTTP 메서드가 자원에 대한 CRUD 연산을 표현한다:
GET /api/postsGET /api/posts/{id}POST /api/postsPUT /api/posts/{id}PATCH /api/posts/{id}DELETE /api/posts/{id}GET /api/usersGET /api/users/{id}POST /api/usersPUT /api/users/{id}PATCH /api/users/{id}DELETE /api/users/{id}HTTP 메서드를 사용할 때 적절한 HTTP 상태 코드를 반환하는 것이 중요하다.
메서드별로 일반적으로 반환되는 상태 코드는 다음과 같다:
| 메서드 | 성공 시 상태 코드 | 자주 발생하는 오류 상태 코드 |
|---|---|---|
| GET | 200 OK | 404 Not Found |
| POST | 201 Created | 400 Bad Request |
| PUT | 200 OK / 204 No Content | 400 Bad Request, 409 Conflict |
| DELETE | 204 No Content | 404 Not Found |
| PATCH | 200 OK / 204 No Content | 400 Bad Request, 409 Conflict |