기술 노트/웹

[웹을 지탱하는 기술] REST 웹의 아키텍처 스타일 - 02

Benn.dev 2021. 4. 17. 20:42

스타일을 조합하여 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가지를 조합한 아키텍처 스타일을 가리킨다.

클라이언트/서버 유저 인터페이스와 처리를 분리한다.
스테이트리스 서버 서버 측에서 애플리케이션의 상태를 가지지 않는다.
캐시 클라이언트와 서버의 통신횟수와 양을 감소시킨다.
유니폼 인터페이스 인터페이스를 고정한다.
계층화 시스템 시스템을 계층별로 분리한다.
코드 온 디맨드 프로그램을 클라이언트에 다운로드하여 실행한다.