📖 [16장] 독립성
📘 클린 아키텍처 북스터디 정리입니다
📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장
✅ 핵심 요약 (Key Takeaways)
이 장의 핵심 문장은?
좋은 아키텍처는 선택사항을 열어 둠으로써,
향후 시스템에 변경이 필요할 때 어떤 방향으로든 쉽게 변경할 수 있도록 한다
저자가 전달하고자 하는 메세지 요약
- 좋은 아키텍처는 4개의 관심사(유스케이스, 운영, 개발, 배포)를 지원해야 함
- 각각의 관심사 간 균형을 맞추고 각 관심사 모두를 만족시키면 좋겠지만 현실상 어려움
- 따라서 아키텍처는 선택사항을 열어두어 향후 변경이 필요할 때 쉽게 변경할 수 있도록 해야 함
💡 내용 정리
서론
좋은 아키텍처는 다음을 지원해야 함
- 시스템의 유스케이스
- 시스템의 운영
- 시스템의 개발
- 시스템의 배포
1. 좋은 아키텍처가 지원해야 하는 관심사들
유스케이스
- 시스템의 아키텍처는 시스템의 의도를 지원해야 함
- 아키텍처는 반드시 유스케이스를 지원해야 함
- 좋은 아키텍처는 행위를 명확히하고 외부로 드러내는 것을 통해 시스템이 지닌 의도를 아키텍처 수준에서 알아볼 수 있게 만듦
운영
- 좋은 아키텍처는 시스템의 운영을 지원해야 하고 이러한 지원은 시스템에 따라 다양한 의미를 가짐
- 따라서 아키텍처에서 각 컴포넌트를 적절히 격리하여 유지하고 컴포넌트 간 통신 방식을 특정 형태로 제한하지 않아야 함
- 그러면 시간이 지나 운영에 필요한 요구사항이 바뀌더라도 기술 스펙트럼을 전환하는 일이 쉬움
개발
- 콘웨이의 법칙: "시스템을 설계하는 조직이라면 어디든지 그 조직의 의사소통 구조와 동일한 구조의 설계를 만들어 낼 것이다"
- 아키텍처는 잘 격리되어 독립적으로 개발 가능한 컴포넌트 단위로 시스템을 분할할 수 있어야 함
배포
- 목표: 시스템 빌드 후 즉각적인 배포(
immediate deployment)
2. 관심사들 간의 균형
- 좋은 아키텍처는 컴포넌트 구조와 관련된 관심사들 간 균형을 맞추고, 각 관심사 모두를 만족시킴
- 하지만 현실에서는 이러한 균형을 잡기가 어려움
- 좋은 아키텍처는 선택 사항을 열어둠으로써, 향후 시스템에 변경이 필요할 때 어떤 방향으로든 쉽게 변경할 수 있도록 함
3. 계층 결합 분리
- 시스템을 서로 결합되지 않은 수평적인 계층으로 분리 > 여러 요소를 서로 독립적으로 변경, 유스케이스를 가시적이고 분명하게 유지
- 예시: UI / 앱에 특화된 업무 규칙 / 앱과는 독립적인 업무 규칙, DB 등
4. 유스 케이스 결합 분리
- 시스템을 수평적 계층으로 분할하면서, 동시에 계층을 가로지르는 수직적인 유스케이스로 분할 가능
- 시스템에서 서로 다른 이유로 변경되는 요소들의 결합을 분리하면 기존 요소에 지장을 주지 않고도 새로운 유스케이스를 계속해서 추가 가능
- 유스케이스를 뒷받침하는 UI와 DB를 서로 묶어서 각 유스케이스가 UI와 DB의 서로 다른 관점 사용하는 것도 가능
- 예시: 주문 입력 시스템의 주문 추가 유스케이스 / 주문 삭제 유스케이스
5. 결합 분리 모드
결합 분리 시 운영 관점에서의 의미?
- 유스케이스를 수행하는 작업(결합 분리)들은 운영에 도움이 됨
- 하지만 운영 측면에서의 이점을 살리기 위해서는 결합 분리 시 적절한 모드를 선택해야 함
- 운영 측면의 이점을 위해 컴포넌트를 서비스 수준까지 분리해야하는 경우도 있음
개발 독립성
배포 독립성
6. 중복
- 중복 발생 시 진짜 중복인지 가짜 또는 우발적 중복인 지 확인해야 함
진짜 중복
- 처리:인스턴스 변경 시, 동일한 변경을 그 인스턴스의 모든 복사본에 반드시 적용
거짓된 또는 우발적 중복
- 두 코드 영역이 각자의 경로로 발전한다면(서로 다른 속도와 다른 이유로 변경) 진짜 중복이 아님
- 해당 코드를 통합하지 않도록 유의해야 함
7. 결합 분리 수준
- 좋은 아키텍처는 결합 분리 모드를 선택사항으로 남겨두어서 배포 규모에 따라 가장 적합한 모드를 선택해 사용할 수 있게 만들어줌
1) 소스 코드 수준
- 소스 코드 모듈 사이의 의존성 제어
- 흔히 모노리틱 구조라고 부름
2)바이너리 코드 수준
- jar 파일, DLL, 공유 라이브러리와 같이 배포 가능한 단위들 사이의 의존성 제어
- 결합이 분리된 컴포넌트가 jar 파일, Gem 파일, DLL과 같이 독립적으로 배포할 수 있는 단위로 분할되어 있음
3) 실행 단위(서비스) 수준
- 의존하는 수준을 데이터 구조 단위까지 낮출 수 있고, 순전히 네트워크 패킷을 통해서만 통신하도록 할 수 있음
- 이를 통해 모든 실행 가능한 단위는 소스와 바이너리 변경에 대해 서로 완전히 독립적이게 됨
- 예시: 서비스 또는 마이크로 서비스
용어 정리
관점 지향 프로그래밍(Aspect-Oriented programming; AOP)
- 횡단 관심사를 분리하여 모듈화를 높이는 프로그래밍 패러다임
- 코드 자체를 수정하지 않고, 기존 코드에 추가하는 방식으로 구현
- 횡단 관심사의 주요 예: 예외 처리, 로깅, 프랜잭션 등