개발하는 햄팡이

[CS] HTTP의 정의와 HTTP Method 종류 본문

기타 개발 지식

[CS] HTTP의 정의와 HTTP Method 종류

hampangee 2025. 5. 7. 21:59

두 번의 자바 프로젝트가 끝나고 이번주 부터는 Spring 프로젝트를 진행하게 되었다.

과제의 요구사항은 간단한 CRUD가 포함된 RESTFul Api를 작성해야하는데

제일 처음으로 해야할 것이 요구사항 분석 및 Api 명세서 작성이다.

 

이제까지 프로젝트하면서 내가 작성했던 Api 명세서의 대부분은 대충 아래 사진 같은 느낌으로 작성되어있다.

 

각자 파트를 맡은 팀원들과 같이 상의하면서 정하는데 가장 헷갈리는 부분이 메소드를 뭘 사용해야하는지에 대한 부분이다.

 

이번에라도 해당 개념을 정확하게 하고 넘어가기 위해 이 주제로 글을 써보려고 한다.


1. HTTP (HyperText Transfer Protocol)

http는 웹에서 데이터를 주고받는 데 사용되는 프로토콜이다.

쉽게 인터넷 상의 도로망 설계도라고 생각하면 된다.

 

웹 브라우저(Chrome, Internet Explorer, Firefox 등)와 웹 서버(= WAS / Jetty, Nginx, Apache Tomcat 등)에서 데이터를 주고받을 때,

월드 와이드 웹이라는 이름처럼 다양한 문화의 사람들이 데이터를 주고받게된다.

이 때문에 정해진 규칙이 필요했고, 그래서 만들어진 것이 HTTP 통신규격이다.

 

HTTP는 OSI 7계층의 애플리케이션 계층에 속하는데

보통 웹에서의 데이터의 흐름을 네트워크 계층부터 살펴보면

 

1. 네트워크 계층(IP)

    - 호스트 간에 패킷을 전달.(데이터 패킷. 패킷은 정해진 형태로 감싼 데이터 덩어리라고 생각하면 된다.)

    - IP주소를 기반으로 경로를 찾아 데이터 전달

2. 전송계층(TCP)

    - 애플리케이션 간의 신뢰성 있는 순서를 보장하고 오류 시 검출하고 재전송을 요청하는 역할을 한다.

    - HTTP 요청이나 응답을 Port번호를 이용하여 정확한 애플리케이션에 전달한다.

    * 여기서의 애플리케이션은 웹 브라우저, 워드 프로세서, 메일 클라이언트(Gmail 앱), 채팅 앱(카카오톡, Slack) 등 우리가 사용하는 프로그램을 의미한다. 애플리케이션 계층에는 HTTP, SMTP, DNS등 다양한 프로토콜이 있다.

3. 애플리케이션 계층(HTTP)

    - HTTP 메세지 형식에 맞추어 다양한 콘텐츠를 주고받을 수 있게 함.

 

이런식으로 동작한다.

많은 내용이 함축되어있어서 전부 이해할 수 있는 내용은 아니지만 

중요한 내용은 정해진 규칙이 필요했고, 그래서 만들어진 통신규격이라는 것.

 

따라서 앞으로 프로젝트를 RESTFul 백엔드 프로젝트를 진행할때 지켜야 하는 부분인 것이다.


2. HTTP Message 구조

Http 메세지는 머리말(Start-Line + Header)와 본문(Body)로 이루어져있다.

URL과 메서드, 헤더, 바디에 데이터를 담아 보내게된다.

 

1. Start-Line

가장 첫줄엔 메서드와 경로, HTTP버전을 지정한다.

 

  • HTTP Method
    • 리소스에 대해 수행할 작업
    • 주요 메서드:
      • POST (Create)
      • GET (Read)
      • PUT (Update 전체 교체)
      • PATCH (Update 일부 수정)
      • DELETE (Delete)
  • Request Target (Path + Query String)
    • 절대 경로(/로 시작)
    • 쿼리 문자열도 포함: /search?keyword=sparta
  • HTTP Version
    • 주로 1.1, 2, 3 등이 사용됨

예시 : 

GET /event HTTP/1.1

 

 

2. Header

헤더는 이 요청의 성격이 어떤 것들이 있는지 쓰여있다.

예를 들어 Host, Content-Type, Content-Length, Authorization 등 많은 정보를 담을 수 있다.

예시: 

Host: spartacodingclub.kr
Content-Type: application/json
Authorization: Bearer abc123xyz

F12 개발자 도구를 열어서 Network창을 조회하면 확인할 수 있다.

 

그 다음엔 헤더와 본문을 구분하는 빈 줄이 있다. 반드시 하나의 공백 줄이 있어야 제대로 파싱된다.

 

3. Message Body

실제 데이터가 담기는 부분이다.

HTML, JSON, 이미지, 파일 바이너리 등 어떤 형태든 전송이 가능하다.

보통 GET 요청에서는 바디를 사용하지 않는다.

반드시 Content-Type과 Content-Length 헤더와 함께 사용한다.

Content-Type이 명시되어있어야 어떤 형식으로 해독해야하는지 알 수 있고, 이게 올바르지 않을 경우 415 Unsupported Media Type 에러가 발생한다.

Content-Length는 본문이 언제 끝나는지 알려주는 용도이다. 언제 끝나는지 알 수 없을때 Header에 Transfer-Encoding: chunked 규칙을 적용하여 데이터를 청크 단위로 쪼개 전송할 수 있도록 한다.

 


3. HTTP Method 종류

이제 자주쓰는 Http Method의 종류, 특징, 언제 사용하는지 그 상황을 알아보자.

 

Http 메소드에는 안정성, 멱등성, 캐시가능성이라는 속성이 있다.

안정성(safe)이란 데이터를 생성하거나 수정, 삭제 등 변형이 되냐 아니냐를 기준으로 판단한다.

멱등성(Idemptent)이란 여러번 요청을 보냈을때 결과가 항상 같은지에 대한 여부로 판단한다.

캐시 가능성(Cacheable)이란 재사용을 위해 요청에 대한 응답을 저장할 수 있는가에 따라서 판별한다. 주로 변경 가능성이 적은 정적 자원을 주로 캐싱한다.

 

 

1. GET

리소스를 조회한다는 의미를 가지고 있다.

안정성도 있고 멱등성도 있다.

GET으로 요청을 보낼때 body에 데이터를 넣을 수 있지만, 지원되지 않는 브라우저가 있기 때문에 권장하지 않는다.

 

2. POST

리소스를 생성하거나 어떠한 작업을 요청할 때 사용한다.

서버의 상태가 바뀌기 때문에 안정성이 없고, 중복 호출 시 결과가 다를 수 있기 때문에 멱등성도 없다.

Body에 데이터를 담아 전달할 수 있다. 조회시에도 사용할 수 있다.

 

3. PUT

리소스를 덮어쓴다는 의미를 갖고 있다. 항상 리소스를 식별하는 URI가 필요하다.

식별자 id값을 이용하여 해당 데이터에 새로운 내용을 덮어쓰기한다.

 

기존의 리소스가 존재하지 않을 경우 새로 만들고, 

기존의 리소스가 있을 경우 덮어쓰기한다. 이때, 주의할 점이 하나 있는데, 만약 id가 1인 값에 name과 age필드가 있을 경우,

age를 바꾼다는 요청이 들어오면 age만 바뀌어 name의 원래 내용과 age의 새로운 내용이 저장되는 것이 아니라, 

name은 전달받지 못했으므로 null이 되고 age는 새로운 내용으로 저장된다.

 

서버에 저장되는 데이터값이 변경되기 때문에 안정성은 없지만,

같은 요청을 여러번 보내도 결과는 같기 때문에 멱등성이 있다.

 

POST는 좋아요 누르기, 1더하기 같은 로직도 POST요청을 보내기 때문에 멱등성이 없다고 말할 수 있다.

 

4. PATCH

덮어쓰기를 하는 PUT과 다르게 일부를 수정한다는 의미를 가지고 있다. 안정성X, 멱등성O

 

5. DELETE

리소스를 삭제한다. 안정성X, 멱등성 O

 

6. HEAD

리소스의 메타정보(크기, 타입 등)를 확인하기위해 사용된다.

GET과 비슷하지만 요청을 보냈을때 반환값에 본문이 없고 헤더만 있어 리소스의 정보를 확인할 수 있다.


그 외에도 다양한 메소드가 있지만 거의 위에 있는 애들 말고는 본적이 없다.

다른 글에서도 별로 사용하지 않는 메소드라고 해서 따로 다루지는 않았다.

 

평소에 다양한 상황에서 POST, PUT, PATCH 중에 어떤 것을 써야할지 많이 고민된다.

각 특징을 공부하고 알맞는 상황이 무엇인지 고민하다보면 훌륭한 API 디자인을 할 수 있지 않을까..?

 

일상 속 사물이 알려주는 웹 API디자인이라는 책을 사서 읽어보고 있다.

이전에 내가 작성했던 코드의 다양한 문제점들이 보인다...

 

CS 공부하고 다시 클린코드 작성하러 고고~

'기타 개발 지식' 카테고리의 다른 글

[Web] Web이란? - Web의 역사 살펴보기  (1) 2025.03.31