본문 바로가기

Architecture39

[Clean Architecture 정리] 27장. '크고 작은 모든' 서비스들 - ing 보호되어 있는 글 입니다. 2022. 9. 20.
[Clean Architecture 정리] 26장. 메인 컴포넌트 26장. 메인 컴포넌트 모든 시스템에는 메인이라는 컴포넌트가 존재하고, 메인이 나머지 컴포넌트의 생성, 조정, 관리의 역할을 담당한다. 궁극적인 세부사항 메인 컴포넌트는 궁극적인 세부 사항으로 가장 낮은 수준의 정책이다. 메인은 팩토리, 전략, 시스템 전반에 필요한 객체들을 생성하고 더 높은 수준에 정책에 제어권을 넘긴다. 스프링과 같은 의존성 주입 프레임 워크에서 의존성을 주입하는 역할을 메인 컴포넌트에서 이뤄진다. 책에서 나온 예제를 보면 메인 컴포넌트와 메인 함수가 있다. 메인 컴포넌트에서 주목할 점은 시스템에서 사용되는 문자열을 로드해서 나머지 핵심 영역에서 이 문자열을 알지 못하도록 한다. 코드에서 문자열은 쉽게 변경될수도 있고, 개발자의 실수로 인해 오타가 발생할 수도 있다. 진행하고 있는 과.. 2022. 9. 16.
[Clean Architecture 정리] 25장. 계층과 경계 25장. 계층과 경계 사냥 게임 어떤 간단한 게임을 만들 때, 1) 다국어 UI를 제공하고 2) 게임 진행 상태를 변경 될 수 있는 저장소에 저장 한다고 가정하자. 위의 형태로 컴포넌트를 분리하고 의존성을 관리하면 어떤 언어에 대한 요구가 있더라도 업무 규칙(Game Rule)을 재사용 가능하고, 저장소의 변경이 업무 규칙에 영향을 주지 않는다. 클린 아키텍처 ? 소프트웨어 시스템이 성장함에 따라서 변경은 계속해서 발생하게 되고, 변경의 축에 의해 정의되는 아키텍처 경계는 잠재되어 있다. 사용자로부터 텍스트를 입력받는 매커니즘이 변경될 수 있다면, 위와 같이 Text Delivery라는 API역할을 하는 추상 컴포넌트를 생성할 수 있다. 이 때, API는 구현하는 쪽이 아닌 사용하는 쪽에서 정의한다. 위.. 2022. 9. 15.
[Clean Architecture 정리] 24장. 부분적 경계 24장. 부분적 경계 아키텍처 경계를 완벽하게 만드는 것에는 많은 비용이 든다. 쌍방향의 다형적 인터페이스, 컴포넌트 간 입출력을 위한 데이터 구조, 독립적인 컴포넌트의 배포와 의존성 관리는 비용이 많이 드는 작업이다. 컴포넌트를 분리함에 있어 YAGNI(You Aren't Going to Need it) 원칙에 위배되는 선행적인 설계는 부분적인 경계(partial boundary)를 적용할 수 있다. 단일 컴포넌트 부분적 경계를 만드는 첫번째 방법은 독립적인 컴포넌트를 위한 작업(쌍방향의 다형적 인터페이스, 컴포넌트 간 입출력을 위한 데이터 구조 등)을 수행하지만 단일 컴포넌트에 배포하는 것이다. 이 방법을 적용하면 다수의 컴포넌트를 관리할 비용은 줄어들지만, 완벽한 경계를 위한 사전 작업에 드는 비용.. 2022. 9. 6.
[Clean Architecture 정리] 23장. 프레젠터와 험블 객체 23장. 프레젠터와 험블 객체 프레젠터는 험블 객체(Humble Object) 패턴을 따르는 형태로, 아키텍처 경계를 식별하고 보호하는데 도움을 준다. 험블 객체 패턴 험블 객체 패턴은 디자인 패턴으로 테스트하기 어려운 행위와 쉬운 행위를 단위 테스트 시에 쉽게 분리할 수 있도록 고안되었다. 기본적인 아이디어는 행위를 두 개의 모듈로 나누고 기본적인 본질을 남긴 뒤, 테스트하기 어려운 행위를 험블 객체로, 테스트 하기 쉬운 행위는 나머지 모듈로 옮기는 것이다. 프레젠터와 뷰 뷰는 험블 객체이며 테스트하기 어렵다. 뷰는 단순히 데이터를 화면으로 로드할 뿐이다. 프레젠터는 테스트하기 쉬운 객체이다. 프레젠터는 애플리케이션으로부터 전달받은 데이터를 화면에 포맷으로 변환하는 역할을 담당한다. 테스트와 아키텍처 .. 2022. 8. 30.
[Clean Architecture 정리] 22장. 클린 아키텍처 22장. 클린 아키텍처 아키텍처와 관련된 아이디어들의 공통적인 목표는 계층 분리를 통한 관심사 분리(separation of concerns)다. 각 아키텍처는 프레임워크 독립성, 테스트 용이성, UI 독립성, 데이터베이스 독립성, 모든 외부 에이전시에 대한 독립성이라는 공통적인 특징을 가진다. 의존성 규칙 위 그림은 소프트웨어의 영역을 표현한 것으로 원 중앙으로 갈수록 고수준의 소프트웨어를 의미한다. 중요한 것은 의존성 규칙(Dependency Rule)이며, 소스 코드 의존성은 원 안쪽인 고수준을 향해야 한다. 바깥쪽 원은 안쪽 원의 어떠한 것(함수, 클래스, 변수 등)도 몰라야하며 영향을 주지 않아야 한다. 엔티티 엔티티는 가장 일반적이며 고수준의 규칙, 즉 전사적인 핵심 업무 규칙을 캡슐화 한다... 2022. 8. 30.
[Clean Architecture 정리] 21장. 소리치는 아키텍처 21장. 소리치는 아키텍처 아키텍처의 테마 소프트웨어 아키텍처는 시스템의 유스케이스를 지원하는 구조이다. 프레임워크에 대한 것이 아니다. 아키텍처의 목적 좋은 아키텍처는 유스케이스를 중심을 두며 프레임워크, 도구, 환경에 구애받지 않고 유스케이스를 지원하는 구조를 아무런 문제 없이 기술할 수 있다. 프레임워크 도구, 환경은 지엽적인 관심사이며 결합을 분리시켜 이들에 대한 결정을 미루고 선택사항을 열어두어야 한다. 하지만 웹은? 웹은 전달 메커니즘이며, 애플리케이션 아키텍처에서도 전달 메커니즘으로 다뤄야한다. 애플리케이션이 웹을 통해 전달된다는 것은 세부사항이지 시스템 구조를 지배해서는 안된다. 프레임워크는 도구일 뿐, 삶의 방식은 아니다. 앞서 말한 것처럼, 좋은 아키텍처는 유스케이스에 중점을 두며, 프.. 2022. 8. 29.
[Clean Architecture 정리] 20장. 업무 규칙 업무 규칙 업무 규칙은 사업적으로 수익을 얻거나 비용을 줄일 수 있는 규칙 또는 절차를 의미한다. 업무 규칙 중 사업 자체에 핵심적이며, 자동화된 시스템이 없더라도 존재하는 업무 규칙을 '핵심 업무 규칙(Critical Business Rule)', 핵심 업무 규칙에서 요구하는 데이터를 '핵심 업무 데이터(Critical Business Rule)'이라고 하고, 이 둘은 엔티티(Entity) 객체로 묶을 수 있다. 엔티티 엔티티는 시스템 내부의 객체로서, 핵심 업무 데이터를 기반으로 일련의 핵심 업무 규칙을 구체화한다. 엔티티 객체는 핵심 업무 데이터를 포함하고, 엔티티의 인터페이스는 핵심 업무 규칙의 구현한 함수로 구성된다. 엔티티는 업무에 관한 것이지 어떤 시스템으로 구성할지, 어떻게 저장할지 등의 .. 2022. 8. 28.
[Clean Architecture 정리] 19장. 정책과 수준 19장. 정책과 수준 소프트웨어 시스템은 정책을 기술이며, 프로그램은 입력이 출력으로 어떻게 변환되는지 그 과정을 정책으로 기술한 것이다. 소프트웨어 아키텍처는 이 정책을 분리하는 역할을 맡는다. 동일한 시점과 이유로 변경되는 정책은 같은 수준, 같은 컴포넌트에 위치해야 한다. 반대로 다른 시점, 이유로 변경되는 정책은 다른 수준, 다른 컴포넌트로 분리되어야 한다. 각 컴포넌트는 서로를 의존하며 소스 코드, 컴파일 타임의 의존성으로 연결된다. 좋은 아키텍처는 이러한 의존성을 컴포넌트 수준에서, 저수준 컴포넌트가 고수준 컴포넌트를 의존하도록 한다. 수준 (level) 수준은 '입력과 출력까지의 거리'를 의미한다. 입력과 출력까지의 거리와 가까울수록 저수준이며, 멀수록 고수준 정책에 해당된다. 데이터를 읽어.. 2022. 8. 25.
[Clean Architecture 정리] 18장. 경계 해부학 18장. 경계 해부학 시스템 아키텍처는 컴포넌트를 분리하는 경계에 의해서 정의되며 경계는 다양한 형태로 존재한다. 경계 횡단하기 소스 코드의 변경은 의존하는 다른 소스 코드에 영향을 주기 때문에 적절히 경계를 횡단하는 방법은 이러한 소스 코드의 의존성을 관리하는 것이다. 경계는 소스 코드의 변경에 의한 영향을 막는 수단으로써 존재한다. 두려운 단일체 다양한 경계 중 가장 단순하고 흔한 형태는 물리적으로 구분되지 않는 단일 실행 파일 형태의 단일체(monolith)이다. 배포 관점에서 단일체의 경계는 드러나지 않지만, *동적 다형성에 의존해 내부 의존성 관리할 수 있다. 정적 다형성(Static Polymorphism)과 동적 다형성(Dynamic Polymorphism) 정적 다형성(Static Poly.. 2022. 8. 23.
[Clean Architecture 정리] 17장. 경계: 선 긋기 경계: 선 긋기 소프트웨어 아키텍처는 시스템 요소를 분리하는 경계를 긋는 기술이며, 이 경계로 인해 경계 한 쪽의 요소가 다른 한쪽의 요소에 대해서 알지 못한다. 경계를 긋는 행위의 목표는 인적 자원에 드는 비용을 최소화하는 것이다. 인적 자원의 비용을 높이는 요인 중 결합(coupling)이 있으며, 특히 너무 이른 결정에 의한 결합이 비용을 높이게 된다. 두 가지 슬픈 이야기 본 잘못된 아키텍처의 사례로 두 회사의 이야기를 다루고 있다. 첫번째는 데스크톱 GUI 애플리케이션을 개발한 P사의 이야기이다. 90년대 후반 웹 어플리케이션이 대세를 이루자 P사는 자사 제품을 웹으로 변환하려는 작업에 착수했다. 이러한 과정에서 P사는 이른 결정을 하게 되었고, 결국 엄청난 개발 비용으로 인한 비극을 맞게 되었.. 2022. 8. 21.
[Clean Architecture 정리] 16장. 독립성 16장. 독립성 좋은 아키텍처가 지원해야하는 것 1. 유스케이스 아키텍처는 시스템의 유스케이스(의도)를 지원해야 한다. 아키텍처는 시스템의 행위를 명확하게 하고 외부로 드러내며 아키텍처 수준에서 시스템의 의도를 파악할 수 있도록 만들어야 한다. 2. 운영 운영 관점에서 아키텍처는 더 실질적인 역할을 맡는데, 각 유스케이스에 맞는 처리량과 응답 시간이다. 특정 시스템에서 비기능적인 요구사항이 있다면, 반드시 이러한 운영작업을 처리할 수 있는 형태로 아키텍처를 구조화해야 한다. 3. 개발 아키텍처는 개발환경과 관련해 핵심적인 역할을 맡으며, 콘웨이 법칙을 적용된다. 각 팀이 독립적으로 개발할 수 있는 형태로 아키텍처를 구성하고, 서로를 방해하지 않도록 해야 한다. 시스템을 설계하는 조직이라면 어디든지 그 조.. 2022. 8. 21.