[HTTP] 4. HTTP 메소드

윤경·2021년 9월 1일
0

HTTP

목록 보기
4/8
post-thumbnail

[1] HTTP API를 만들어보자

✔️ 요구사항

  • 회원 목록 조회 / 회원별 조회
  • 등록 / 수정 / 삭제

좋은 URI 설계 ?

⭐️ 리소스 식별을 우선으로 하자 !!

리소스란 무엇일까? 회원을 조회해야할 때 "회원 조회"가 리소스일까? 바로 회원이라는 개념 자체가 리소스가 된다.

그렇다면, 리소스를 어떻게 식별하는 것이 좋을까?
회원을 등록/수정/조회를 모두 배제하고 회원이라는 리소스만 식별하자 ➡️ **회원 리소스를 URI에 매핑

URI는 리소스만 식별하도록 하자. 리소스를 리소스 (회원)와 행위 (조회, 등록, 삭제, 변경)로 분리하자.

그 런 데,
회원 목록 조회를 제외한 조회 / 등록 / 수정 / 삭제 모~두 /members/{id}/ 가 되지 않는가? 이렇게되면 뭐가 뭔지 어떻게 구분하지? (여기서 계층 구조상 상위를 컬렉션으로 보고 복수단어(members) 사용을 권장한다.)

자, HTTP 메소드 종류부터 알아보자.


[2] HTTP 메소드 - GET, POST

HTTP 메소드 종류

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

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

GET

  • 리소스 조회
  • 서버에 전달하고 싶은 데이터를 query로 전달
  • 바디를 통해 전달 할 수 있지만 지원하지 않는 서버가 많아 권장 X

POST

  • 요청 데이터 처리
  • 서버에게 메시지 바디로 요청 데이터 전달
  • 서버는 요청 데이터를 처리 → 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능 수행
    (리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 따로 정함)
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세서 처리에 사용

📌 POST 정리 → post는 서버에 큰 변화가 일어나는 경우 사용
1. 새 리소스 생성(등록)
: 서버가 아직 식별하지 않은 새 리소스 생성

2. 요청 데이터 처리
: 단순히 데이터를 생성, 변경을 넘어 프로세스를 처리해야 하는 경우 사용 (ex. 결제 완료 - 배달 시작 - 배달 완료 이런식으로 버튼을 누르면 post로 정보가 넘어가는, 즉 프로세스의 상태가 변경되는 경우)
POST의 결과로 새로운 리소스가 생성되지 않을 수도 있음

3. 다른 메소드로 처리하기 애매한 경우
: (JSON으로 조회 데이터를 넘거야 하는데 GET 메소드를 사용하기 어려운 경우)
애매할 땐 POST를 쓰자 !!
(사실, POST는 모든 것을 할 수 있다. But, 조회할 땐 캐싱을 해야하기 때문에 GET이 더 유리함.)


[3] HTTP 메소드 - PUT, PATCH, DELETE

PUT

: 폴더에 파일을 집어넣는 행위를 생각하면 됨. ➡️ 이미 그 파일이 없으면 새로 집어넣고, 파일이 있으면 덮어버리는

  • 리소스를 완!전!히! 대체함 ➡️ "갈아치움"
  • ⭐️ 클라이언트가 리소스를 식별함
    - 클라이언트가 리소스 위치를 알고 URI를 지정함. (즉, members/100처럼 100이라는 위치를 알고있음)
    - POST와의 큰 차이점

PATCH

: 리소스 부분 변경

DELETE

: 리소스 제거


[4] HTTP 메소드의 속성

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

안전 safe

  • 호출해도 리소스를 변경하지 않는다.
    단순히 조회만 하는 GET 이외에는 안전하다고 할 수 없다.

멱등 Idempotent

: 한 번 호출하든 두 번 호출하든 100번 호출하든 같은 결과 ➡️ f(f(x)) = f(x)

📌 멱등 메소드

  • GET: 몇 번을 조회해도 같은 결과
  • PUT: 결과 대체. 따라서 같은 요청을 여러번 해도 최종 결과는 같음
  • DELETE: 결과 삭제. 여러번 삭제해도 결론은 삭제된 상태이므로
  • POST는 멱등이 아니다 !! 두 번 호출하면 같은 결제가 중복해 발생하는 큰 일이 발생할 수 있다.

📌 멱등의 활용

  • 자동 복구 메커니즘
  • 서버가 TIMEOUT 등으로 정상 응답을 주지 못했을 때, 클라이언트가 같은 요청을 다시 보내도 되는가? 에 대한 판단 근거가 됨. (중복 요청해도 아무런 피해가 가지 않으니까)

그렇다면 중복 요청 도중 다른 곳에서 리소스가 변경되면,,😬

(GET으로 값이 20인 놈을 불렀는데 다른 사람이 PUT으로 값을 30으로 바꾸어 버린다면 난 결국 30을 얻겠지 ,,?)

이런 외부 요인으로 인해 리소스가 도중 변경되는 것까진 고려하지 않는다.

캐시가능 Cacheable

  • 응답 결과 리소스를 캐시(내 로컬 pc 웹 브라우저에 저장)해서 사용해도 되는가?
  • GET, HEAD, POST, PATCH는 캐시 가능
    But, 실제론 GET, HEAD 정도만 캐시로 사용
    (POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데 구현이 쉽지 않기 때문)

profile
개발 바보 이사 중

0개의 댓글

관련 채용 정보