본문 바로가기
SW

클린 아키텍처:소프트웨어 구조와 설계의 원칙(Clean Architecture) - 5부 : 아키텍처 (22장)

by 라꾸스떼(YR) 2020. 3. 16.
반응형

[22장] 클린 아키텍처

-육각형 아키텍처(Hexagonal Architecture) : 포트와 어댑터(Ports and Adapters) - 테스트 주도 개발로 배우는 객체 지향 설계와 실천

-DCI(Data, Context, and Interaction)

-BCD(Boundary-Control-Entity: Object Oriented Software Engineering

이들의 목표는 모두 같은데, 바로 관심사의 분리(separation of concerns)다. 이들은 모두 소프트웨어를 계층으로 분리함으로써 관심사의 분리라는 목표를 달성할 수 있었다. 각 아키텍처는 최소한 업무 규칙을 위한 계층 하나와, 사용자와 시스템 인터페이스를 위한 또 다른 계층 하나를 반드시 포함한다.

이들 아키텍처는 모두 시스템이 다음과 같은 특징을 지니도록 만든다.

-프레임워크 독립성

-테스트 용이성

-UI 독립성

-데이터베이스 독립성

-모든 외부 에이전시에 대한 독립성, 실제로 업무 규칙은 외부 세계와의 인터페이스에 대해 전혀 알지 못한다.

 

[의존성 규칙]

보통 안으로 들어갈수록 고수준의 소프트ㅜ에어가 된다. 바깥쪽 원은 메커니즘이고, 안쪽 원은 정책이다.

의존성 규칙(Dependency Rule) : 소스 코드 의존성은 반드시 안쪽으로, 고수준의 정책을 향해야 한다.

내부의 원에 속한 요소는 외부의 원에 속한 어떤 것도 알지 못한다. 같은 이유로, 외부의 원에 선언된 데이터 형식도 내부의 원에서 절대로 사용해서는 안 된다. 우리는 외부 원에 위치한 어떤 것도 내부의 원에 영향을 주지 않기를 바란다.

 

[엔티티]

엔티티는 전사적인 핵심 업무 규칙을 캡슐화한다. 엔티티는 메서드를 가지는 객체이거나 일련의 데이터 구조와 함수의 집합일 수도 있다. 엔티티는 가장 일반적이며 고수준인 규칙을 캡슐화한다.

 

[유스케이스]

유스케이스 계층의 소프트웨어는 애플리케이션에 특화된 업무 규칙을 포함한다. 또한 유스케이스 계층의 소프트웨어는 시스템의 모든 유스케이스를 캡슐화하고 구현한다. 유스케이스는 엔티티로 들어오고 나가는 데이터 흐름을 조정하며, 엔티티가 자신의 핵심 업무 규칙을 사용해서 유스케이스의 목적을 달성하도록 이끈다. 이 계층에서 발생한 변경이 엔티티에 영향을 줘서는 안 된다.

 

[인터페이스 어댑터]

인터페이스 어댑터(Interface Adaptor) 계층은 일련의 어댑터들로 구성된다. 어댑터는 데이터를 유스케이스와 엔티티에게 가장 편리한 형식에서 데이터베이스나 웹 같은 외부 에이전시에게 가장 편리한 형식으로 변환한다. 이 계층은, 예를 들어 GUI의 MVC 아키텍처를 모두 포괄한다. 프레젠터(Presenter), 뷰(View), 컨트롤러(Controller)는 모두 인터페이스 어댑터 계층에 속한다.

 

[프레임워크와 드라이버]

프레임워크와 드라이버 계층은 모든 세부사항이 위치하는 곳이다.

 

[원은 네 개여야만 하나?]

항상 네 개만 사용해야 한다는 규칙은 없다. 하지만 어떤 경우에도 의존성 규칙은 적용된다. 소스 코드 의존성은 항상 안쪽을 향한다. 안쪽으로 이동할수록 추상화와 정책의 수준은 높아진다. 가장 바깥쪽 원은 저수준의 구체적인 세부사항으로 구성된다.

 

[경계 횡단하기]

제어흐름은 컨트롤러에서 시작해서, 유스케이스를 지난 후, 프레젠터에서 실행되면서 마무리된다.

의존성 역전 원칙 - 유스케에스에서 프레젠터를 호출해야 한다고 가정해 보자. 이때 직접 호출해서는 안 되는데, 직접 호출해 버리면 의존성 규칙을 위배하기 때문이다. 따라서 우리는 유스케이스가 내부 원의 인터페이스를 호출하도록 하고, 외부 원의 프레젠터가 그 인터페이스를 구현하도록 만든다.

 

[경계를 횡단하는 데이터는 어떤 모습인가]

경계를 가로질러 데이터를 전달할 때, 데이터는 항상 내부의 원에서 사용하기에 가장 편리한 형태를 가져야만 한다.

 

[전형적인 시나리오]

의존성의 방향에 주목하라. 모든 의존성은 경계선을 안쪽으로 가로지르며, 따라서 의존성 규칙을 준수한다.

 

[결론]

소프트웨어를 게층으로 분리하고 의존성 규칙을 준수한다면 본질적으로 테스트하기 쉬운 시스템을 만들게 될 것이다.

반응형

댓글