본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[책 정리] 24. 부분적 경계 - Clean Architecture

by 돼지왕 왕돼지 2022. 11. 5.
반응형

 

-

아키텍처 경계를 완벽하게 만드는 데는 비용이 많이 든다.

쌍방향의 다형적 Boundary 인터페이스, Input 과 Output 을 위한 데이터 구조를 만들어야 할 뿐만 아니라, 두 영역을 독립적으로 컴파일하고 배포할 수 있는 컴포넌트로 격리하는 데 필요한 모든 의존성을 관리해야 한다.

이렇게 만들려면 엄청난 노력을 기울여야 하고, 유지하는 데도 또 엄청난 노력이 든다.

 

 

 

마지막 단계를 건너뛰기

 

-

부분적 경계를 생성하는 방법 하나는 독립적으로 컴파일하고 배포할 수 있는 컴포넌트를 만들기 위한 작업은 모두 수행한 후, 단일 컴포넌트에 그대로 모아만 두는 것이다.

쌍방향 인터페이스도 그 컴포넌트에 있고, 입력, 출력 데이터 구조도 거기에 있으며, 모든 것이 완전히 준비되어 있다.

하지만 이 모두를 단일 컴포넌트로 컴파일해서 배포한다.

 

이처럼 부분적 경계를 만들려면 완벽한 경계를 만들 때만큼의 코드량과 사전 설계가 필요하다.

하지만 다수의 컴포넌트를 관리하는 작업을 하지 않아도 된다.

추적을 위한 버전 번호도 없으며, 배포 관리 부담도 없다.

이 차이는 가볍지 않다.

 

 

 

일차원 경계

 

-

완벽한 형태의 아키텍처 경계는 양방향으로 격리된 상태를 유지해야 하므로 쌍방향 Boundary 인터페이스를 사용한다.

양방향으로 격리된 상태를 유지하려면 초기 설정할 때나 지속적으로 유지할 때도 비용이 많이 든다.

 

 

-

추후 완벽한 형태의 경계로 확장할 수 있는 공간을 확보하고자 할 때 활용할 수 있는 더 간단한 구조는 전통적인 전략 패턴(Strategy pattern)을 사용하는 것이다.

 

 

 

퍼사드

 

-

훨씬 더 단순한 경계는 퍼사드(Facade)패턴이다.

이 경우에는 심지어 의존성 역전까지도 희생한다.

경계는 Facade 클래스로만 간단히 정의된다.

Facade 클래스에는 모든 서비스 클래스를 메서드 형태로 정의하고, 서비스 호출이 발생하면 해당 서비스 클래스로 호출을 전달한다.

클라이언트는 이들 서비스 클래스에 직접 접근할 수 없다.

 

여기서 Client 가 모든 서비스 클래스에 대해 추이 종속성을 갖는다는 것도 주목해야 한다.

 

 

 

결론

 

-

아키텍처 경계를 부분적으로 구현하는 세 가지 방법을 알아봤다.

1. 설계는 제대로 하되 모듈 분리는 하지 않기

2. 전략 패턴과 같이 일차원 경계 만들기

3. 퍼사드 클래스로 경계 만들기

 

이 외에도 방법은 많다.

 

 

-

각각의 접근법은 나름의 비용과 장점을 지닌다.

아키텍처 경계가 언제, 어디에 존재해야 할지, 그리고 그 경계를 완벽하게 구현할지 아니면 부분적으로 구현할지를 결정하는 일 또한 아키텍트의 역할이다.

 

 

반응형

댓글