clean-architecture

27. ‘크고 작은 모든’ 서비스들

서비스 지향 ‘아키텍처’와 마이크로 서비스 ‘아키텍처’는 최근에 큰 인기를 끌고 있다.

서비스 아키텍처?


시스템의 아키텍처는 의존성 규칙을 준수하며 고수준의 정책을 저수준의 세부사항으로부터 분리하는 경계에 의해 정의된다.

기능을 프로세스나 플랫폼에 독립적이 되게끔 서비스들을 생성하면 의존성 규칙 준수 여부와 상관없이 큰 도움이 될 때가 많다.

함수들의 구성 형태도 이와 비슷하다.

모노리틱 시스템이나 컴포넌트 기반 시스템에서 아키텍처를 정의하는 요소는 바로 의존성 규칙을 따르며 아키텍처 경계를 넘나드는 함수 호출들이다.

서비스는 프로세스나 플랫폼 경계를 가로지르는 함수 호출에 지나지 않는다.

서비스의 이점?


결합 분리의 오류

개발 및 배포 독립성의 오류

야옹이 문제


택시 통합 시스템

이 서비스들은 모두 결합되어 있어서 독립적으로 개발하고, 배포하거나, 유지될 수 없다.

⇒ 이게 바로 횡단 관심사가 지닌 문제다.

모든 소프트웨어 시스템은 서비스 지향이든 아니든 이 문제에 직면하게 마련이다.

객체가 구출하다


컴포넌트 기반 아키텍처에서는 이 문제를 어떻게 해결했나?

SOLID 설계 원칙을 잘 들여다보면 다형적으로 확장할 수 있는 클래스 집합을 생성해 새로운 기능을 처리하도록 함을 알 수 있다.

배차에 특화된 로직 Rides 컴포넌트와 야옹이에 대한 신규 기능은 Kittens 컴포넌트에 들어갔을 경우 이 두 컴포넌트는 기존 컴포넌트들에 있는 추상 기반 클래스를 템플릿 메서드나 전략 패턴 등을 이용해서 오버라이드 한다.

컴포넌트 기반 서비스


서비스가 반드시 소규모 단일체여야 할 이유는 없다.

서비스는 SOLID원칙대로 설계할 수 있으며 컴포넌트 구조를 갖출수도 있다.

자바의 경우 새로운 기능 배포는 기존 서비스의 jar파일을 재배포하는 문제가 아니라, 서비스를 로드하는 경로에 단순히 새로운 jar파일을 추가하는 문제가 된다.

횡단 관심사


아키텍처 경계가 서비스 사이에 있지 않다는 사실을 알 수 있었다.

오히려 서비스를 관통하며, 서비스를 컴포넌트 단위로 분할한다.

서비스 내부는 의존성 규칙도 준수하는 컴포넌트 아키텍처로 설계해야 한다.

아키텍처 경계를 정의하는 것은 서비스 내에 위치한 컴포넌트다.

결론