[HTTP] 4. HTTP 메서드

2024. 10. 13. 13:13·BE/HTTP

HTTP Method

HTTP API를 만들어보자

  • 회원 정보 관리 API를 만들어라 -> API URI를 설계하자!
    • 회원 목록 조회 /read-member-list
      • 회원 조회 /read-member-by-id
      • 회원 등록 /create-member
      • 회원 수정 /update-member
      • 회원 삭제 /delete-member

이렇게 설계하는 것이 좋은 URI 설계일까?? (X)
-> URI 설계에서 가장 중요한 것은 리소스 식별 !!
즉, URI는 리소스 식별을 기준으로 설계를 해야함

  • API URI
    • 여기서 리소스란?
      • 회원 등록, 수정, 조회 하는 것이 리소스가 아님
      • 회원이라는 개념 자체가 바로 리소스 !
      • 즉, 회원이라는 리소스만 식별하면 됨 -> 회원 리소스를 URI에 매핑
    • 리소스 식별, URI 계층 구조 활용
      • 회원 목록 조회 /members
        • 회원 조회 /members/{id}
        • 회원 등록 /members/{id}
        • 회원 수정 /members/{id}
        • 회원 삭제 /members/{id}

이렇게 되면 4개가 다 같은 URI 구조를 갖는데 그럼 어떻게 구분 ?
만약, id=10번 회원으로 조회하면 다 똑같은데 ?
-> Method로 행위를 구분하자!

즉, 리소스와 해당 리소스를 대상으로 하는 행위를 분리하자 !

  • 리소스는 회원, 행위는 조회 등록 삭제 변경

 

HTTP Method

  • 주요 메서드
    • GET: 리소스 조회 (리소스 달라)
    • POST: 요청 데이터 처리, 주로 등록에 사용 (데이터를 줄테니 처리해줘)
    • PUT: 리소스를 대체, 해당 리소스가 없으면 생성 (데이터를 보내는데, 지금 보내는 것으로 대체해줘 - 기존에 있다면 덮어써줘)
    • PATCH: 리소스 부분 변경 (기존꺼 덮어쓰지 않고 수정하는 경우)
    • DELETE: 리소스 삭제

 

  • GET
    • 리소스 조회
    • 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달
    • 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음
GET /search?q=spring&hl=ko HTTP/1.1
Host: www.google.com

/members/100 GET 이렇게 서버가 받으면 내부 데이터베이스를 조회해서 JSON 파일을 작성하고 응답메시지를 만들어서 보냄

 

  • POST
    • 요청 데이터 처리
    • 메시지 바디를 통해 서버로 요청 데이터 전달 (전달해줄테니 서버가 처리해달라)
    • 서버는 요청 데이터를 처리
      • 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행
    • 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용
POST /members HTTP/1.1
Content-Type: application/json
{
    "username": "spring",
    "age": 25
}

POST의 경우 서버와 미리 약속을 해놓음
너가 만약 POST /members로 그 데이터를 보내면 내가 그 데이터를 저장할거야, 어떤 프로세스에 쓸거야. 이런식으로 미리 약속을 해놓음
그래서 약속된 처리를 서버가 해주고 응답 메시지를 보내줌

 

  • POST가 요청 데이터를 어떻게 처리한다는 뜻일까?
    • POST 메서드는 대상 리소스가 리소스의 고유한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청
    • 즉, 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정해야 함 -> 정해진 것이 없음

 

  • POST 총 정리
    • 새 리소스 생성(등록)
      • 서버가 아직 식별하지 않은 새 리소스 생성
    • 요청 데이터 처리
      • 단순히 데이터를 생성하거나, 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
      • ex) 결제완료 -> 배달시작 -> 배달완료 처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
      • POST의 경과로 새로운 리소스가 생성되지 않을 수 있음
      • ex) POST /orders/{orderId}/start-delivery (컨트롤 URI)
        • 자원만 URI로 설계해야 한다고 하지 않음?
        • 그것만으로 안되는 경우가 있음. 동사의 URI가 나올 수 있음 (이런 동사 URI를 컨트롤 URI라고 함)
    • 다른 메서드로 처리하기 애매한 경우
      • JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기 어려운 경우 (GET은 메시지 바디를 잘 사용하지 않으므로)
      • 이런 경우에는 조회지만 POST 메소드로 써야함

즉, POST는 메세지를 내부에 담아서 할 수 있는 모든 것이 가능함
하지만, 조회할 때는 GET을 쓰는 것이 유리 (서버끼리는 GET이 오면 캐싱을 한다는 약속이 있음, POST는 캐싱을 잘 하지 않음)
조회는 GET을 쓰고 데이터가 변경, 프로세스가 진행되는 경우에는 POST, 그리고 정말 어쩔 수 없는 경우에는 POST 선택

 

  • PUT
    • 리소스를 대체
      • 리소스가 있으면 대체 (덮어쓰기)
      • 리소스가 없으면 생성
    • 클라이언트가 리소스를 식별
      • 클라이언트가 리소스 위치를 알고 URI를 지정해줌
      • 이것이 POST와의 차이점
PUT /members HTTP/1.1
Content-Type: application/json
{
    "username": "spring",
    "age": 25
}

PUT은 수정할 때 사용하는 메서드가 아님.
리소스를 완전히 대체하기 때문 (갈아치우는 것)

 

  • PATCH
    • 리소스 부분 변경
    • 수정하고 싶을 때 사용
    • 만약, PATCH가 안되는 HTTP를 만났다 -> POST를 사용하면 됨
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
    "age": 25
}

/members/100 이렇게 리소스 URI를 완전히 지정해주고 PATCH를 날리면 그 데이터의 "age" 부분만 업데이트 됨

 

  • DELETE
    • 리소스 제거
DELETE /members/100 HTTP/1.1
Host: localhost:8080

 

HTTP 메서드의 속성

  • 안전 (Safe Methods)
    • 호출해도 리소스를 변경하지 않는다는 것
    • GET (+HEAD)는 리소스가 변경될 수 없으니까 안전, POST PUT PATCH 등은 호출되었을때 데이터가 변경되므로 안전하지 않음
    • 그래도 만약 계속 호출해서 로그가 쌓여서 장애가 발생하면 ?
      • 안전은 해당 리소스만 고려. 그냥 해당 리소스가 변하냐, 변하지 않냐만 생각
  • 멱등 (Idempotent Methods)
    • 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같음
    • 멱등 메서드
      • GET: 한 번 조회, 두번 조회 모두 같은 결과가 조회됨
      • PUT: 결과를 대체하므로 같은 요청을 여러번 해도 최종 결과는 같음. PUT은 기존 것을 날리고 새로운 데이터로 완전히 대체하기 때문에 같은 요청 (동일한 메시지)로 계속 요청하면 같을 수 밖에 없음
      • DELETE: 결과를 삭제함, 같은 요청을 여러번 해도 삭제된 결과는 같음
    • POST
      • 멱등이 아님! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있음
    • 멱등의 활용
      • 자동 복구 메커니즘
      • 예를 들어, DELETE를 호출했는데 서버에서 응답이 없어. 잘되었는지 안되었는지 모르니까 DELETE를 재새도 해도 되겠지? 왜냐 -> 멱등하기 때문
      • ex) 서버가 timeout 등으로 정상 응답을 못줬을 때, 클라이언트가 같은 요청을 다시 해도 되는가? 의 판단 근거
    • 재요청 중간에 다른 곳에서 리소스를 변경해버린다면 ?
      • 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지 고려하지 않음
  • 캐시가능 (Cacheable Methods)
    • 응답 결과 리소스를 캐시해서 사용해도 되는가 ?
    • GET, HEAD, POST, PATCH 캐시가능
    • 실제로는 GET, HEAD 정도만 캐시로 사용
      • 캐시를 하려면 똑같은 데이터와 키가 맞아야 하는데 POST와 같이 바디에 데이터도 있는 경우 이런 것 까지 고려해서 넣는게 쉽지 않음

 

API URI 설계는 리소스 식별을 기준으로 하자! 그리고 행위는 Method를 통해서 구분하자 !
HTTP Method에는 GET, POST, PUT, PATCH, DELETE 등이 있음. HTTP 메소드의 속성에는 1. 호출해도 리소스를 변경하지 않는다는 안전과 2. 한 번의 호출과 100번의 호출의 결과가 같은지의 멱등과 3. 빠르게 데이터를 가져올 수 있는지에 대한 캐시가능이 있음

 

 


김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식 보고 작성한 내용입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

'BE > HTTP' 카테고리의 다른 글

[HTTP] 3. HTTP 기본  (1) 2024.10.13
[HTTP] 2. URI와 웹 브라우저 요청 흐름  (0) 2024.10.13
[HTTP] 1. 인터넷 네트워크  (0) 2024.10.13
'BE/HTTP' 카테고리의 다른 글
  • [HTTP] 3. HTTP 기본
  • [HTTP] 2. URI와 웹 브라우저 요청 흐름
  • [HTTP] 1. 인터넷 네트워크
m5n
m5n
  • m5n
    m5n
    m5n
  • 전체
    오늘
    어제
    • 분류 전체보기 (16)
      • 기록 (0)
      • Language (6)
        • Java (6)
        • Python (0)
      • Spring (0)
      • Aws (0)
      • Git (0)
      • FE (2)
        • JavaScript (2)
      • BE (4)
        • HTTP (4)
      • PS (3)
        • 백준 (2)
        • 프로그래머스 (0)
        • Sql (1)
      • 기술서적 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
m5n
[HTTP] 4. HTTP 메서드
상단으로

티스토리툴바