2019. 7. 26. 16:56ㆍ개발 & 전산/Web & Network
프로젝트를 하면서 API를 설계할때 늘상 헷갈리는 것이 Rest API입니다. 한번 정리해두고 늘 참고합시다.
Representational State Transfer (REST) refers to a group of software architecture design constraints that bring about efficient, reliable, and scalable distributed systems.
- MDN의 REST
REST란 Representational State Transfer의 약자로, MDN에 따르면 효과적이고 신뢰를 주고 측정가능한 분산시스템을 위한 소프트웨어 설계 제약 사항입니다. 즉, 자원을 정의하고 그 주소를 지정하는 전반의 방법을 말하는 것입니다.
REST의 기본 개념은 상태와 관계가 잘 정의되고 표준화한 포맷으로 document같은 리소스를 전송하는 것입니다. 이 방식을 잘 적용한 설계를 RESTful 이라고 합니다.
1. REST API 기본규칙
-
URI는 정보의 자원을 표현해야 한다.
- resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
- resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
-
자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현한다.
- HTTP Method나 동사표현이 URI에 들어가면 안됩니다.
:id
와 같이 변하는 값은 하나의 특정 resource를 나타내는 고유값이어야 합니다.
흔히 하는 실수는 URI에 자원에 대한 행위를 넣는 것입니다.
// 잘못된 사례
GET /chatrooms/get/:id
POST /chatrooms/create
GET /chatrooms/delete/:id
POST /chatrooms/update/:id
위 잘못된 사례는 아래와 같이 고칠 수 있습니다.
// 올바른 사례
GET /chatrooms/:id
POST /chatrooms
DELETE /chatrooms/:id
PUT /chatrooms/:id
- HTTP Method
- 주로 쓰는 Method
- GET: 조회 (받겠다)
- POST: 리소스 생성 (보내겠다)
- PUT: 리소스 전체 갱신(놓겠다/넣겠다)
- PATCH: 리소스 부분 갱신(붙이겠다)
- DELETE: 리소스 삭제 (지정한 서버의 파일을 삭제하겠다)
- 나머지 Method
- HEAD: GET과 유사하나 HTTP 메시지 헤더만 반송하고 데이터 내용을 돌려보내지 않음(헤더만 보겠다)
- OPTION: 통신 옵션을 통지/조사
- TRACE: 리퀘스트 라인과 헤더를 그대로 클라이언트에 반송(리퀘스트 치환상태를 조사할 때 사용)
- CONNECT: 암호화된 메시지를 프록시로 전송
- 설계 예시
CRUD
HTTP
URI
전체 리소스 조회
GET
/resources
특정 리소스 조회
GET
/resources/:id
리소스 생성
POST
/resources
리소스 전체 수정
PUT
/resources/:id
리소스 일부 수정
PATCH
/resources/:id
특정 리소스 삭제
DELETE
/resources/:id
2. Rest API 세부규칙
- 슬래시(/)는 계층 관계를 나타냅니다.
http://www.example.com/fruits/banana
- URI의 마지막엔 슬래시(/)를 포함하지 않습니다.
http://www.example.com/fruits/banana/ (X)
- 가독성을 높이기 위해 하이픈(-)을 사용할 수 있으나 언더바(_)를 사용하진 않는다.
http://www.example.com/tropical_fruits/banana/ (X)
http://www.example.com/tropical-fruits/banana/ (O)
- URI 경로에는 소문자를 씁니다.
http://api.example.restapi.org/my-folder/my-doc
HTTP://API.EXAMPLE.RESTAPI.ORG/my-folder/my-doc
위의 두 URI는 같은 URI입니다. 호스트에서는 대소문자를 구별하지 않기 때문이지요.
http://api.example.restapi.org/my-folder/my-doc
http://api.example.restapi.org/My-Folder/my-doc
하지만 위의 두 URI는 다른 URI입니다. 뒤에 붙는 path가 대소문자로 구분되기 때문입니다.
RFC 3986에 따르면 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정한다고 합니다. 따라서 전부 소문자이거나 전부 대문자이면 괜찮지만, 일반적으로 대문자는 잘 쓰지 않기 때문에 소문자로 쓰는 것을 권합니다.
예시출처: RESTful API를 설계하기 위한 디자인 팁(https://spoqa.github.io/2013/06/11/more-restful-interface.html)
- 파일 확장자는 URI에 포함하지 않고 Accept header을 사용합니다
- 리소스간 연관관계가 있는 경우
-
/리소스명/리소스ID/관계있는 다른 리소스명(일반적으로 소유has의 관계)
GET /users/:id/skills
참고문헌
- MDN - REST
- RESTful API를 설계하기 위한 디자인 팁
- Uniform Resource Identifier (URI): Generic Syntax(RFC 3986)
- [Network] REST란? REST API란? RESTful이란?
- REST(Representational State Transfer) API
- 위키백과 - REST
- 성공과 실패를 결정하는 1%의 네트워크 원리(2판)