스타일을 조합하여 REST를 구성
REST는 복수의 아키텍처 스타일을 조합하여 구축한 복합 아키텍처 스타일이다.
클라이언트/서버
웹은 HTTP라는 프로토콜을 이용해 클라이언트와 서버가 서로 통신하는 클라이언트/서버의 아키텍처 스타일을 채용하고 있다.
즉, 클라이언트가 서버에 요청(Request)을 보내면, 서버는 클라이언트에 대해 응답(Response)을 돌려준다.
클라이언트/서버의 이점은 단일 컴퓨터 상에서 모든 것을 처리하는 것이 아니라, 클라이언트와 서버로 분리해서 처리할 수 있다는 점이다.
이렇게 되면, 클라이언트를 멀티 플랫폼으로 구성할 수 있다. (웹이 PC, 스마트폰, etc Device를 통해 접속 할 수 있는 것이 예이다.)
또한, 유저 인터페이스는 클라이언트에서 담당하기 때문에 서버는 데이터 스토리지로서의 기능만을 제공하면 된다.
더불어 복수의 서버를 조합해 확장함으로써 가용성을 올릴 수 있다.
스테이트리스 서버(Stateless Server)
말그대로 상태가 없는 서버, 즉 클라이언트의 애플리케이션 상태를 서버에서 관리하지 않는다는 것을 의미한다.
서버 측의 구현을 간략화 할 수 있다는 장점이 있다.
클라이언트로부터의 요청에 응답한 뒤 바로 서버의 자원을 해체할 수 있다.
하지만 현실적으론 스테이트리스가 아닌 웹 서비스와 웹 API가 많이 있다.
특히, HTTP를 스테이트풀(Stateful)하게 만드는 대표적인 것은 쿠키(Cookie)를 사용한 세션 관리가 있다.
클라이언트/서버에 스테이트리스성을 토입하면 아키텍처 스타일은 '클라이언트/스테이트리스(Client Stateless Server, CSS)'가 된다.
캐시(Cache)
캐시란, 리소스의 신선도에 기초해 한번 가져온 리소스를 클라이언트 쪽에서 돌려쓰는 방식이다.
장점은 서버와 클라이언트 사이의 통신량을 줄여서 네트워크 대역의 이용과 처리시간을 축소하고, 더욱 효율적으로 처리할 수 있다는 것이다.
단, 오래된 캐시를 이용해 정보의 신뢰성이 떨어질 가능성도 있다.
캐시를 추가한 아키텍처 스타일을 '클라이언트/캐시/스테이트리스 서버(Client Cache Stateless Server, C$SS)'라고 부른다.
유니폼 인터페이스(Uniform Interface)
유니폼 인터페이스는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말한다.
예를들어, HTTP 1.1에서는 GET, POST 등 8개의 메서드만 정의되어 있고, 보통은 이 이상 늘어나지 않는다.
메서드가 8개로 고정되어 엄격한 제약으로 보이지만, 인터페이스의 유연성에 제약을 가함으로써 클라이언트와 서버 구현의 중립성이 향상된다.
유니폼 인터페이스는 REST를 가장 특징짓는 아키텍처 스타일이다.
유니폼 인터페이스를 추가한 아키텍처 스타일을 '유니폼/클라이언트/캐시/스테이트리스 서버(Uniform Client Cache Stateless Server, UC$SS)'라고 한다.
계층화 시스템
유니폼 인터페이스의 이점 가운데 하나로, 시스템 전체를 계층화하기 쉽다는 점을 들 수 있다.
예를 들어, 웹 서비스에서는 서버와 클라이언트 간의 로드 밸런서(Load Balancer)를 설치해 부하를 분산시키거나, 프록시(Proxy)를 설치해 엑세스를 제어한다.
클라이언트 측에서 보면, 서버나 프록시 모두 동일한 인터페이스로 접속할 수 있기 때문에 접속할 곳이 서버에서 프록시로 바뀐 것을 신경 쓸 필요가 없다.
이는 서버와 프록시 등 각 컴포넌트 간의 인터페이스를 HTTP로 통일하고 있기에 실현될 수 있다.
또한, HTTP의 인터페이스를 구현하지 않는 시스템에서도 레거시 시스템 앞단에 웹 애플리케이션 서버를 끼워 넣고 HTTP의 인터페이스를 가지게 함으로써, 브라우저 등의 클라이언트와 접속할 수 있게 된다.
이와 같이 시스템을 몇개의 계층으로 분리하는 아키텍처 스타일을 계층화 시스템(Layered System)이라고 한다.
계층화 시스템을 추가한 아키텍처 스타일을 '유니폼/계층화/클라이언트/캐시/스테이트리스 서버(Uniform Client Cache Stateless Server, ULC$SS)'라고 부른다.
코드 온 디맨드(Code on Demand)
프로그램 코드를 서버에서 다운받아 클라이언트에서 실행하는 아키텍처 스타일이다.
예를 들어 JavaScript, Java 애플릿 등이 있다.
클라이언트를 차후에 확장할 수 있다는 장점이 있다.
하지만, 네트워크 통신에서의 프로토콜 가시성이 저하된다는 결점이 있다.
HTTP라는 애플리케이션 프로토콜에 따라 통신하고 있는 동안은 통신의 의미와 접근할 리소스가 명백하다.
그러나 코드 온 디맨드로 프로그램을 다운로드하여 클라이언트에서 실행해 버리면 애플리케이션 프로토콜의 가시성은 저하된다.
코드 온 디맨드를 추가한 아키텍처 스타일을 '유니폼/계층화/코드 온 디맨드/클라이언트/캐시/스테이트리스 서버(Uniform Layered Code on Demand Client Cache Stateless Server, ULCODC$SS)'라고 한다.
REST = ULCODE$SS
REST란 아래 6가지를 조합한 아키텍처 스타일을 가리킨다.
클라이언트/서버 | 유저 인터페이스와 처리를 분리한다. |
스테이트리스 서버 | 서버 측에서 애플리케이션의 상태를 가지지 않는다. |
캐시 | 클라이언트와 서버의 통신횟수와 양을 감소시킨다. |
유니폼 인터페이스 | 인터페이스를 고정한다. |
계층화 시스템 | 시스템을 계층별로 분리한다. |
코드 온 디맨드 | 프로그램을 클라이언트에 다운로드하여 실행한다. |
'기술 노트 > 웹' 카테고리의 다른 글
[웹을 지탱하는 기술] URI의 스펙 (0) | 2021.04.28 |
---|---|
[웹을 지탱하는 기술] REST 웹의 아키텍처 스타일 - 03 (0) | 2021.04.17 |
[웹을 지탱하는 기술] REST 웹의 아키텍처 스타일 - 01 (0) | 2021.04.17 |
[웹을 지탱하는 기술] 웹이란 무엇인가? (0) | 2021.04.17 |