HTTP 메서드

고기호·2024년 8월 30일
1

네트워크

목록 보기
3/4

HTTP 메서드

HTTP API


API URI

  • URI (Uniform Resource Identifier)
    • 웹 리소스를 식별하는 데 사용되는 고유한 문자열이다.
  • 예시
    • 회원 목록 조회, 회원 조회, 회원 등록, 회원 수정, 회원 삭제

리소스와 메서드의 관계

  • 리소스 (Resource)
    • 데이터를 나타내는 명사이다.
    • 위 예시에서 회원이 리소스가 된다
  • 메서드 (Method)
    • 리소스를 다루기 위한 행동을 나타낸다.
    • 위 예시에서 조회, 등록, 수정, 삭제가 HTTP 메서드로 표현된다.

HTTP 메서드


HTTP 메서드는 클라이언트와 서버 간의 상호작용 방식을 정의하는 데 사용된다. 각 메서드는 특정한 목적을 가지고 있다.

GET

  • 기본 기능
    • 리소스를 조회하고, 그 결과를 클라이언트에게 반환한다.
    • 서버의 상태를 변경하지 않는다.
  • 메시지 바디 사용
    • 일반적으로 메시지 바디를 사용하지 않는다.
    • 일부 서버는 허용할 수 있지만, 표준적이지 않기 때문에 권장되지 않는다.
    • 필요시 쿼리 파라미터로 전달하는 것이 일반적이다.
  • 사용 예시
    // members 리소스를 조회하고, 쿼리 파라미터를 이용해 이름이 John인 회원 정보를 조회
    GET /members?name=John

POST

  • 기본 기능
    • 클라이언트가 전달한 데이터를 서버에서 처리하고, 처리된 결과를 반환하거나, 새로운 리소스를 생성한다.
    • 메시지 바디를 통해 데이터가 서버로 전달된다.
  • 사용 예시
    • 신규 리소스 등록
      // 신규 회원 등록
      POST /members
    • 프로세스 처리
      // 주문 배달 시작
      POST /orders/{orderId}/start-delivery
    • 다양한 상황에서 사용
      • GET, PUT, PATCH 등으로 처리하기 애매한 작업에도 사용된다.
      • 예시
        • 필터링된 데이터 요청

          // GET의 쿼리 파라미터로는 필터링된 데이터 요청이 적합하지 않음
          // 따라서 POST + 메시지 바디를 이용해서 요청한다.
          POST /members/search
          
          {
            "name": "John",
            "ageRange": {
              "min": 30,
              "max": 40
            },
            "sort": "age",
            "order": "desc"
          }
          
        • 상태 변경과 데이터 요청의 결합

          // 데이터베이스에서 주문의 상태 변경
          POST /orders/{orderId}/start-delivery
          
          {
            "isDelivery": true
          }
  • 리소스 생성 여부
    • 반드시 새로운 리소스를 생성하지 않을 수도 있다.
      • 예를 들어, 특정 프로세스를 시작하는 요청이나, 상태 변경을 처리하는 경우
  • 정리
    • 데이터를 수정하는 것 뿐만 아니라 다른 메서드로 처리하기 어려운 부분에서 사용될 수 있다.

PUT

  • 기본 기능
    • 클라이언트가 지정한 리소스를 서버에서 완전히 대체한다
    • 만약 지정된 리소스가 존재하지 않으면, 서버가 새로운 리소스를 생성한다.
  • 사용 예시
    • 회원 정보 전체 업데이트

      // id가 123인 회원의 정보를 새롭게 대체한다.
      PUT /members/123
      
      // id가 45인 문서의 내용을 새롭게 대체한다.
      PUT /documents/45
  • 클라이언트가 리소스를 식별
    • 클라이언트가 리소스의 위치를 정확히 알고 있으며, 이를 바탕으로 URI를 명시적으로 지정한다.
      // 리소스의 위치를 알지 못하므로 메시지 바디 또는 쿼리 파라미터를 이용
      POST /members
      
      // 유저의 id(리소스의 위치)를 알고 있으므로 URI에 리소스의 ID를 포함해 요청
      PUT /members/123

PATCH

  • 기본 기능
    • 리소스의 일부를 수정하는 데 사용된다.
      • PUT과 마찬가지로 클라이언트가 리소스의 위치를 알고 있다.
      • PUT과 달리, 특정 필드 또는 속성만 변경한다.
  • 사용 예시
    • 회원 이메일 수정
      // 클라이언트가 리소스의 위치를 알고 있으므로 URI에 id(123)을 포함한다.
      PATCH /members/123
      
      {
      	"email" : "update@email.com"
      }
  • 유연성
    • 부분 업데이트를 하기 때문에, 불필요한 수정을 줄이고, 효율성을 높인다.

DELETE

  • 기본 기능
    • 지정된 리소스를 삭제한다.
    • PUT과, PATCH와 마찬가지로 클라이언트가 리소스의 위치를 알고 있다.
  • 사용 예시
    • 특정 회원 삭제

      // 클라이언트가 리소스의 위치를 알고 있으므로 URI에 id(123)을 포함한다.
      DELETE /members/123
  • 안전성 및 고려사항
    • DELETE 요청은 되돌릴 수 없으므로, 중요한 데이터를 삭제하는 경우 추가적인 확인 절차를 두는 것이 좋다.

HTTP 메서드의 속성


HTTP 메서드는 다음과 같은 속성들이 존재한다.

  1. 안전(Safe Methods)
  2. 멱등(Idempotent Methods)
  3. 캐시가능(Cacheable Methods)

안전

  • 정의
    • 안전한 메서드는 리소스를 변경하지 않는 메서드를 의미한다.
    • 서버의 상태를 변화시키기 않는다. 따라서 메서드를 여러 번 호출하더라도, 서버에 부정적인 영향을 미치지 않는다.
    • 예시
      • GET 메서드는 리소스를 조회할 뿐, 리소스를 변경하지 않는다.
  • 주의사항
    • 안전성은 리소스의 상태 변화에 한정한다
      • GET 요청을 한번에 엄청나게 보낸다고 가정해보자, 서버에 과부하를 줄 수 있지만, 이러한 상황은 안전성의 정의에 포함되지 않는다.

멱등

  • 정의
    • 동일한 요청을 여러 번 수행하더라도 결과가 동일하게 유지되는 속성을 의미한다.
    • 요청이 중복될 가능성이 있을 때 안정적인 처리를 보장해준다.
  • 멱등성 메서드
    • GET
      • 한 번 조회하든, 두 번 조회하든 동일한 리소스가 반환된다.
    • PUT
      • 리소스를 대체하기 때문에, 최종 결과는 항상 동일하다.
    • DELETE
      • 리소스를 삭제하기 때문에, 최종 결과는 항상 동일하다.
  • 비역등성 메서드
    • POST
      • 동일한 요청을 두 번 보내면, 각각의 결과가 달라질 수 있다.
      • 예를 들어, 결제 요청을 두 번 보내면 두 번 결제가 될 수 있다.
  • 주의 사항
    • 요청 사이에 외부 요인으로 리소스가 변경되었을 경우에 발생하는 문제는 멱등성의 범위에 포함하지 않는다.

캐시가능

  • 정의
    • 응답 결과를 클라이언트나 중간 캐시 서버에 저장해 두고, 다음 요청 시에 이를 재사용할 수 있는 속성을 의미한다.
  • 실제 고려 사항
    • 캐시 가능한 메서드
      • GET, POST, PATCH, HEAD 등이 있다.
    • 실제 사용
      • GET, HEAD가 주로 사용되고, POST와 PATCH의 경우 메시지 바디의 복잡성 때문에 실무에서 캐시되는 경우가 드물다.

기타 메서드


  • 기본 기능
    • 응답의 헤더 부분만 가져오는 메서드다.
    • 본문은 제외된다
  • 사용 예시
    • 파일 크기 확인
      • 예를 들어, 영화를 다운로드하고 싶을 때, 파일이 너무 크다면 다운로드를 거절할 수 있게 하기 위해 사용한다. 이 경우 Content-Length 와 같은 헤더 정보를 가져와 파일 크기를 확인하고, 실제로 다운로드할지 결정하는 데 도움이 된다.

Reference

https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC?srsltid=AfmBOooNtv7KIam6DI3gAnWZNNj8S2dgbot6grksRKUJWGQ4Eb0WNi1W

profile
웹 개발자 고기호입니다.

0개의 댓글