REST api란
본 블로그는 공부를 목적으로 한 정리입니다.
주제
- rest에 대해서 공부해보자
목차
- REST 개념
- REST 특징
- REST 제약조건
REST 개념
REST는 Representational State Transfer의 약자로 일종의 소프트웨어 아키텍처로 볼 수 있습니다.
Resource(자원)
REST는 HTTP URL를 통해 Resource(자원)를 Representation(표현)할 수 있습니다.
- 예를 들면 redmoons 사이트에서 첫 페이지를 표현하면
https://redmoons.github.io/pages/1
로 표현이 가능한 것처럼 HTTP URI를 통해 모든 Resource를 표현할 수 있습니다.
이 표현된 Resource를 어떻게 할 것인가에 대해서는 HTTP Method가 수행합니다.
- POST, GET, PUT, DELETE 이 Method들이 Resource에 대한 CRUD operation를 수행하게 됩니다.
- POST : Create
- GET : Select
- PUT : Create/Update
- DELETE : Delete
REST는 HTTP URI(자원의 표현)과 HTTP Method(표현된 자원의 행동)으로 나타낼 수 있습니다.
POST vs PUT
POST는 생성을 담당, PUT은 업데이트를 수행한다는데 무엇이 다른걸까?
결론적으로 PUT은 멱등성을 담보하고, POST는 멱등성을 담보하지 않습니다. 여기서 멱등성이란 몇 번을 반복하더라도 같은 값을 보장한다는 것입니다.
- POST method는 클라이언트가 Resource를 지정하지 않았을 때 Resource를 생성합니다.
// 첫 번째 POST
https://redmoons.github.io/users
// user 생성
{"name":"red"}
// 두 번째 POST
https://redmoons.github.io/users
// user 생성
{"name":"blue"}
- PUT method는 Resource 위치가 명확히 지정된 요청입니다.
// 첫 번째 PUT
https://redmoons.github.io/users/1
// user 생성
{"name":"red"}
그러므로 PUT을 수행하면 몇 번을 반복하더라도 같은 결과를 보장합니다.(=멱등성을 가진다.)
REST 제약조건 (원리)
REST 아키텍처에 적용되는 6가지 제약 조건이 있습니다.
Uniform Interface(인터페이스 일관성)
- 일관적인 인터페이스로 분리되어 디커플링된 아케텍쳐를 구현합니다.
- URI로 지정된 Resource들의 대한 조작들을 일관적으로 처리합니다.
Stateless(무상태)
- 각 요청 간 클라이언트의 콘텍스트가 서버에 저장되어서는 안 됩니다.
- 즉 각각의 요청들을 독립적으로 수행 및 처리해야합니다. (이전의 세션을 현재 요청에 쓸 수 없습니다.)
- 좀더 쉽게 이야기하면 클라이언트로부터 서버로 보내진 서버 session 데이터는 각 요청에 대해 독립적이여야 합니다.
- 서버의 동작 방식이 일관성을 가지게 됩니다.
Cacheable
클라이언트는 응답을 캐싱할 수 있어야 합니다.
Client-Server
- 아키텍처를 단순화시키고 작은 단위로 분리(decouple)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 해줍니다.
Layered System
- 클라이언트는 보통 대상 서버에 직접 연결되었는지, 또는 중간 서버를 통해 연결되었는지를 알 수 없습니다.
- 그로인해 중간 서버는 로드벨런서나 공유 캐시 등을 통해 시스템 규모 확장성을 향상시킬 수 있습니다.
Code on Demand (optional)
- 자바 애플릿이나 자바스크립트의 제공을 통해 서버가 ‘클라이언트가 실행시킬 수 있는 로직’을 전송하여 기능을 확장시킬 수 있습니다.
- 쉽게 이야기해 서버로부터 스크립트를 받아 클라이언트가 실행합니다.
출처
https://developer.mozilla.org/ko/docs/Glossary/REST https://bcho.tistory.com/321 https://ko.wikipedia.org/wiki/REST https://en.wikipedia.org/wiki/Representational_state_transfer