HTTP 메서드

LeeKyoungChang·2021년 12월 31일
0
post-thumbnail

'모든 개발자를 위한 HTTP 웹 기본 지식' 수업을 듣고 정리한 내용입니다.

 

📚 1. HTTP API를 만들어보자

요구사항 : 회원 정보 관리 API를 만들어라

  • 회원 목록 조회 /read-member-list
  • 회원 조회 /read-member-by-id
  • 회원 등록 /create-member
  • 회원 수정 /update-member
  • 회원 삭제 /delete-member

 

URI 설계, 리소스 식별

  • 리소스 : 회원이라는 개념 자체, 미네랄을 캐라 (미네랄이 리소스)
    (1) 리소스를 어떻게 식별할까?
  • 회원을 등록하고 수정하고 조회하는 것을 모두 배제
  • 회원이라는 리소스만 식별하면 된다. -> 회원 리소스를 URI에 매핑

 

ARI URI 설계

  • 요구사항을 API 로 만들어볼 때 단순하게 생각하면 이와 같이 설계할 수 있다.
  • 다만, 현재 요구사항을 통해 URI 설계는 매우 좋지 않다. 중요한 것은 리소스 식별이다.
  • URI는 리소스만 식별한다.
  • 리소스와 해당 리소스를 대상으로 하는 행위를 분리한다.
    • 리소스 : 회원
    • 행위 : 조회, 등록, 삭제, 변경
      리소스는 명사, 행위 동사 (미네랄을 캐라)

행위는 어떻게 구분할까?

✏️ 참고
계층 구조상 상위를 컬렉션으로 보고 복수단어를 사용하는 것을 권장한다.

 

📚 2. HTTP 메서드 - GET, POST

행위를 구분하려면 HTTP 메서드를 이용하면 된다❗️

 

HTTP 메서드 종류

  • GET : 리소스 조회
  • POST : 요청 데이터 처리, 주로 등록에 사용
  • PUT : 리소스를 대체, 해당 리소스가 없으면 생성
  • PATCH : 리소스 부분 변경
  • DELETE : 리소스 삭제

 

HTTP 메서드 종류 - 기타 메서드

  • HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
  • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

(1) GET

  • 리소스 조회
  • 서버에 전달하고 싶은 데이터 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달
  • 메시지 바디에 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많기에 권장하지 않는다.
스크린샷 2021-12-31 오후 6 36 30

서버에 전달해서 도착하면, 응답 데이터가 전달된다.

스크린샷 2021-12-31 오후 6 39 03

 

(2) POST

1. 새 리소스 생성(등록)

  • 서버가 아직 식별하지 않은 리소스 생성

2. 요청 데이터 처리

  • 단순한 데이터를 생성하거나, 변경하는 것을 넘어 프로세스를 처리해야 하는 경우 사용한다.
  • 서버는 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
  • POST 의 결과로 새로운 리소스가 생성되지 않을 수도 있다.
    • POST /orders/{orderId}/start-delivery : 컨트롤 URI (리소스로 생성)

3. 다른 메서드로 처리하기 어려운 경우

  • 'JSON 으로 조회 데이터를 넘겨야 하는데 GET 메서드를 사용하기 어려운 경우'와 같이 애매한 경우 POST 를 사용한다.

데이터를 넘겨야할 때 많이 사용한다.

 

스크린샷 2021-12-31 오후 6 46 12 스크린샷 2021-12-31 오후 6 46 17 스크린샷 2021-12-31 오후 6 47 14

📚 3. HTTP 메서드 - PUT, PATCH, DELETE

POST는 모든 것을 할 수 있다. (메세지 외부로 보낼 때)

  • 변경, 프로세스 진행, 어쩔 수 없는 경우 사용

GET은 데이터 조회할 때 유리하다.

  • 데이터 조회할 때 사용

 

(1) PUT

[1] 리소스가 있다면 대체한다.

  • 리소스가 없다면 생성한다.
  • 덮어버린다.

 

[2] 클라이언트가 리소스를 식별한다.

  • 클라이언트가 리소스 위치를 알고 URI 지정한다.
  • POST 와의 큰 차이점이다.
  • ex) POST/members 이런 식으로 접근하지만, PUT/members/100 와 같이 location을 지정해주어야 한다.

 

리소스가 있는 경우 vs 리소스가 없는 경우
(a) 있는 경우

스크린샷 2021-12-31 오후 7 00 59 스크린샷 2021-12-31 오후 7 01 06

(b) 없는 경우
스크린샷 2021-12-31 오후 7 01 14

스크린샷 2021-12-31 오후 7 01 20

 

주의
현재 json

스크린샷 2021-12-31 오후 7 02 15

이때,

스크린샷 2021-12-31 오후 7 04 42

이와 같이 PUT 한다면

username 필드가 삭제된다.

스크린샷 2021-12-31 오후 7 05 33

 

리소스를 수정하려고 PUT 을 이용하려고 하였지만, 전체를 덮어 버리기에 다른 것을 사용해야 한다.

 

(2) PATCH

리소스를 부분 변경한다.

스크린샷 2021-12-31 오후 7 08 26 스크린샷 2021-12-31 오후 7 08 46

 

(3) DELETE

리소스 제거

스크린샷 2021-12-31 오후 7 12 58 스크린샷 2021-12-31 오후 7 13 04

 

PATCH 를 지원하지 않는 서버에서는 POST 를 사용하면 된다.

 

📚 4. HTTP 메서드의 속성

스크린샷 2021-12-31 오후 7 18 16

(1) 안전 (Safe)

  • 호출해도 리소스를 변경하지 않는다.
    • 안전한 메서드 - GET (조회만 하기 때문에 리소스가 변경되지 않는다.)
    • 안전하지 않은 메서드 - POST, PUT, DELETE, PATCH
  • 안전의 범위는 해당 리소스만 고려한다.

 

(2) 멱등 (Idempotent)

f(f(x)) = f(x)

  • 몇 번을 호출하든 결과가 똑같다❗️

  • 멱등 메서드

    • GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
    • PUT : 결과를 대체한다. 따라서 같은 요청을 여러 번 해도 최종 결과는 같다.
    • DELETE : 결과를 삭제한다. 같은 요청을 여러 번해도 삭제된 결과는 똑같다.
    • POST : 멱등이 아니다. 두 번 호출하면 같은 결제가 중복해서 발생하기에 에러가 발생할 수 있다.
  • 활용

    • 자동 복구 메커니즘
    • 서버가 TIMEOUT 등으로 정상 응답을 못했을 때, 클라이언트가 같은 요청을 다시 해도 되는가에 대한 판단 근거가 된다.
  • 멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지는 않는다.

 

(3) 캐시 가능(Cacheable)

  • GET, HEAD, POST, PATCH 는 캐시 가능하다.
  • 실제로는 GET, HEAD 정도만 캐시로 사용한다. (실무에서는 GET 만 사용, POST, PATCH 는 본문 내용까지 캐시 키로 고려해야하는데 구현이 쉽지 않다.)

 

🔔 정리
(1) 리소스는 명사, 행위는 동사
(2) HTTP 메서드

  • GET : 리소스 조회
  • POST : 새 리소스 등록, 요청 데이터 처리, 다른 메소드로 처리하기 어려운 경우도 사용
  • PUT : 리소스를 대체
  • PATCH : 리소스를 부분적으로 변경
  • DELETE : 리소스를 제거

(3) HTTP 메서드의 속성

  • 안전 : 호출해도 리소스가 변경되지 않는다.
  • 멱등 : 메서드를 여러 번 호출해도 결과가 항상 똑같다.
  • 캐시 가능 : 응답 결과 리소스를 캐시해서 사용해도 되는지 검토할 때 사용한다.

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글