본문 바로가기
Concepts/SW Architecture

아키텍처 - 정책과 수준

by ocwokocw 2021. 2. 10.

- 이 글은 로버트 C.마틴의 Clean Architecture를 기반으로 작성되었습니다. (가능하면 책을 읽어보는것을 추천한다.)

- 개요

소프트웨어 시스템 및 아키텍처를 정책이라는 관점에서 무엇인지 생각해보고, 여태까지 살펴보았던 내용을 돌이켜보자.

소프트웨어 시스템이란 입력을 출력으로 변환하는 과정의 정책을 상세하게 기술한것이다. 또한 하나의 큰 정책은 작은 여러 정책으로 나누어지며 아키텍처라는것은 이런 정책을 분리 및 재배치 한다.

 

같은 시점에 같은 이유로 변경되는 것들을 하나의 컴포넌트로 모으고, 다른 시점에 다른 이유로 변경된다면 분리한다.

하나의 컴포넌트는 다른 컴포넌트에 의존한다. 컴포넌트를 정점으로, 의존성을 방향이 있는 간선으로 본다면 방향그래프로 나타낼 수 있다. 이 때 비순환이 되도록 하는것(순환되는 부분이 없도록 하는것)이 중요하다.

 

의존성이란 소스코드, 컴파일타임의 의존성이다. Java 에서는 import 구문에 해당한다. 좋은 아키텍처는 설계는 저수준의 컴포넌트가 고수준의 컴포넌트에 하는 설계이다.


- 수준

여기서 말하는 수준이란 무엇일까? 수준이란 입력과 출력까지의 거리다. 입력과 출력 모두로 부터 멀어질수록 정책의 수준이 높아진다.

 

우리는 앞의 글들에서 업무규칙이 핵심가치이며, 고수준의 컴포넌라고 하였다. 웹에서 입력 폼에 따라 입력을 하고 저장요청을 한다. 이 데이터는 특정한 업무규칙에 따라 가공되어 저장된다. 또한 저장된 데이터를 조회한다. 여기서 업무규칙은 입력 및 출력과 거리가 멀어 고수준의 컴포넌트가 되며, 입력과 출력은 저수준의 컴포넌트이다.

 

아래 다이어 그림을 보자. 어떤 판매정보로 부터 데이터 마이닝을 통해 유의미한 통계보고서를 보고 싶다고 가정하자. 프로그램의 흐름은 판매정보 -> Analyzer -> 통계 순서로 흐른다.

 

판매정보가 입력이라면 Analyzer는 업무규칙이며, 통계보고서는 출력이다. 입출력의 거리관점으로 볼 때, Analyzer는 고수준의 컴포넌이며, 나머지는 저수준의 컴포넌트가 된다.

 

여기서 의존성으로 표시된 화살표 방향을 유심히 보자. 소스코드 의존성은 흐름기준이 아니라 수준에 따라 의존하고 있다.

아래 다이어그램은 위의 그림을 더 자세히 표현한것이다. 고수준의 Analyzer 컴포넌트를 저수준의 컴포넌트로 부터 분리시켰다. 물론 Domestic Sales History가 완벽한 저수준의 입력 컴포넌트라고 하기엔 애매하지만, 상대적으로 Analyzer가 고수준의 컴포넌트이다. Domestic Sales History과 Report 가 변경 되더라도 Analyzer는 영향을 받지 않는다.

 

Domestic Sales History, Report, Analyzer 컴포넌트는 단일 책임 원칙(SRP) 와 공통 폐쇄 원칙(CCP)에 따라 동일한 시점에 동일한 이유로 변경되는 정책을 한데 묶은것이다.

 

저수준인 Domestic Sales History과 Report는 Analyzer를 알 고 있지만, 고수준인 Analyzer는 두 컴포넌트를 알지 못한다.


- 결론

위의 설명은 SRP(단일 책임 원칙), OCP(개방 폐쇄 원칙), CCP(공통 폐쇄 원칙), DIP(의존성 역전 원칙), SDP(안정된 의존성 원칙), SAP(안정된 추상화 원칙)을 모두 포함한다.

  • SRP: 동일시점 동일이유로 변경되는 것들을 컴포넌트 단위로 분리하였다.
  • OCP: 저수준의 컴포넌트가 고수준의 컴포넌트에 의존함으로써 확장에 열려있고 변경에는 닫혀있다. Monthly Report 이외에 추가적인 Report View를 추가할 시 Report Writer 인터페이스를 구현하는 컴포넌트를 하나만 더 추가하면 된다.
  • CCP: SRP를 컴포넌트 단위로 확장하였다.
  • DIP: 프로그램의 흐름대로 구현하면 Analyzer가 Report에 의존(사용)해야 하지만 인터페이스를 통해 의존성을 역전시켰다.
  • SDP: 만약 프로그램 흐름대로 판매정보 -> Analyzer -> 통계 순으로 의존한다면, 판매정보(I = 1) -> Analyzer(I = 1/2) -> 통계(I = 1)이 되어 의존하는쪽의 불안정성이 더 커진다. 그러나 의존성의 화살표 방향대로면 Domestic Sales History(I = 1) 과 Monthly Report (I = 1) 이 Analyzer (I = 0) 에 의존하게 되어 안정된쪽에 의존하는 원칙을 만족하게 된다. 불안정성(I) 계산하는 방법은 블로그를 참조하라. ocwokocw.tistory.com/37

 

댓글