HTTP API 설계
HTTP API 설계에서 가장 중요한 것은 리소스의 식별이다.
URI에는 리소스 단위만 포함하고, 리소스에 대한 행위는 메서드(조회, 등록, 수정, 삭제 등)로 분리해서 URI에 포함시키지 않는다.
리소스만으로 설계가 불가능한 경우 행위의 내용이 URI에 포함될 수 있다.
회원
목록 조회: /members회원
단일 조회: /members/{id}회원
등록: /members회원
수정: /members/{id}회원
삭제: /members/{id}
URI는 리소스만 식별하고, 해당 리소스에 해당하는 행위를 메소드로 분리한다.
HTTP 메서드
주요 메서드
GET
: 리소스 조회POST
: 요청 데이터 처리, 등록에 사용PUT
: 리소스를 대체, 해당 리소스가 없을 경우 새로 생성PATCH
: 리소스의 부분을 변경DELETE
: 리소스 삭제HEAD
,OPTIONS
,CONNECT
,TRACE
등
GET 메서드
- 리소스 조회
- 서버에 전달하고 싶은 데이터는 query를 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달가능하나, 지원하지 않는 곳이 많아서 권장하지 않는다.
GET 요청 예시
GET /members/100 HTTP/1.1
Host: localhost:8282
GET 응답 예시
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34
{
"username": "lightSourceCoder",
"age": 26
}
POST 메서드
- 요청 데이터를 처리하는 역할
- 메시지 바디를 통해 서버로 요청 데이터 전달
- 서버는 요청 데이터를 처리해준다.
→ 보통 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행 - 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용함
POST 요청 예시
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "lightSourceCoder",
"age": 26
}
위의 요청을 받아서 해당 신규 리소스를 생성한후 응답한다.
POST 응답 예시
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100 -> 자원이 신규 등록된 경로
{
"username": "lightSourceCoder",
"age": 26
}
PUT 메서드
- PUT 요청은 리소스가 있으면
완전히 대체
하고, 리소스가 없으면 새로 생성 → 덮어버림 - POST와의 차이점은 요청하는 클라이언트가 리소스의 위치(ex: 회원의 이름)를 알고, URI에 그 정보를 포함한다는 것이다.
주의할 점은 PUT는 해당 리소스를 완전히 대체하므로 리소스에 누락된 값이 있는경우, 값이 누락된 상태로 리소스가 변경 될 수 있다.
PATCH 메서드
- 리소스의 부분을 변경 한다.
- 아래의 요청에서 username은 바뀌지않고, age만 26으로 바뀐다.
PATCH /members/17 HTTP/1.1
Content-type: application/json
{
"age": 26
}
DELETE 메서드
- 리소스를 제거한다.
DELETE /members/17 HTTP/1.1
Host: localhost:8282
HTTP 메서드의 속성
안전(Safe)
- 호출해도 리소스를 변경하지 않는다.
- 로그가 쌓여서 장애가 발생한 것에 대해서는 고려하지 않고 리소스만을 고려한다.
멱등(Idempotent)
- 호출 횟수에 상관없이 그 결과가 항상 똑같은 속성
- 외부 요인으로 중간에 리소스가 변경되는 것은 고려하지 않는다.
GET
: 여러 번 조회해도 조회된 결과는 항상 같으므로 멱등.PUT
: 결과를 대체하므로, 요청에 대한 결과는 항상 같으므로 멱등.DELETE
: 같은 요청을 여러 번 해도 해당 리소스는 삭제된 상태이므로 멱등.POST
: 여러 번 호출할 경우 리소스가 중복해서 생성될 수 있으므로 멱등이 아니다.
→ 두번 호출하면 같은 결제가 중복해서 발생가능하다.
캐시 가능(Cacheable)
- 응답 결과에 대한 리소스를 캐시해도 되는지에 대한 속성
GET
,HEAD
,POST
,PATCH
캐시 가능하나, POST와 PATCH는 본문내용까지 캐시 키로 고려하기 까다로워서 실제로 잘 사용하지 않는다.GET
과HEAD
를 캐시로 사용
Reference
https://www.inflearn.com/course/http-웹-네트워크
반응형