[아키텍쳐] Rest api란
Rest api?
Rest api(Representational state transfer)는 클라이언트 - 서버 아키텍처에서 인터넷을 통해 분리된 구성요소들을 간의 균일한 인터페이스를 설명하는 소프트웨어 아키텍처 스타일이다. Rest api는 6개의 제약조건을 만족하는 모든 api를 의미한다.
6가지 제약조건
- Uniform interface
- Client - server
- Stateless
- Cacheable
- Layered system
- Code on demand (optional)
Uniform interface
일관된 인터페이스를 지키기 위해 4가지의 제약조건을 만족해야한다.
- Identification of resources
- Manipulation of resources through representations
- Self-descriptive messages
- Hypermedia as the engine of application state(HATEOAS)
Idenditication of resources는 인터페이스가 클라이언트와 서버간의 상호작용에 관련된 각각의 리소스를 고유하게 식별해야 함을 의미한다.
Manipulation of resources through representations는 자원들은 일관된 표현을 가져야 하며, API사용자들은 이 표현들을 이용해서 서버의 자원상태를 조작하는 것을 의미한다.
여기서는 요청을 할 때에 특정 자원을 조작할 때 어떤 타입인지 등 충분한 정보를 알려주어야 함을 의미한다.
Self-descriptive messages는 모든 요청들이 처리 되는 과정에 대해 충분한 정보를 포함해야 함을 의미한다.
특정 자원에 대해 어떠한 파서를 호출할 것인지 등을 의마한다.
Hypermedia as the engine of appication state는 클라이언트가 처음 URI만 알고 있으면 클라이언트 앱에서 하이퍼링크를 이용해 동적으로 탐색이 가능하게끔 하는 것을 의미한다. 이 부분은 rest api를 공부하려고 검색을 할 때 대부분의 포스트에서 고려되지 않았다는 걸 알게 되었다.
아래는 위키피디아의 예시이다.
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 100.00
},
"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers",
"close-requests": "/accounts/12345/close-requests"
}
}
}
응답에서 입금, 출금, 송금 등에 대한 링크를 보내어서 클라이언트가 응답만으로 다른 주소들을 알 수 있기 때문에 초기의 주소만 알아도 계속해서 탐색이 가능하다.
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": -25.00
},
"links": {
"deposits": "/accounts/12345/deposits"
}
}
}
여기서는 입금만이 가능한데, 잘 보면 현재 잔액이 음수이기 때문에 출금 등의 옵션이 주어지지 않았다.
Client - server
클라이언트 - 서버 디자인은 관심사 분리(SoC)를 강제합니다. 따라서 서버와 클라이언트의 구성요소들은 서로에게 영향을 주지 않습니다. 이를 통해 유저 인터페이스를 여러 플랫폼 간 쉽게 이식이 되게끔 만들 수 있게 되고, 서버에서는 확장가능할 수 있게끔 해줍니다.
Stateless
stateless는 클라이언트가 서버로 요청을 보낼 때 항상 필요한 모든 정보를 포함해서 보내게끔 강제한다. 서버는 서버쪽에 아무런 클라이언트의 상태를 저장하지 않아서, 전의 요청에서 정보를 가져와서 활용하지 않는다.
Cacheable
rest api는 응답이 캐시 가능하다면 그에 대한 표시를 명시적이든 묵시적이든 무조건 해야한다.
Layered system
클라이언트는 엔드서버에 연결되어 있는지 혹은 중간에 연결되어 있는지 알지 못한다. 프록시 혹은 로드밸런서가 연결 중간에 위치하여도 소통에 아무런 영향이 없어야 한다.
Code on demand (optional)
앱릿 혹은 스크립트 형태의 코드를 다운로드, 실행하여 클라이언트의 기능을 확장하거나 커스터마이즈하는 것을 의미한다.
표준 x
Rest api는 soap과 다르게 프로토콜이 아니라 표준이 존재하지 않는다. rest한 아키텍처 스타일이기 때문이다. 따라서 다양한 형태의 구현이 존재할 수 있다.