소프트웨어 시스템이란 정책을 기술한 것이다. 소프트웨어 아키텍처에는 이러한 정책을 분리하고 재편성하는 일도 포함된다.
아키텍처 개발은 컴포넌트들을 재편성할 때 비순환 방향 그래프로 구성하는 기술을 포함한다.
정점 : 동일한 수전의 정책을 포함하는 컴포넌트
간선 : 컴포넌트 사이의 의존성
⇒ 좋은 아키텍처는 저수준의 컴포넌트가 고수준 컴포넌트에 의존하도록 설계해야 한다.
수준
수준 : 입력과 출력까지의 거리
입력과 출력에 가까울 수록 저수준, 멀수록 고수준
번역 컴포넌트는 입력과 출력에서 가장 멀리 있어서 최고 수준의 컴포넌트이다.
데이터 흐름 : 문자읽기 → 번약 → 문자 쓰기
소스 코드 의존성 : 경계 안쪽으로 향한다.
데이터 흐름과 소스 코드 의존성이 항상 같은 방향을 가리키지 않는다.
소스 코드 의존성은 그 수준에 따라 결합되어야 하며, 데이터 흐름을 기준으로 결합되어서는 안 된다.
ConsoleReader, ConsoleWriter 입력과 출력에 가깝기 때문에 저수준이다.
암호화 / 입력, 출력 분리 → 암호화 정책을 더 넓은 맥락에서 사용할 수 있다.
정책이 변경되는 방식에 따라 컴포넌트로 묶는다.
(고수준 정책은 더 중요한 이유로 덜 빈번하게 변경된다.)
모든 소스 코드 의존성의 방향이 고수준 정책을 향할 수 있도록 정책을 분리했다면 변경의 영향도를 줄일 수 있다.
⇒ 저수준의 컴포넌트가 고수준 컴포넌트에 플러그인 되어야 한다는 관점으로 볼 수 있음