HTTP 는 리퀘스트(클라이언트)와 리스폰스(서버)의 구조로서 해당 조건을 만족한다. HTTP는 헤더의 Cache-Control를 통한 캐시 가능 여부 명시함으로서 해당 조건을 만족한다. HTTP는 리퀘스트와 리스폰스를 보내는 주체는 중간 계층을 신경 쓰지 않아도 되는 구조로서 해당 조건을 만족한다. HTTP에서는 서버의 코드를 담을 수 있는 Body로서 해당 조건을 만족한다. Bad ❌
/get-member-list
/create-new-member
Good ✅
/members
/articles
/members # 멤버 목록 (복수형)
/members/1 # 멤버 목록 중 (복수형), 1번 멤버 (단수형)
/key # 1개의 키 (단수형)
/articles
/articles/1
/articles/1/comments
/articles/1/comments/2
마지막 슬래시(/) 붙이지 않기
마지막에 붙는 슬래시를 트레일링 슬래시 (Trailing Slash)라고 하며, REST에서 어떠한 의미도 가지지 않기 때문에 혼동을 줄 수 있어서 붙이지 않음
모두 소문자로 작성 & 띄어쓰기는 대시(-) 사용
언더스코어(_) 또는 카멜 케이스(CamelCase)는 가독성을 낮출 수 있기에 사용하지 않음
띄어쓰기를 위한 대시(-)와 함께 소문자를 사용
파일 확장자 포함하지 않음
목록에 필터가 필요할 경우, 쿼리 문자열을 사용
/articles/1/comments?sort=latest
URI에 동사 사용 X
Bad ❌
/members/1/delete
/members/2/update
Good ✅
DELETE /members/1
PUT /members/2
GET: 자원 가져오기GET /members로 members라는 정보를 JSON 형태로 받아옴
POST: 자원 조작하기
PUT / PATCH: 자원 수정하기

DELETE: 자원 삭제하기
정상적으로 삭제되는 경우 보여줄 내용이 없어지기에 상태코드만 발생

✨ 조작의 표현: HTTP Method
✨ 자원의 표현: JSON
PUT과 PATCH 모두, 의미적으로 자원을 수정할 때 사용할 수 있는 HTTP 메소드이지만, PUT은 자원의 교체(replace), PATCH는 부분 수정(partial update)을 의미한다는 차이가 있음(1) PUT
{
"username": "harry",
"age": 30
}
PUT /members/1
{
"username": "mike"
}
200 OK
{
"username": "mike",
"age": null
}
(2) PATCH
PATCH /members/1
{
"username": "mike"
}
200 OK
{
"username": "mike",
"age": 30
}

메시지에 담긴 자원의 표현을 해석하는 설명을 작성 방식
HATEOAS (Hypermedia As The Engine Of Application State): 하이퍼미디어를 사용한 애플리케이션 상태 표현 및 변경
현재 페이지에서 어떤 페이지로 이동이 가능한지, 어떤 동작을 수행할 수 있는지 등의 변경 가능한 부분들을 알 수 있어야 한다는 의미!
예: 멤버를 삭제하는 동작 명시 → HATEOAS 만족

HATEOAS를 만족하는 방법:


<a> 태그의 구조와 매우 유사Cache-Control, Last-Modified, ETag 등의 태그들을 적절히 사용

Cache-Control 헤더를 사용해서 캐싱한다면? ← max-age : 몇초동안 유효한 캐시인지 명시
Last-Modified 헤더를 추가한다면?
ETag (Entity Tag)를 활용한다면? ← 문자열 기반
web API의 추가나 삭제는 크게 문제되지 않으나 변경의 경우 리스폰스 구조변경, 새로운 엔드포인트 생성 등의 방식으로 대처해야 함
버저닝: 수정 시 기존의 이름과 완전히 바뀌게 되면 혼동을 줄 수 있으므로 v1, v2 등과 같이 버전을 명시해주는 것이 권장됨
예: GET / v2/members
다양한 버전의 형태:
# 1.
/v2/members
# 2.
/members?version=2
# 3.
Accept-Version: v2
/members
페이지네이션(pagination): 한꺼번에 너무 많은 자원을 받으면 서버에 부담이 갈 수도 있으므로 대부분의 API들이 자원의 양이 많은 경우 적절한 양만큼씩 묶어서 번호를 붙여 n번째 페이지의 개념으로 정리한 후 각 페이지별로 요청하는 방식을 체택함
리스폰스를 받을 때 자원에 대한 표현 + 페이지에 대한 정보를 함께 받아야 함
API 내용:

웹페이지 UI 반영사항:

