HTTP 메서드에 대해

su_under·2024년 4월 9일
0
post-thumbnail

GET, POST, PUT, DELETE❓

평소에 개발을 하면서 HTTP 메서드를 이용하는데, GET, POST, PUT, DELETE와 같은 메서드들을 내가 명확하게 사용하고 있는 걸까? 라는 궁금증이 생겼다. 이 궁금증과 동시에 HTTP 메서드라는 게 정확히 무엇이고, 왜 사용하는 것인지 근본적인 의문이 생겨 블로그로 작성해보고자 한다.


🛠️ REST

HTTP 메서드에 대해서 알기 위해서, 먼저 정의되는 것이 REST이다.

REST란?

REST(Representational State Transfer)의 약자로, 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다. REST는 다음과 같은 3가지로 구성이 되어있다.

  • 자원(Resource) : HTTP URI
  • 자원에 대한 행위(Verb) : HTTP Method
  • 자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load

여기서 글의 주제인 HTTP 메서드가 등장한다. 즉, HTTP 메서드는 REST를 지키면서 행위를 전달하는 방법이다.


HTTP 메서드

더 자세하게 HTTP 메서드에 대해 살펴보자.

HTTP 메서드 종류

앞에서 말한 것처럼 HTTP 메서드는 행위를 전달하는 방법인데, 이 방법에는 여러가지 종류가 있다. 총 9가지의 HTTP 메서드가 있고 이 중 주로 쓰이는 메서드는 5가지이다.

  • 주요 메서드
    • GET : 리소스 조회
    • POST : 요청 데이터 처리, 주로 등록에 사용
    • PUT : 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 생성
    • PATCH : 리소스를 부분 변경 (PUT이 전체 변경, PATCH는 일부 변경)
    • DELETE : 리소스 삭제
  • 기타 메서드
    • HEAD : GET과 동일하지만 메시지 부분(body 부분)을 제외하고 상태 줄과 헤더만 반환
    • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)를 설명
    • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
    • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행. 현재 정보 유출 위험이 있어 거의 모든 브라우저가 지원 안함

1. GET

GET 메서드는 데이터를 읽거나 검색할 때 사용되는 메서드이다. 요청이 성공적으로 이루어진다면 200(Ok) HTTP 응답 코드를 리턴한다. 에러가 발생하면 주로 404(Not found) 에러나 400(Bad request) 에러가 발생한다.

  • HTTP 명세에 의하면 GET 요청은 오로지 데이터를 읽을 때만 사용되고 수정할 때는 사용하지 않는다.
  • GET 요청은 idempotent 하다.
  • 같은 요청을 여러 번 하더라도 변함없이 항상 같은 응답을 받을 수 있다.
  • 데이터를 변경하는 연산에 사용하면 안된다.

예시

GET /user/1

데이터를 조회하는 것이기 때문에 요청시에 Body 값과 Content-Type이 비워져있다. 조회할 데이터에 대한 정보는 URL을 통해서 파라미터를 받고 있는 모습을 볼 수 있다.

데이터 조회에 성공한다면 Body 값에 데이터 값을 저장하여 성공 응답을 보낸다.

GET은 캐싱이 가능하여 같은 데이터를 한번 더 조회할 경우에 저장한 값을 사용하여 조회 속도가 빨라진다.

2. POST

POST 메서드는 새로운 리소스를 생성할 때 사용된다. 성공적으로 요청을 완료하면 201(Created) HTTP 응답을 반환한다.

  • POST 요청은 idempotent 하지 않다.
  • 같은 POST 요청을 반복해서 했을 때 항상 같은 결과물이 나오는 것을 보장하지 않는다.

예시

POST /user
body : {date : "example"}
Content-Type : "application/json"

데이터를 생성하는 것이기 때문에 요청시에 Body 값과 Content-Type 값을 작성해야한다. 해당 예시는 JSON을 통해서 작성된 예시이다.

URL을 통해서 데이터를 받지 않고, Body 값을 통해서 받는다.

데이터 조회에 성공한다면 Body 값에 저장한 데이터 값을 저장하여 성공 응답을 보낸다.

3. PUT

PUT 메서드는 리소스가 있으면 업데이트하고 없으면 생성하기 위해 서버로 데이터를 보내는 데 사용된다.

  • PUT 요청은 idempotent 하다.
  • 동일한 PUT 요청을 여러 번 호출하면 항상 동일한 결과가 생성된다.

예시

PUT /user/1
body : {date : "update example"}
Content-Type : "application/json"

데이터를 수정하는 것이기 때문에 요청시에 Body 값과 Content-Type 값을 작성해야한다. 해당 예시는 JSON을 통해서 작성된 예시이다.

URL을 통해서 어떠한 데이터를 수정할지 파라미터를 받는다. 그리고 수정할 데이터 값을 Body 값을 통해서 받는다.

데이터 조회에 성공한다면 Body 값에 저장한 데이터 값을 저장하여 성공 응답을 보낸다.

4. DELETE

DELETE 메서드는 지정된 리소스를 삭제한다.

예시

DELETE /user/1

데이터를 삭제하는 것이기 때문에 요청시에 Body 값과 Content-Type 값이 비워져있다.

URL을 통해서 어떠한 데이터를 삭제할지 파라미터를 받는다.

데이터 삭제에 성공한다면 Body 값 없이 성공 응답만 보내게 된다.

HTTP 메서드의 속성

위에서 idempotent 라는 단어가 반복적으로 나왔는데 이것은 HTTP 메서드의 속성이다. 대체 idempotent 하다는 것이 무엇인지 HTTP 메서드의 다른 속성들과 함께 알아보자.

HTTP 메서드는 속성에는 다음과 같이 3가지 속성이 있고 해당 속성별로 메서드를 구분할 수 있다.

  • 안전함(Safe Methods) 이 말은 계속해서 메서드를 호출해도 리소스를 변경하지 않는다는 뜻이다. 주요 메서드 중에는 GET 메서드가 안전하다고 볼 수 있다.
  • 멱등성(Idempotent Methods) 이 말은 메서드를 계속 호출해도 결과가 똑같다는 뜻이다. GET, PUT, DELETE는 멱등하다고 볼 수 있지만 POST나 PATCH는 멱등하다고 볼 수 없다. PATCH가 왜 멱등하지 않다고 하는건지는 여기를 참고하자.
  • 캐시 가능(Cacheable Methods) 캐시 가능하다는 말은 말 그대로 캐싱을 해서 데이터를 효율적으로 가져올 수 있다는 뜻이다. GET, HEAD, POST, PATCH가 캐시가 가능하지만 실제로는 GET과 HEAD만 주로 캐싱이 쓰인다고 한다.

🔗 참고 자료

profile
솨의 개발일기

0개의 댓글