소프트웨어 아키텍처는 선을 긋는 기술이다.
- 경계 boundary
- 경계는 소프트웨어 요소를 서로 분리한다.
- 아키텍트의 목표는 필요한 시스템을 만들고 유지하는 데 드는 인적 자원을 최소화하는 것.
- 인적 자원의 효율을 떨어뜨리는 요인은?
- 결합. - 특히 너무 일찍 내려진 결정에 따른 결합.
- 이른 결정
- 시스템의 요구사항과 아무런 관련이 없는 결정.
- 프레임워크, 데이터베이스, 웹 서버, 유틸리티 라이브러리, 의존성 주입에 대한 결정 등
- 좋은 시스템 아키텍처는 이런 결정에 의존하지 않음.
- 좋은 시스템 아키텍처는 이러한 결정을 가능한 한 최후의 순간에 내릴 수 있게 해줌.
- 결정에 따른 영향이 크지 않게 만듦.
어떻게 선을 그을까? 그리고 언제 그을까?
선을 그어서 시스템 요구사항과 관련이 없는 사항들은 나중에 결정한다.
관련이 있는 것과 없는 것 사이에 선을 긋는다.
- 데이터 베이스
- 업무 규칙이 알아야 할 것은 데이터를 가져오고 저장할 때 사용할 수 있는 함수 집합이 있다는 사실이 전부다.
- 이러한 함수 집합을 통해 데이터베이스를 인터페이스 뒤로 숨길 수 있다.
- 아래의 이미지에서 경계선은 어디에 그어야 할까.
- 경계선은 상속 관계를 횡단하면서 Database Interface 바로 아래에 그려 진다.
- 조금 물러나서 컴포넌트를 한 번 살펴보자.
- Database컴포넌트가 Business Rules를 향하도록 만들어 졌고, 두 컴포넌트 사이에 경계선이 있다.
- → 어떤 종류의 데이터베이스도 사용할 수 있음을 알 수 있다.
- → 이 같은 사실은 데이터베이스에 대한 결정을 연기할 수 있다.
- → 데이터베이스를 결정하기에 앞서 업무 규칙을 먼저 작성하고 테스트하는 데 집중할 수 있음을 의미한다.



플러그인 아키텍처
- 위의 데이터베이스 컴포넌트에 대해 내린 결정은 서드파티 플러그인을 사용할 수 있게 한 그 패턴이다.
- 사실 소프트웨어 개발 기술의 역사는 플러그인을 손쉽게 생성하여 확장 가능하며 유지보수가 쉬운 시스템 아키텍처를 확립할 수 있게 만드는 방법에 대한 이야기다.

결론
- 소프트웨어 아키텍처에서 경계선을 그리려면 먼저 시스템을 컴포넌트 단위로 분할해야 함.
- 일부 컴포넌트는 핵심 업무 규칙
- 나머지 컴포넌트는 플러그인.
- 컴포넌트 사이의 화살표가 핵심 업무를 향하도록 컴포넌트 소스를 배치한다.
- 의존성 화살표는 저수준 세부사항에서 고수준의 추상화를 향하도록 배치된다.