개념
- REST API란 ?
- REpresentational State Transfer (자원을 이름으로 구분하여 해당 자원의 정보를 주고 받는 모든 것을 의미)
- REST 아키텍쳐 스타일을 따르는 API
- 그렇다면 REST란?
- 분산 하이퍼 미디어 시스템(웹)을 위한 아키텍쳐 스타일
- 그렇다면 아키텍쳐 스타일이란?
- 제약 조건의 집합
즉, REST API란
분산 하이퍼 미디어 시스템(웹)에서 자원을 이름으로 구분하여 정보를 주고받는 제약 조건들을 적용한 API
REST API가 필요한 이유?
- 다양한 클라이언트의 등장
- 에플리케이션 분리 및 통합
REST API 특징
1. Server-Client (서버 클라이언트 구조)
- 서로간의 의존성이 줄어든다.
2. Stateless (무상태)
- Client의 context를 Server에 저장하지 않는다.
- Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리한다.
3. Cacheable (캐시처리기능)
4. Layered system (계층화)
- Client는 REST API Server만 호출한다.
- 다중 계층으로 구성될 수 있다.
5. Uniform interface (인터페이스 일관성) - 만족시키기 힘들다
- URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다.
위의 특징을 모두 만족시켜야 만이 API가 RESTful하다고 말 할 수 있다. REST API의 특징을 살펴보면 HTTP 규칙만 잘 따라도 Client-server, Stateless, Cache, Layered system은 조건에 부합한다. 만족시키기 힘든 특징은 Uniform interface인데 그것에 대해 자세히 알아보자.
uniform interface
- identification of resources (리소스가 URI를 식별될 수 있으면 된다)
- manipulation of resources through reporesentations (PUT, DELETE, POST, GET ...)
- self-descriptive messages (메세지는 스스로를 설명해야 한다.)
첫번째와 두번째 특징을 만족시키는 REST 설계 규칙-1
세번째 특징을 만족시키는 REST 설계규칙-2를 살펴보자.
REST API 설계 규칙 - 1
identification of resources URI는 정보의 자원을 표현해야 한다
manipulation of resources through reporesentations 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다
대문자보다는 소문자 사용 (카멜케이스보다 하이픈 사용)
BAD
http://restapi.example.com/Users/postComments
GOOD
http://restapi.example.com/users/post-comments
url는 명사를 사용
BAD
/addNewEmployee
/updateEmployee
/deleteEmployee
/deleteAllEmployees
/promoteEmployee
/promoteAllEmployees
GOOD
HTTP 메소드(GET, POST, DELETE, PUT)로 동사 표현하기
GET (조회)
GET /companies # companies의 모든 목록을 가져온다.
GET /companies/34 # company의 34의 상세 내용을 가져온다
GET /companies/3/employees # company 3에 속하는 employees 전체 목록을 가져온다
GET /companies/3/employees/45 # company3에 속하는 employees 45의 상세 내용을 가져온다
POST(등록)
멱등성(여러번 실행되어도 바뀌지 않는 성질)을 갖지 않는다. (여러번의 request는 각각 다른 영향을 미친다.)
POST /companies # 새로운 company를 생성하고, 생성된 company의 상세 내용을 리턴한다.
POST /companies/3/employees #company 3에 새로운 employee를 생성한다.
PUT(수정)
멱등성(여러번 실행되어도 바뀌지 않는 성질)을 갖는다.
PUT /companies/3/employees/john # company 3에 속하는 employees collection에 john이라는 resource를 업데이트하거나 생성하도록 서버에 요청한다.
DELETE(삭제)
DELETE /companies/34 # company 34를 삭제한다.
DELETE /companies/3/employees/45 # company 3에 속하는 employee 45를 삭제한다.
DELETE /companies/3/employees/john/ # company 3에 속하는 employees collection에서 john이라는 resource를 삭제하도록 서버에 요청한다.
BAD
http://restapi.example.com/users/add-post
http://restapi.example.com/users/delete-all
GOOD
http://restapi.example.com/users/post-comments
언더바 대신 하이픈을 사용 (밑줄은 사용하지 않는다)
BAD
http://restapi.example.com/users/post_comments
GOOD
http://restapi.example.com/users/post-comments
마지막에 슬래시는 포함하지 않는다.
슬래시는 계층구조를 구분할 때 사용
BAD
http://restapi.example.com/users/post-comments/
GOOD
http://restapi.example.com/users/post-comments
파일 확장자는 URI에 포함되어서는 안 된다.
BAD
http://api.college.com/students/3248234/courses/2005/fall.json
GOOD
http://api.college.com/students/3248234/courses/2005/fall
REST API 설계 규칙 - 2
uniform interface의 마지막 규칙인 self-descriptive messages (메세지는 스스로를 설명해야 한다) 에 대한 규칙을 알아보자.
Header에 정보 담기
목적지 명시하기
BAD
GET / HTTP/1.1
GOOD
GET / HTTP/1.1
Host : www.example.org # 목적지를 추가하면 self-descriptive 하다.
JSON 명세서 명시
BAD
HTTP/1.1 OK
[{"op": "remove", "path": "/a/b/c"}]
GOOD
HTTP/1.1 OK
Content-Type: application/json-patch+json
[{"op": "remove", "path": "/a/b/c"}]
Reference
https://www.youtube.com/watch?v=RP_f5dMoHFc&ab_channel=naverd2
https://dzone.com/articles/7-rules-for-rest-api-uri-design-1
https://wayhome25.github.io/etc/2017/11/26/restful-api-designing-guidelines/
https://blog.restcase.com/5-basic-rest-api-design-guidelines/
'개발 > 기타' 카테고리의 다른 글
UX/UI의 10가지 심리학 법칙을 읽고 (0) | 2022.08.17 |
---|---|
쿠키(Cookie), 세션(Session)의 정의, 차이점 (0) | 2022.01.20 |
Docker 간단한 개념정리 및 간단한 실습 (컨테이너, 이미지 생성 및 포트포워딩, 파일시스템과 도커 연결 등 경험해보기) (0) | 2022.01.04 |