[소프트웨어 아키텍처 101] 8. 컴포넌트 기반 사고
반응형
인상깊은 부분
[[콘웨이 법칙]]
조직구조나 의사소통 방식이 시스템에 묻어난다는 현상, 콘웨이 법칙은 살아있다. “조직문화부터 MSA까지” | 요즘IT
최상위 아키텍처를 분하하는 두 가지 방법
기술 분할(ex: 레이어드, Common/Local)과 도메인 분할(ex: DDD, 모듈러 아키텍처)
아키텍트는 개발자, 비즈니스 분석가, 도메인 전문가와 협력해서 시스템을 어떻게 분할할지(즉, 기술 분할할지, 도메인 분할할지) 결정하고 그에 따른 초기 컴포넌트를 설계한다.
컴포넌트 세분도
[[아키텍처 101 8. 컴포넌트 기반 사고#컴포넌트 세분도]]
적절한 크기/단위의 컴포넌트 식별은 어려운 것 같다.
아키텍처 스타일에 따른 컴포넌트 식별 방법 케미
p154 [[아키텍처 101 8. 컴포넌트 기반 사고#8.6 컴포넌트 설계]]
식별된 아키텍처 퀀텀 수에 따른 아키텍처 선정(모놀로식 or 분산)
p161 [[아키텍처 101 8. 컴포넌트 기반 사고#8.8 아키텍처 퀀텀 딜레마 모놀로식이냐, 분산 아키텍처냐]]
궁금한 것
- p143 아래 문장 이해하지 못함. 근데 그냥 넘어가도 될듯
이 책에서 다루는 내용은 거의 다 소프트웨어 개발팀이 사용하는 것들과 독립적이므로 아키텍처는 개발 프로세스의 영향을 받지 않습니다. 이 규칙의 첫 번째 예외는 애자일 소프트웨어 개발 방법론의 다양한 분야를 개척한 엔지니어링 프랙티스를 필요로 하는데, 특히 배포 및 자동화 거버넌스 분야가 그렇습니다. - p150 도메인 분할의 단점, '유저 정의 코드가 여기저기 널려 있다.' 비슷하게 반복되는 코드를 의미하는걸까? infra layer나 도메인별로 작성된 persistance layer를 생각하면 이해가 가는 것 같기도..?
- p151 기술 분할의 단점, '개발자가 공통 레이어, 로컬 레이어 양쪽에 도메인 개념을 복제해야 할 수도 있다.'
요약
8.1 컴포넌트 범위
- 컴포넌트는 아키텍처에서 서브시스템이나 레이어 형태로도 나타나며, 많은 이벤트 프로세서를 위한
배포 가능한 작업 단위
이다.- 연관된 코드를 묶은 래퍼(or 라이브러리), 레이어 또는 서브 시스템, 이벤트 프로세서, 분산 서비스 등
- 마이크로서비스 같은 아키텍처에서 서비스는 배포 가능한 독립적인 단위를 형성함
- 다양한 컴포넌트 변형 => 컴포넌트의 수준이나 형태는 맥락에 따라 다름
8.2 아키텍트 역할
- 아키텍트는 아키넥처 내부의 컴포넌트를 정의, 개선, 관리, 통제하는 일을 함
- 아키텍트는 (특히 설계 패턴을 발견하여 적용할 때) 클래스 설계에 참여해서도 안 되고 시스템의 세세한 설계 결정에 관여해서도 안됨
- 최상위 아키텍처 분할 (= 기술 분할 or 도메인 분할)
- 기술적 분할 : 레이어드 아키텍처와 같이 기술적인 능력에 따라 아키텍처를 구성하는 것
- 시스템 기능을 기술적인 능력(ex: 프레젠테이션, 비즈니스 규칙, 서비스, 퍼시스턴스) 등으로 분할하였기 때문에 코드를 쉽게 찾을 수 있으며 이해하기 쉬움
- 레이어드 아키텍처가 대세가 된 이면에는 흥미로운 부수 효과로 [[콘웨이 법칙]]이 있음
- 이 아키텍처의 구성 원칙 중 하나는 기술 관심사의 분리로서, 이는 유용한 수준의 디커플링(반결합, 분리)을 만들어 변경 전파를 제한함. 이런 식으로 분할하면 의존하는 컴포넌트에 부수 효과가 전파되지 않도록 막을 수 있음. 시스템을 기술적으로 분할하여 구성하는 것에 대한 트레이드 오프는 고려해야함. [[아키텍처 101 10. 레이어드 아키텍처 패턴]] 에서 자세히 다룸
- 커스텀 코드가 명확하게 분리된다
- 레이어드 아키텍처 패턴에 더 가깝게 맞출 수 있다.
- 단점
- 전역 커플링이 더 높다. 공통 또는 로컬 컴포넌트 중 하나라도 변경되면 다른 모든 컴포넌트가 영향받을 가능성이 높다.
- 개발자가 공통 레이어, 로컬 레이어 양쪽에 도메인 개념을 복제해야할 수도 있다. (?)
- 일반적으로 데이터 레벨의 커플링이 높다. 분산시스템으로 아키텍처를 옮기려고 할 경우 데이터 관계를 파헤치는 작업이 어렵다.
- 도메인 분할 : 워크플로우 또는 도메인에 따라 아키텍처를 구성하는 것
- 에릭 에반스의 DDD에서 비롯된 것으로, DDD에서 아키텍트는 서로 독립적으로 분리된 도메인 또는 워크플로를 식별하는데, 이는 [[아키텍처 101 7. 마이크로서비스 아키텍처 스타일]] 의근본 사상이기도 함
- 도메인 분할의 각 컴포넌트는 레이어를 포함한 서브컴포넌트를 가질 수 있지만, 최상위 분할은 도메인에 초점을 두기 때문에 프로젝트에서 가장 자주 발생하는 변경의 유형들이 더 확실히 반영됨
- 세부 구현보다 비즈니스 기능에 더 가깝게 모델링됨
- [[역 콘웨이 전략]]을 활용하여 도메인별 다목적팀(cross-functional team)을 구성하기 쉬움
- 모듈러 모놀리스와 마이크로서비스 아키텍처 스타일에 더 가깝게 맞출 수 있음
- 메시지 흐름이 문제 영역과 일치함
- 데이터와 컴포넌트를 분산 아키텍처로 옮기기 쉬움
- 단점
- 유저 정의 코드가 여기저기 널려있게 됨 (?)
- 기술적 분할 : 레이어드 아키텍처와 같이 기술적인 능력에 따라 아키텍처를 구성하는 것
- 아키텍처 패턴 :서로 다른 아키텍처 패턴 간의 근본적인 차이점 중 하나가 최상위 분할의 유형(기술 or 도메인)임
- 8.3 개발자 역할
- 개발자는 아키텍트와 공동 설계한 컴포넌트를 바탕으로 클래스, 함수, 서브컴포넌트로 더 잘게 나눔. 일반적으로 클래스, 함수 설계는 공동의 책임이지만 대부분 개발자가 담당함
- 개발자는 아키텍트가 설계한 컴포넌트가 최종판이라고 생각해선 안되고, 이터레이션을 거쳐 점점 다듬어가야함. 초기 설계는 일단 초안을 보고 차후 구현을 하며 상세한 것들을 밝히고 하나씩 개선하면 됨8.4 컴포넌트 식별 흐름
- 컴포넌트 식별은 후보를 도출하고 피드백을 통해 다듬어가는 과정을 반복하는 것이 가장 좋음
- (p152 그림 8-8) 컴포넌트 식별 주기 : 초기 컴포넌트 식별 -> 요구사항을 컴포넌트에 할당 -> 역할 및 책임 분석 -> 아키텍처 특성 분석 -> 컴포넌트 재구성 -> (다시 역할 및 책임 분석)
- 초기 컴포넌트 식별 : 최상위 분할 유형(기술 or 도메인)에 따라 최상위 컴포넌트를 어디서부터 시작할지 결정하고 어느 기능을 어디에 둘지 도메인 기능을 매핑함. 초기 식별한 컴포넌트들만으로 제대로 된 설계가 나올 가능성은 거의 없으니 아키텍트는 컴포넌트 설계를 이터레이션하면서 조금씩 개선해야함
- 요구사항을 컴포넌트에 할당 : 컴포넌트에 요구사항(or 유저 스토리)을 대입하여 잘 맞는지 확인. 이 과정에서 컴포넌트를 새로 만들거나 기존 컴포넌트를 통합하고, 하는 일이 너무 많은 컴포넌트를 분해할 수 있음.
- 역할 및 책임 분석(+세분도 검토) : 컴포넌트에 스토리를 대입할 때 아키텍트는 요구사항을 파악하는 단계에서 밝혀진 역할과 책임을 살펴보고, 세분도(granularity)가 적합한지 확인해야함. [[아키텍처 101 8. 컴포넌트 기반 사고#8.5 컴포넌트 세분도]]와 도메인의 세분도를 짚어내는 것은 아키텍트의 가장 어려운 일 중 하나임. 그래서 더욱 이터레이션 과정이 필요함
- 아키텍처 특성 분석 : 컴포넌트에 요구사항을 대입할 때 아키텍트는 앞서 식별한 아키텍처 특성들이 컴포넌트 분할 및 세분도에 어떤 영향을 미치는지 살펴봐야함. 순수하게 기능적인 관점에서만 컴포넌트를 설계하면 유저 상호작용을 처리하는 단일 컴포넌트가 도출되지만, 아키텍처 특성을 분석하면 더 하위 컴포넌트로 잘게 나눌 수 있음 => 단순히 요구사항만 충족하는 서비스/컴포넌트가 아니라, 아키텍처 특성을 고려한 설계가 필요하다는 뜻 (ex: 동일한 기능이더라도 유저 동접이 몰리는 서비스는 아키텍처 특성이 다를 수 밖에 없음)
- 컴포넌트 재구성 : 개발자들과 함께 지속적으로 컴포넌트 설계를 반복하며 피드백을 받아야함8.5 컴포넌트 세분도
컴포넌트에서 가장 적당한 세분도를 찾는 것은 아키텍트의 가장 어려운 작업 중 하나입니다. 컴포넌트를 너무 잘게 나누어 설계하면 컴포넌트 간 통신이 너무 많아지고, 그렇다고 너무 크게 나누면 내부적인 커플링지 긍가해서 배포, 테스트가 어려워지고 모듈성 관점에서도 부정적인 영향을 미칩니다
8.6 컴포넌트 설계
컴포넌트를 발견하는 몇 가지 일반적인 방법과, 안티패턴 중 하나인 엔티티 함정에 대해 안내
- 컴포넌트를 발견하는 몇 가지 방법 : 각 기법들은 다 일장일단이 있음. 폭포수 모델과 같은 소프트웨어 개발 프로세스를 사용하는 팀이라면 일반적인 액터/액션 접근법을 선호할 것이고, DDD와 마이크로서비스 같은 아키텍처를 사용하는 프로젝트는 이벤트 스토밍이 소프트웨어 개발 프로세스에 더 잘 맞음. 팀에 특별한 제약이 없고 범용적인 컴포넌트 분할을 고려하고 있다면 액터/액션 접근법이 일반적으로 괜찮은 솔루션임
- [[액터/액션 접근법]]
- [[이벤트 스토밍]]
- [[워크플로 접근법]]
- [[엔티티 함정(entity trap) 안티패턴]]
8.7 컴포넌트 발굴 사례 연구 : GGG
p157 GGG 카타에 액터/액션 접근법을 적용하여 컴포넌트 발굴하는 예제
8.8 아키텍처 퀀텀 딜레마 : 모놀로식이냐, 분산 아키텍처냐
- 모놀로식 아키텍처
- 보통 배포 단위가 하나밖에 없으므로 단일 데이터베이스에 접속하여 실행되는 모든 시스템 기능이 포함됨
- 분산 아키텍처
- 모놀로식 아키텍처와 정반대로, 자신의 체계를 갖추고 네트워킹 프로토콜을 통해 서로 통신하는 여러 서비스로 구성됨. 배포 단위가 잘게 나뉘어 있고 서비스별로 개발팀과 우선순위를 정해 자체 릴리스 주기와 엔지니어링 프랙티스를 수립
- 식별된 아키텍처 퀀텀 수에 따른 아키텍처 선정(모놀로식 or 분산)
- 아키텍처 스타일은 저마다 다양하 트레이드오프가 있지만, 근본적인 결정은 설계 프로세스 중에
식별된 아키텍처 퀀텀 수
에 좌우됨 - 만약 시스템이 단일 퀀텀만으로 가능하다면 모놀리스 아키텍처가 장점이 더 많음
- 반면에 컴포넌트마다 아키텍처 특성이 달라지는 경우에는 이를 수용할 수 있는 분산 아키텍처가 필요함. 서로 다른 아키텍처 특성이 혼재되어 있는 경우 분산 아키텍처를 선택하는 것이 유리함
- 아키텍처 퀀텀을 활용하면 초기 설계 단계에서 아키텍처의 근본적인 설계 특성(모놀리스냐 분산이냐)을 결정할 수 있으므로 아키텍처 특성의 범위와 커플링을 분석하는 방법으로서 장점이 부각됨
- 아키텍처 스타일은 저마다 다양하 트레이드오프가 있지만, 근본적인 결정은 설계 프로세스 중에
반응형
'엔지니어링 > 설계' 카테고리의 다른 글
[소프트웨어 아키텍처 101] 11. TODO (0) | 2024.08.31 |
---|---|
[소프트웨어 아키텍처 101] 9. 아키텍처 스타일 기초 (0) | 2024.08.10 |
[소프트웨어 아키텍처 101] 7. 아키텍처 특성 범위 (0) | 2024.07.09 |
[소프트웨어 아키텍처 101] 6. 아키텍처 특성의 측정 및 거버넌스 (0) | 2024.06.25 |
[소프트웨어 아키텍처 101] 5. 아키텍처 특성 식별 (0) | 2024.06.18 |
댓글
이 글 공유하기
다른 글
-
[소프트웨어 아키텍처 101] 11. TODO
[소프트웨어 아키텍처 101] 11. TODO
2024.08.31 -
[소프트웨어 아키텍처 101] 9. 아키텍처 스타일 기초
[소프트웨어 아키텍처 101] 9. 아키텍처 스타일 기초
2024.08.10 -
[소프트웨어 아키텍처 101] 7. 아키텍처 특성 범위
[소프트웨어 아키텍처 101] 7. 아키텍처 특성 범위
2024.07.09 -
[소프트웨어 아키텍처 101] 6. 아키텍처 특성의 측정 및 거버넌스
[소프트웨어 아키텍처 101] 6. 아키텍처 특성의 측정 및 거버넌스
2024.06.25