좋은 아키텍처는 유스케이스를 중심으로 만든다.
- 프레임워크, 데이터베이스, 웹서버 등의 개발환경을 중심으로 만들면 안된다.
- -> 프레임워크는 도구일뿐이다.
- 웹 또한 전달 메커니즘(입출력 장치)이며, 시스템 아키텍처에는 영향을 주지 않는다.
- -> 아키텍처 수정 없이도 시스템을 웹, 앱, 콘솔앱 등 전달할 수 있어야 한다.
- 프레임워크, 웹서버, 데이터베이스 없이도 유스케이스 전부에 대해 단위 테스트가 가능해야한다.
- -> 유스케이스 객체가 엔티티 객체(데이터베이스나 프레임워크 아닌 간단한 객체)를 조작해야 한다.
지난 수십년 간 시스템 아키텍처와 관련된 여러 아이디어가 있다.
- 육각형 아키텍처 Hexagonal Archiecture
- DCI (Data Context and Interaction)
- BCE (Boundary Control Entity)
시스템 아키텍처의 공통된 시스템 특징
- 프레임워크 독립성
- 프레임워크(라이브러리를 제공하는 소프트웨어)에 의존하지 않는다.
- 테스트 용이성
- 업무규칙은 UI, 데이터베이스, 웹서버 요소 없이도 테스트할 수 있다.
- UI 독립성
- 업무 규칙(시스템)을 변경하지 않아도 UI를 변경할 수 있다.
- 데이터베이스 독립성
- 오라클, MSSQL 서버를 몽고DB, 카우치DB등으로 교체할 수 있다.
- 모든 외부 에이전시에 대한 독립성
- 업무규칙은 외부와의 인터페이스에 대해 알지 못한다.
클린 아키텍처 다이어그램
- 안쪽 - 중요함, 고수준, 업무규칙, 정책
- 바깥쪽 - 덜 중요함, 저수준
- 소스코드 의존성은 안쪽(고수준)으로 향해야 한다.
- 각 계층은 서로 분리되어져야 한다. 바깥이 안쪽에 영향을 주면 안된다.
엔티티
- 메서드를 가지는 객체 또는 데이터구조와 함수의 집합
- 핵심 업무 규칙(고수준 규칙)을 캡슐화한다.
유스케이스
- 시스템의 모든 유스케이스를 캡슐화하고 구현한다.
- 엔티티로 들어오고 나가는 데이터 흐름을 조정하며, 엔티티가 자신의 핵심 업무 규칙을 사용하여 유스케이스의 목적을 달성하도록 이끈다.
- 이 계층에서 발생한 변경이 엔티티에 영향을 주면 안된다.
인터페이스 어댑터 (프레젠터, 뷰, 컨트롤러, 게이트웨이)
- 데이터를 유스케이스와 엔티티에게 가장 편리한 형식에서 데이터베이스나 웹 같은 외부 에이전시에 가장 편리한 형식에으로 변환한다.
- GUI의 MVC 아키텍처를 모두 포괄한다.
- 데이터 흐름: 컨트롤러 -> 유스케이스 -> 프레젠터, 뷰
프레임워크와 드라이버 (웹, UI, 데이터베이스, 외부 인터페이스, 프레임워크)
- 안쪽과 통신하기 위한 접합 코드가 존재한다.
- 모든 세부사항이 위치한다.
경계 횡단하기 (다이어그램 우측 하단)
- 제어흐름과 의존성이 반대이다.
- 제어흐름: 컨트롤러 -> 유스케이스 -> 프레젠터
- 의존성은 유스케이스를 향한다.
- 제어흐름을 따라 구현하면, 안쪽 원의 코드가 바깥쪽의 원 코드를 직접 호출하게 된다. -> 의존성 역전 원칙 (DIP) 사용하여 해결 가능
- ex) 유스케이스에서 프레젠터를 호출해야할 때, 직접 호출하지 않고 유스케이스 출력포트 인터페이스를 호출하도록 한다. 프레젠터가 그 인터페이스를 구현한다.
데이터베이스를 사용하는 웹 기반 자바 시스템 다이어그램
1 웹서버는 사용자로부터 입력 데이터를 모아서 Controller로 전달
2 Controller는 데이터를 객체로 묶은 후 InputBoundary 인터페이스를 통해 UseCaseInteractor로 전달
3, 4 UseCaseInteractor는 데이터를 해석 후 DataAccessInterface를 사용하여 Entities가 사용할 데이터를 데이터베이스에서 불러와서 메모리로 로드한다.
5 UseCaseInteractor는 Entities로부터 데이터를 모아서 OutputData 객체를 구성한다.
6 OutputData는 OutputBoundary 인터페이스를 통해 Presenter로 전달된다.
7 Presenter는 OutputData를 ViewModel 객체처럼 화면에 출력할 수 있는 형식으로 재구성한다.
8 View에서는 이 데이터를 화면에 출력한다.
* 모든 의존성은 경계선 안쪽으로 가르지르며, 의존성 규칙을 지킨다.
728x90
반응형
'클린아키텍처' 카테고리의 다른 글
[클린아키텍처] 26장 메인 컴포넌트, 27장 크고 작은 모든 서비스들 (0) | 2022.03.16 |
---|---|
[클린아키텍처] 23장 프레젠터와 험블 객체, 24장 부분적 경계, 25장 계층과 경계 (0) | 2022.03.13 |
[클린아키텍처] 19장 정책과 수준, 20장 업무 규칙 (0) | 2022.03.11 |
[클린아키텍처] 17장 경계: 선긋기, 18장 경계 해부학 (0) | 2022.03.10 |
[클린아키텍처] 15장 아키텍처란?, 16장 독립성 (0) | 2022.03.06 |
댓글