[HTTP] HTTP 리소스, 메서드

미밈·2023년 3월 23일
0
post-thumbnail

API 설계시 가장 중요한것은 ✨리소스 식별

어떻게 리소스를 식별할까 ?

  • 행위를 모두 배제 -> 리소스를 URI에 매핑
  • 리소스 식별 + URI 계층 구조 활용
예시 ) 회원 목록 조회 /members, 
      회원 조회 /members/{id}, 
      회원 등록 /members/{id} ...
 => 리소스 : 회원 (members)

행위는 어떻게 구분 ? => HTTP 메서드가 이 역할을 대신

  • 계층 구조상 컬렉션 상위를 컬렉션으로 보고 복수 단어 사용 !
    (member->members)

👉 리소스 : 명사 / 행위 : 동사
리소스 ( 최근엔 Representation )
HTTP 메서드 : 클라이언트가 서버에 요청을 할 때 기대하는 행동


HTTP 메서드 종류

  • GET : 리소스 조회
  • POST : 요청 데이터 처리, 주로 등록
  • PUT : 리소스를 대체, 없으면 생성
  • PATCH : 리소스 부분 변경
  • DELETE : 리소스 삭제
  • HEAD : GET과 동일하지만, 상태줄 & 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션을 설명 (CORS에서 사용)
    --- 이아래로는 거의 사용 X
  • CONNECT : 대상 자원으로 식별되는 서버에 대한 터널 설정
  • TRACE : 대상 리소스에 대한 경로 따라 메시지 루프백 테스트 수행

GET 메서드

  • 리소스 조회 ( path에 있는 자원을 주세요! )
  • 필요한 파라미터 : 쿼리 파라미터를 통해 전달
  • 메시지 바디 통해서 데이터 전달 가능하지만 지원 X 권장 X
  1. 클라이언트가 요청
⬇️ 클라이언트 요청 메세지 예시
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
  1. 서버에서 내부 조회후 응답 메시지를 만들어서 클라이언트에게 전송
⬇️ 서버 응답 메세지 예시
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34
{
 "username": "young",
 "age": 20
}

POST 메서드

  • 요청 데이터 처리

  • ❗의미가 많음❗
    대상 리소스가 리소스 고유 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청

  • 리소스 URI에 POST 요청이 오면
    요청 데이터를 어떻게 처리해야할 지 리소스마다 따로 정해야함

  • 클라이언트 : 메시지 바디를 통해 서버로 요청 데이터 전달
⬇️ 클라이언트 요청 메세지 예시
POST /members HTTP/1.1
Content-Type: application/json
{
 "username": "young",
 "age": 20
}
  • 서버 : 요청 데이터 처리
    들어온 데이터 처리하는 모든 기능을 수행.
    주로 신규 리소스 등록, 프로세스 처리에 사용
⬇️ 서버 응답 메세지 예시
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100  < 자원 생성 경로 전송
{
 "username": "young",
 "age": 20
}
  • 서버에서 POST 요청시 미리 어떻게 처리할지 설정해둠
    ⬇️예시 : /members로 POST 요청이 오면 신규로 등록할게
    데이터를 받아서 서버에서 요청 처리 -> 신규 리소스 식별자 생성 후 응답
    대체로 신규 리소스 생성 : 201+ 자원 생성된 경로 보내줌
    (Location : /members/100)

POST 사용하는 경우

  • 새 리소스 생성 (등록)
  • 요청 데이터 처리 (동사의 URI : 컨트롤 URI )
  • 다른 메서드로 처리하기 애매한 경우
    데이터 변경, 프로세스 진행, 어쩔수 없는경우

PUT 메서드

  • 리소스를 대체 ( 있으면 대체, 없으면 생성 )
    ❗리소스를 완전히 대체한다❗
  • 클라이언트가 리소스를 식별 O < 중요
    클라이언트가 리소스 위치 알고 URI 지정 (POST는 경로 모름)
⬇️ 클라이언트 요청 메세지 예시
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
 "username": "hello",
 "age": 20
}

/members/100으로 클라이언트가 리소스의 위치를 아는 경우 PUT을 사용

  • PUT은 기존의 데이터 형식을 유지하지 않고 PUT된 데이터로 완전히 대체하므로 대체로 PATCH를 사용한다.

PATCH 메서드

  • 리소스 부분 변경
  • PUT과 같이 클라이언트가 리소스를 식별
  • 안되는경우 POST사용하면 됨
  • 게시글 수정시 PUT이 PATCH보다 good
⬇️ 클라이언트 요청 메세지 예시
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
 "age": 50
}

DELETE 메서드

  • 리소스 제거
  • PUT과 같이 클라이언트가 리소스를 식별
⬇️ 클라이언트 요청 메세지 예시
DELETE /members/100 HTTP/1.1
Host: localhost:8080

HTTP 메서드의 속성

  1. 안전 2. 멱등 3. 캐시 가능

📌 안전 (Safe)

  • 호출해도 리소스를 변경 x (안전은 리소스만 고려)
    GET, HEAD

📌 멱등 (Idempotent)

  • f(f(x)) = f(x)
  • 한번 호출하든 100번 호출하든 결과가 똑같아야한다.
  • GET, PUT, DELETE
  • POST는 멱등이 아님 !두번 호출시 같은 결제가 중복해서 발생

어디에 활용?

  • 자동 복구 메커니즘

  • 서버가 정상응답을 돌려주지 못할 때, 클라이언트가 같은 요청을 해도 되는가?

  • 재요청 중간 다른곳에서 리소스를 변경시? ( 고려사항 아님! : 외부 요인으로 변경되는것 까지 고려 X )

📌 ✨캐시 가능✨

  • 응답 결과를 캐시해서 사용해도 되는가?
    웹브라우저가 내부에 저장하는 이미지 etc..
  • GET, HEAD, POST, PATCH 가능
  • GET, HEAD정도만 캐시로 사용
    ( 나머지는 BODY까지 캐시 키로 설정 해야하는데 쉽지않음 )
profile
하나씩 차근차근 해보는 초초초급개발자

0개의 댓글