REST API
REST API
REST API란?
REST (REpresentational State Transfer)
- 웹 상의 자원을 이름으로 구분하고 해당 자원의 상태를 주고 받는 모든 것
- 웹 애플리케이션 상에 존재하는 모든 리소스에 대해 고유의 URI를 부여
- HTTP Method를 통해서 리소스에 대한 작업(CRUD 명령)을 적용
- 대표 상태 전송
URI가 부여된 리소스의 상태를 응답으로 전송
한다는 뜻
REST의 구성 요소
- 자원 (Resource)
- 서버의 존재하는 데이터의 총칭
- 자원은 고유의 URI를 가지며, 이를 통해서 특정 자원을 식별 가능하다
- 행위 (Verb)
- 클라이언트가 HTTP Method를 이용하여 자원을 조작하는 모든 행위
- 표현 (Representation)
- 클라이언트가 HTTP Method로 자원을 조작하면 서버가 그에 대한 응답을 JSON과 같은 형식으로 보냄
REST architecture에 적용되는 제한 조건
- 인터페이스 일관성
- 일관적인 인터페이스로 분리됨
- Cacheable
- 클라이언트는 응답을 캐싱할 수 있어야함
- 클라이언트-서버 간의 상호작용을 부분적으로 또는 완전히 제거하여 확장성과 성능을 향상시킬 수 있음
- Stateless
- 각 요청 간 클라이언트의 context가 서버에 저장되어서는 안된다.
- Layered System
- 클라이언트는 보통 서버에 직접 연결 되었는지, 또는 프록시 서버를 통해서 연결되었는지 알 수 없다.
- 프록시 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는 것에 유용하다.
- Code on demand (Optional)
- 자바 애플릿이나 자바스크립트의 제공을 통해서 서버가 클라이언트가 실행시킬 수 있는 로직을 전송하여 기능을 확장시킬 수 있다.
- Client-Server 구조
- 아키텍처를 단순화시키고 작은 단위로 분리(decoupling)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 도와준다.
REST 인터페이스 원칙
자원의 식별
- Request내에 기술된 개별 자원을 식별할 수 있어야한다. 자원의 그 자체는 클라이언트가 받는 문서와는 개념적으로 분리되어있다.
- 예를 들어, 서버는 데이터베이스 내부의 자료를 직접 전송하는 대신, 데이터베이스 레코드를 HTML, XML이나 JSON 등의 형식으로 전송
메세지를 통한 리소스의 조작
- 클라이언트가 어떤 자원을 지칭하는 메세지와 특정 메타데이터만 가지고 있다면, 충분하게 서버 상의 해당 자원을 변경, 삭제할 수 있는 정보를 가지는 것
💡 자기서술적 메세지
- self-descriptive messages
- 각 메세지는 자신을 어떻게 처리해야 하는지에 대한 충분한 정보를 포함
- MIME type과 같은 인터넷 미디어 타입을 전송할 경우, 메세지는 어떤 파서를 이용해야하는지에 대한 정보도 포함
- 미디어 타입만 가지고도, 클라이언트는 어떻게 그 내용을 처리해야할 지 알 수 있어야한다.
- 메세지를 이해하기 위해서 그 내용까지 살펴봐야 한다면, 그 메세지는 자기서술적이지 않다.
application/xml
이라는 미디어 타입은, 실제 내용을 다운로드 받지 않으면 그 메세지를 가지고 무엇을 해야할지에 대해 충분히 알려주지 못함
애플리케이션 상태에 대한 엔진으로서 하이퍼미디어
Hypermedia as the engine of application state (HATEOAS)
만약, 클라이언트가 관련된 리소스에 접근하기를 원한다면 리턴되는 지시자에서 구별될 수 있어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
{ "account_id": 12345, "balance": "312,000", "links": [ { "rel": "self", "href": "http://localhost:8080/accounts/12345" }, { "rel": "transfer", "href": "http://localhost:8080/accounts/12345/transfer" } ] }
이러한 원칙을 준수한 API를 RESTful API라고 한다.
REST의 목표
- 구성 요소 상호작용의 규모 확장성
- 인터페이스의 범용성
- 구성 요소의 독립적인 배포
장점
- 별도의 인프라 구축 불필요
- 클라이언트와 서버의 분리
- 플랫폼 독립적
- 쉬운 사용
단점
- 별도의 명확한 표준이 존재하지 않음
- HTTP Method의 한계로 인한, Operation의 모호성
- RDBMS와는 맞지 않음
This post is licensed under CC BY 4.0 by the author.