http
HTTP(Hypertext Transfer Protocol)는 웹에서 데이터를 주고받기 위해 사용하는 응용 계층 프로토콜입니다. 우리가 브라우저에서 URL을 입력하거나, REST API 서버에 요청을 보낼 때, 데이터를 요청하고 응답을 받는 방식이 모두 HTTP로 진행됩니다. 서버-클라이언트 모델을 기반으로 하고 있으며, 텍스트 기반의 요청(request)과 응답(response) 구조를 갖는 점이 특징입니다.
HTTP 메서드(또는 HTTP Verb)는 클라이언트가 서버에 요청을 보낼 때 의도나 행동을 나타내는 중요한 요소입니다. 예를 들어 “어떤 자원을 조회할 것인가?” “자원을 생성할 것인가?” “삭제할 것인가?”와 같은 의도를 서버에 표현할 수 있습니다.
HTTP 요청은 다음과 같은 형식을 가집니다.
HTTP 메서드 + URL(요청 대상) + HTTP 버전
헤더(Header)
[빈 줄]
바디(Body) (필요 시)
Bash정확한 HTTP 메서드를 적절하게 사용하는 것은 RESTful API를 설계하거나, 일반적인 웹 애플리케이션을 구현할 때 매우 중요한 부분입니다.
Safe란 서버의 상태(데이터)를 변경하지 않는 메서드를 의미합니다. 즉, 요청을 여러 번 보내더라도 서버 자원에 영향을 주지 않아야 합니다.
Idempotent는 메서드를 여러 번 반복해서 호출했을 때, 그 결과가 언제나 동일하게 유지되는 성질을 말합니다.
단, POST는 보통 멱등성이 없는 것으로 간주합니다. 왜냐하면 같은 POST 요청을 여러 번 수행하면, 중복 데이터가 생성되거나 결과가 달라질 가능성이 크기 때문입니다.
HTTP에서 응답을 캐싱할 수 있는지 여부는 매우 중요한 성능 요소입니다. 원칙적으로 HTTP 표준에서 GET, HEAD, POST는 캐싱될 수 있습니다. 그러나 실제로 POST 결과를 캐싱하는 것은 컨트롤 헤더 설정과 구현에 따라 달라지기 때문에 흔하지는 않습니다. 보통 GET 응답만 캐싱을 고려하는 경우가 많습니다.
아래 표는 대표적인 HTTP 메서드들의 특성과 사용 예시를 간단히 정리한 것입니다.
메서드 | 의도(용도) | Safe? | Idempotent? | Cacheable? | 응답 코드 예시 |
---|---|---|---|---|---|
GET | 리소스 조회(Read) | 예 | 예 | 예 | 200(OK), 404(Not Found) |
POST | 리소스 생성(Create), 처리 | 아니오 | 아니오 | 예(드물게) | 201(Created), 400(Bad Request) |
PUT | 전체 리소스 업데이트 | 아니오 | 예 | 아니오 | 200(OK), 201(Created), 404(Not Found) |
PATCH | 리소스 부분(일부) 업데이트 | 아니오 | 구현 따라 다름 | 아니오 | 200(OK), 404(Not Found) |
DELETE | 리소스 삭제(Delete) | 아니오 | 예 | 아니오 | 200(OK), 204(No Content), 404(Not Found) |
HEAD | GET과 동일하지만 Body 없음 | 예 | 예 | 예 | 200(OK), 404(Not Found) |
OPTIONS | 지원 메서드/옵션 확인 | 예 | 예 | 아니오 | 200(OK), 405(Method Not Allowed) |
TRACE | 루프백(Loopback) 테스트, 디버깅 | 예 | 예 | 아니오 | 200(OK) |
CONNECT | 프록시 터널 설정(HTTPS) | 아니오 | 예 | 아니오 | 200(OK), 501(Not Implemented) |
(위 표는 일반적인 경우를 정리한 것이며, 서버 구현에 따라 일부 특성이 달라질 수 있습니다.)
GET /users?page=2&limit=10 HTTP/1.1
Host: api.example.com
HTTP이때 서버는 page=2에 해당하는 유저 목록 10개를 반환합니다.
POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"username": "new_user",
"email": "new_user@example.com",
"password": "123456"
}
HTTP이 요청으로 서버는 new_user라는 유저를 새로 생성합니다.
PUT /users/100 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"username": "updated_user",
"email": "updated_user@example.com",
"password": "654321"
}
HTTPid = 100인 유저의 정보를 통째로 교체합니다.
PATCH /users/100 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"email": "patch_email@example.com"
}
HTTP이 요청은 id = 100인 유저의 email 필드만 변경합니다.
DELETE /users/100 HTTP/1.1
Host: api.example.com
HTTP서버는 id=100인 유저를 삭제 처리합니다.
HEAD /images/photo.png HTTP/1.1
Host: example.com
HTTP이 요청의 응답은 Content-Length, Last-Modified 같은 헤더만 포함하고, 실제 이미지 데이터를 보내지 않습니다.
OPTIONS /users HTTP/1.1
Host: api.example.com
HTTP서버는 이 URL에서 허용되는 메서드(GET, POST, PUT 등)를 헤더에 담아 응답합니다.
HTTP 메서드를 제대로 사용하려면 HTTP 응답 코드(상태 코드) 역시 상황에 맞게 설정해야 합니다.
등을 적절히 사용해 주는 것이 좋습니다.
RESTful API를 설계할 때 가장 기본이 되는 것이 리소스 설계와 HTTP 메서드 사용입니다.
이처럼 일관성 있게 설계하면, 클라이언트와 서버 간의 협업이 수월해집니다.
HTTP 메서드는 웹 애플리케이션뿐 아니라 RESTful API 설계의 핵심 요소입니다. 단순히 GET, POST만 구분하는 것이 아닌, PUT, PATCH, DELETE, HEAD, OPTIONS 등 다양한 메서드의 의도와 성격을 정확히 이해하면 더욱 견고하고 직관적인 API를 구축할 수 있습니다.
궁극적으로 적절한 메서드를 올바른 상황에 배치하는 것은 서버-클라이언트 간 의도를 명확히 전달하며, 유지보수성, 확장성 측면에서도 큰 이점을 줍니다.
TIP: 실제 프로젝트에서는 문서화 도구(Swagger/OpenAPI 등)를 통해 API 엔드포인트별 메서드, 요청/응답 예시, 에러 코드 등을 상세히 정리해두면 협업과 유지보수에 큰 도움이 됩니다.
이상으로 HTTP 메서드에 대한 설명을 마칩니다.
앞으로 HTTP 기반의 서비스나 API를 구현할 때, 이 글이 참고가 되었길 바랍니다.
HTTP 상태코드란 무엇인가? HTTP 상태코드(HTTP Status Code)는 서버가 클라이언트의 요청을 처리한 결과를 수치화된 코드로 나타내는…
HTTP란 무엇인가? HTTP(Hypertext Transfer Protocol)는 인터넷에서 웹 브라우저와 웹 서버가 서로 통신하기 위해 사용하는 프로토콜입니다.…
들어가며 우리가 인터넷에서 웹사이트에 접속할 때 가장 먼저 하는 일은 브라우저 주소창에 어떤 문자열을 입력하는…
인터넷 네트워크란? "인터넷(Internet)"이라는 단어는 "인터네트워크(Internetwork)"의 줄임말입니다. 즉, 여러 개의 네트워크가 상호 연결되어 전 세계적으로 하나의…
스프링 빈(Spring Bean)과 IoC 컨테이너 스프링 프레임워크의 핵심 철학은 IoC(Inversion of Control) 컨테이너를 통해 객체(빈,…