본문 바로가기

책터디/클린 아키텍처

02. 의존성 역전하기

단일 책임 원칙

컴포넌트를 변경하는 이유는 오직 하나뿐이여야 한다.

 

'책임' 은 사실 '오로지 한 가지 일만 하는 것' 보다는 '변경할 이유' 로 해석해야 한다.

 

의존성 역전 원칙

계층형 아키텍처에서 계층 간 의존성은 항상 다음 계층인 아래 방향을 가리킨다.

단일 책임 원칙을 적용할 때 상위 계층들이 하위 계층들에 비해 변경할 이유가 더 많다.

그러므로 영속성 계층에 대한 도메인 계층의 의존성 때문에 영속성 계층을 변경할 때마다 잠재적으로 도메인 계층도 변경해야 한다.

그러나 도메인 코드는 애플리케이션에서 가장 중요한 코드다. 영속성 코드가 바뀐다고 해서 도메인 코드까지 바꾸고 싶지는 않다.

그러면 어떻게 의존성을 제거할 것인가?

 

의존성 역전 원칙 (Dependency Inversion Principle, DIP)
코드상의 어떤 의존성이든 그 방향을 바꿀 수(역전시킬 수) 있다.

 

도메인 계층에 리포지토리에 대한 인터페이스를 만들고, 실제 리포지토리는 영속성에서 구현하게 하는 것이다.

 

클린 아키텍처

도메인 코드가 바깥으로 향하는 어떤 의존성도 없어야 함을 의미한다. 대신 의존성 역전 원칙의 도움으로 모든 의존성이 도메인 코드를 향하고 있다.

도메인 코드에서는 어떤 영속성 프레임워크나 UI프레임워크가 사용되는지 알 수 없기 때문에 특정 프레임워크에 특화된 코드를 가질 수 없고 비즈니스 규칙에 집중할 수 있다.

그래서 도메인 코드를 자유롭게 모델링할 수 있다.

 

육각형 아키텍처(핵사고날 아키텍처)

육각형 바깥에는 애플리케이션과 상호작용하는 다양한 어댑터들이 있다.

  • 왼쪽에 있는 어댑터들은 (애플리케이션 코어를 호출하기 때문에) 애플리케이션을 주도하는 어댑터들이다.
  • 오른쪽에 있는 어댑터들은 (애플리케이션 코어에 의해 호출되기 때문에) 애플리케이션에 의해 주도되는 어댑터들이다.

 

애플리케이션 코어와 어댑터들 간의 통신이 가능하려면 애플리케이션 코어가 각각의 포트를 제공해야한다.

  • 주도하는 어댑터에게는 그러한 포트가 코어에 있는 유스케이스 클래스들에 의해 구현되고 호출되는 인터페이그가 된다.
  • 주도되는 어댑터에게는 그러한 포트가 어댑터에 의해 구현되고 코어에 의해 호출되는 인터페이스가 된다.

포트와 어댑터(ports-and-adapters) 아키텍처로 알려져 있다.

'책터디 > 클린 아키텍처' 카테고리의 다른 글

03. 코드 구성하기  (0) 2022.03.20