Clean Architecture 15장, 16장

회사에서 클린아키텍처 - 로버트 C. 마틴 으로 스터디를 진행했습니다. 본문은 그 중 한 파트를 정리한 것입니다.

아키텍처란?

소프트웨어 시스템 아키텍처의 모양은 시스템을 컴포넌트로 분할하는 방법, 그것을 배치하는 방법, 그것들이 서로 의사소통하는 방식에 따라 정해진다. 그리고 그 형태는 소프트웨어 시스템이 쉽게 개발, 배포, 운영, 유지보수되도록 만들어야 한다.

이러한 일을 용이하게 만들기 위해서는 가능한 한 많은 선택지를, 가능한 한 오래 남겨두는 전략을 따라야 한다.

형편없는 아키텍처여도 잘 동작하는 경우가 많으며 보통 운영에는 문제를 겪지않는다. 하지만 배포, 유지보수, 계속되는 개발 과정에서 어려움을 겪는다. 좋은 아키텍처는 시스템을 쉽게 이해하고, 쉽게 개발하며, 쉽게 유지보수하고, 쉽게 배포하게 해준다. 아키텍처의 궁극적인 목표는 시스템 수명과 관련된 비용은 최소화하고, 프로그래머의 생산성은 최대화하는데 있다.

개발

팀 규모에 따라 아키텍처가 필요없다고 느낄 수 도 있다. 작은팀이라면 아키텍처관련 제약은 장애물. 하지만 큰 팀이라면 이것 없이는 진척되지 않는다.

배포

개발 초기단계에서 마이크로 서비스 아키텍처를 사용하면 오히려 그것이 결합되는 과정에서 오작동할수도 있다.

유지보수

소프트웨어 시스템에서 가장 큰 비용. 그리고 그것은 탐사와 이것으로인한 위험부담에서 기인한다. 따라서 안정된 아키텍처가 큰 도움을 줄 수 있다.

운영

비교적 덜 극적이어서 영향을 많이 끼지치 않는듯 보이지만, 아키텍처는 유스케이스, 기능, 시스템의 필수 행위를 잘 관리하게 하여 이로인해 시스템을 이해하기 쉬워지며 개발과 유지보수에 큰 도움이 된다.

선택사항 열어두기

모든 소프트웨어는 정책과 세부사항으로 분해할 수 있다. 소프트웨어를 부드럽게 유지하는방법은 그 중 세부사항을 가능한한 오랫동안 열어두는것이다. 세부사항에는 입출력 장치, DB, 웹 시스템, 서버, 프레임워크, 통신 프로토콜 등이 있다. ㄴ좋은 아키텍트는 결정되지 않은 사항의 수를 최대화한다.

독립성

좋은 아키텍처는 유스케이스, 운영, 개발, 배포를 지원해야 한다.

유스케이스

시스템의 행위. 예를들어 장바구니 어플리케이션이라면 장바구니 유스케이스를 지원해야한다. 좋은 아키텍처의 역할은 이 행위들을 명확히 들어내주는것이다.

운영

유스케이스에 따른 처리량과 응답시간을 보장해야함. 시스템이 단일체(monolith)로 작성되어 모노리틱 구조를 갖는다면, 다른형태가 필요해질 때 개선하기 어렵다. 컴포넌트를 적절히 격리하여 유지하고 컴포넌트 간 통신 방식을 제한하지 않아야한다.

개발

콘웨이의 법칙: 시스템을 설계하는 조직이라면 어디든지 그 조직의 의사소통 구조와 동일한 구조의 설계를 만들어 낼 것이다. 독립적으로 개발 가능한 컴포넌트 단위로 시스템을 분할할 수 있어야 한다.

배포

컴포넌트 단위로 적절히 분할하고 격리시켜야 즉각적인 배포가 가능하다.

선택사항 열어놓기

현실에서는 컴포넌트 구조와 이 관심사들 사이의 균형을 유지하는게 매우 어려움. 우리가 도달하려는 목표는 시시각각 변한다. 좋은 아키텍처는 선택사항을 열어둠으로써 향후 시스템 변경에 유연하게 대처한다.

계층 결합 분리

좋은 아키텍처는 모든 유스케이스를 알지 못함에도 불구하고, 시스템의 의도를 명확히 한다. 다른 이유로 변경되는 것은 분리하고, 같은 이유로 변경되는 것은 묶는다. 예를들어 UI부분과 업무규칙 부분은 서로 분리한다.

유스케이스 결합 분리

유스케이스 그 자체도 각 유스케이스가 각각 다른 이유로 변경 된다. 따라서 시스템을 수평적으로 분할하는 동시에 수직적으로도 분리해야한다.

주문 추가 유스케이스 주문 삭제 유스케이스
UI계층 주문 추가용 UI 주문 삭제용 UI
업무 로직 계층 주문 추가용 업무 로직 주문 삭제용 업무 로직
DB계층 주문 추가용 DB 주문 삭제용 DB

개발 독립성

컴포넌트가 완전히 분리되어있으면 개발 또한 분리 될 수 있음을 뜻한다. 이는 팀 구조를 서포트해줄 것이다.

배포 독립성

잘 분리된 컴포넌트는 새로운 유스케이스를 추가해도 다른것에는 영향을 주지 않는다.

중복

같은 코드임에도 서로 다른 속도와 다른 이유로 변경된다면 이 두 코드는 진짜 중복이 아니다.

결합 분리 모드

결합을 분리하는 방법은 다양하다. 소스 수준 분리, 배포 수준 분리, 서비스 수준 분리 등 좋은 아키텍처는 시스템이 모노리틱 구조로 태어나서 단일 파일로 배포되더라도, 이후에는 독립적으로 배포 가능한 단위들의 집합으로 성장하고, 독립적인 서비스나 마이크로서비스 수준까지 성장할 수 있도록 만들어져야 한다. 그리고 그 반대로 원래 형태인 모노리틱 구조로도 되돌릴 수 있어야 한다.