728x90
1. 들어가며
- 시스템 아키텍처는 일련의 소프트웨어 컴포넌트와 그 컴포넌트들을 분리하는 경계에 의해 정의됨
2. 경계 횡단하기
- ‘런타임에 경계를 횡단한다’ : 경계 한쪽에 있는 기능에서 반대편 기능을 호출하여 데이터를 전달하는 일
- 소스 코드 의존성 관리를 통해 경계를 횡단하게 함
- 소스 코드 모듈 하나가 변경되면, 이에 의존하는 다른 소스 코드 모듈도 변경하거나, 재컴파일해서 배포해야 할 수 있음
- 경계는 변경이 전파되는 것을 막는 방화벽을 구축하고 관리하는 수단
3. 두려운 단일체
- 소스 수준 분리 모드
- 물리적으로 엄격하게 구분되지 않는 형태
- 함수와 데이터가 단일 프로세서에서 같은 주소 공간을 공유하며 나름의 규칙에 따라 분리되어 있음
- 단일체(monolith)라고 불리는 단일 실행 파일
- 배포 관점에서 볼 때 단일체는 경계가 드러나지 않음
- 거의 모든 경우에 특정한 동적 다형성에 의존하여 내부 의존성을 관리함
- 가장 단순한 경계 횡단
- 저수준 클라이언트에서 고수준 서비스로 향하는 함수 호출
- 런타임 의존성과 컴파일 타임 의존성은 모두 같은 방향, 즉 저수준 컴포넌트에서 고수준 컴포넌트로 향함
- 전형적인 함수 호출에 지나지않은, 단일체에서 컴포넌트 간 통신은 매우 빠르고 저렴함
4. 배포형 컴포넌트
- 배포 수준 결합 분리 모드
- 단순히 배포 가능한 단위를 좀 더 편리한 형태로 묶는 일
- 소스 수준 분리 모드와 다른 점으로는 정적 다형성을 사용할 수 없음
- 동적 링크와 런타임 로딩으로 최초의 함수 호출은 오래 걸릴 수 있으나, 대체로 이들 경계를 가로지르는 통신은 빈번할 것
5. 스레드
- 스레드는 아키텍처 경계도, 배포 단위도 아님
- 실행 계획과 순서를 체계화하는 방법에 가까움
- 모든 스레드가 단 하나의 컴포넌트에 포함될 수도 있고, 많은 컴포넌트에 걸쳐 분산될 수도 있음
6. 로컬 프로세스
- 훨씬 강한 물리적 형태를 띠는 아키텍처 경계
- 주로 명령행이나 유사한 시스템 호출을 통해 생성됨
- 동일한 프로세서 또는 하나의 멀티코어 시스템에 속한 여러 프로세서들에서 실행되지만, 각각 독립된 주소 공간에서 실행됨
- 종종 공유 메모리 파티션을 사용하기도 하지만, 일반적으로는 메모리 보호를 통해 프로세스들이 메모리 공유를 못하게 함
- 각 로컬 프로세스는 정적으로 링크된 단일체이거나 동적으로 링크된 여러 개의 컴포넌트로 구성될 수 있음
- 일종의 최상위 컴포넌트라고 생각했을 떄, 컴포넌트 간 의존성을 동적 다형성을 통해 관리하는 저수준 컴포넌트로 구성됨
- 고수준 프로세스의 소스 코드가 저수준 프로세스의 이름, 물리 주소, 레지스트리 조회 키를 절대로 포함해서는 안됨
- 로컬 프로세스 경계를 지나는 통신
- 운영체제 호출
- 데이터 마샬링 및 언마샬링
- 프로세스 간 문맥 교환
- 제법 비싼 작업이므로 빈번하게 이루어지지 않도록 신중하게 제한해야 함
7. 서비스
- 물리적인 형태를 띠는 가장 강력한 경계
- 서비스는 프로세스로. 일반적으로 명령행 또는 그와 동등한 시스템 호춣을 통해 구동
- 자신의 물리적 위치에 구애받지 않음
- 동일한 프로세서나 멀티코어 or not
- 함수 호출에 비해 매우 느리므로 매우 주의를 기울여야함
- 지연(Latency)에 따른 문제를 고수준에서 처리할 수 있어야 함
- 고수준 서비스의 소스 코드에는 저수준 서비스를 특정 짓는 어떤 물리적인 정보(ex, URI)도 절대 포함해서는 안됨
결론
- 단일체를 제외한 대다수의 시스템은 한 가지 이상의 경계 전략을 사용함
- 대체로 한 시스템 안에서도 통신이 빈번한 로컬 경계와 지연을 중요하게 고려해야 하는 경계가 혼합되어 있음
728x90
'독서(Reading) > 클린아키텍처(Clean Architecture)' 카테고리의 다른 글
5부 아키텍처 20장 업무 규칙 (0) | 2022.12.30 |
---|---|
5부 아키텍처 19장 정책과 수준 (0) | 2022.12.30 |
5부 아키텍처 17장 경계: 선 긋기 (0) | 2022.12.29 |
5부 아키텍처 16장 독립성 (0) | 2022.12.29 |
댓글