2023년 11월 28일 작성

Clean Architecture - 부분적 경계

Architecture 경계를 부분적으로 구현하여, 경계 구축에 대한 비용을 줄이면서 필요한 만큼의 경계만 만들 수 있습니다.

Partial Boundary : 경계를 부분적으로 구축하기

  • architecture 경계를 완벽하게 만드는 데는 비용이 많이 들며, 유지하는 데에도 많은 노력이 필요합니다.
    • 쌍방향의 다형적 boundary interface, Input과 Output을 위한 데이터 구조를 만들어야 합니다.
    • 또한 두 영역을 독립적으로 compile하고 배포할 수 있는 component로 격리하는 데에 필요한 모든 의존성을 관리해야 합니다.
  • 그럼에도 architecture의 선행적인 설계가 필요할지도 모르겠다는 생각이 든다면, 부분적 경계(partial boundary)를 구현해 볼 수 있습니다.
    • 무조건 원칙에 맞추어 양방향 interface를 만들어서 경계를 완벽하게 구분해야 하는 것은 아닙니다.
    • 상황에 맞추어 architecture 경계가 언제, 어디에 존재해야 할지, 그 경계를 완벽하게 혹은 부분적으로 구현할지를 결정해야 합니다.

부분적 경계를 구현하는 3가지 방법

  • architecture 경계를 부분적으로 구현하는 간단한 3가지 방법이 있습니다.
  • 부분적 경계를 구현할 수 있는 방법은 더 다양하며, 3가지는 순전히 예시입니다.

1. 단일 배포

  • 단일 배포는 source code에서는 완벽한 경계를 구현하지만, 단일 component로 compile해서 배포하는 것입니다.
    • 독립적으로 compile 및 배포가 가능한 component로 만들고, 단일 component에 그대로 모아둡니다.
  • 이렇게 하면 code는 간단해지지 않지만, component 간 의존성 관리와 version 관리를 하지 않아도 됩니다.

2. 일차원 경계

  • 양방향 boundary interface가 아닌 한방향만 경계를 interface로 격리합니다.
    • Web application을 구축하는 데에 사용하는 Spring framework의 Controller, Service의 전형적인 구조와 닮아 있습니다.
  • 일차원 경계는 추후 완벽한 경계를 구축해야 하는 상황에 대비를 하면서, 당장 경계도 구분할 수 있는 간단한 구조의 구현 방식입니다.

  • 일차원 경계 구조는 Client로 부터 ServiceImpl을 분리합니다.
    • 다만, Danger라고 표시되어 있는 점선 화살표와 같은 의존성을 사용하지 않도록 유의해야 합니다.
classDiagram

class Client
class ServiceImpl
class ServiceBoundary {
    <<interface>>
}

Client ..> ServiceBoundary
Client <.. ServiceImpl : Danger
ServiceBoundary <|.. ServiceImpl

3. Facade

  • Facade 자체가 경계가 되는, 일차원 경계보다 더 간단한 전략입니다.
    • Facade class에 모든 service class를 method 형태로 정의하고, 호출이 발생하면 해당 service class로 전달합니다.
    • ClientService1, Service2에 직접 접근할 수 없고, Facade class를 이용해 Service1, Service2의 method를 호출합니다.
  • 이런 의존성 구조에서 ClientService1, Service2에 대해 추이 종속성을 가지게 됩니다.
  • 또한 개발자가 마음만 먹으면, 일차원 경계보다 더 위험한 의존성을 사용할 수도 있습니다.
classDiagram

class Client
class Facade
class Service1
class Service2

Client ..> Facade
Facade ..> Service1
Facade ..> Service2

Reference


목차