티스토리 뷰
pluralsight 코스 중 하나이고, DDD 코스의 최초 동영상인 클린 아키텍처: 패턴, 프랙티스, 원리 를 2회째 보고 SNS에 정리한 내용을 여기에도 옮깁니다. (옮기면서 보강도 좀 하고요.)
이미지 출처는 위에 링크 건 강의의 강의 자료입니다 (유료). 문제되면 삭제할테니 삭제 요청해주세요.
(본 글은 이 블로그에서 설정중인 크리에이티브 커먼즈 라이선스를 적용하지 않습니다. 문제가 될 수 있어서요...)
1. 클린 아키텍처가 무엇인가?
- 실 사용 목적(Inhabitat)을 위한 아키텍처 (아키텍트나 로우레벨을 위함이 아님)
- 상세 구현 내용이 하려는 일을 기술하는 걸 방해해서는 안 된다
- 아키텍처 에센셜리즘
2. 도메인 중심 아키텍처
- DB나 로우 레벨 구현에 의존하는 대신, 해결하려는 문제를 중심으로 아키텍처 만들기
- 여러 종류를 언급하나 결국 "전부 같은 거 아냐?" 라는 얘기가 나왔다고...
- 의존성 주입(DI) 을 사용해 DB나 인프라가 도메인/앱에 거꾸로 의존하게 만듦
3. 애플리케이션 레이어
- 도메인 프로젝트에 있는 도메인 엔티티로 실제로 문제를 해결하는 걸 기술하는 부분
- 커맨드-쿼리 의존성 분리 (CQRS) 로 프레젠테이션 & 애플리케이션 두 계층을 분리
- DB, 인프라도 의존성 주입으로 거꾸로 애플리케이션 레이어에 의존하도록 구성
4. 커맨드 - 쿼리 의존성 분리 (CQRS)
- 실제 명령(커맨드) & 조회(쿼리) 는 애플리케이션 레이어에 있음
- 프레젠테이션은 의존성 주입(인터페이스)으로 커맨드, 쿼리를 사용하기만 함
- 커맨드, 쿼리
- 커맨드: 명령, 바꾸는 것 (결과 반환하지 않음)
- 쿼리: 조회, 가져오는 것 (바꾸지 않음)
- 실제로는 이렇게 나누기 어려운 경우도 있음 (스택 푸시 팝이라던지)
- 요는 단방향 사이클이라는 것
- 커맨드 사이클: 사용자, 프레젠테이션 -> 커맨드 -> 앱 / 도메인 -> 퍼시스턴스 -> DB (변경)
- 쿼리 사이클: DB -> DB 접근 -> 쿼리 -> 프레젠테이션 -> 사용자
- 개인 의견: 이거 The Elm 아키텍처 같은 데서 본 거 같지 않아요?
- DB를 쪼개느냐 하나만 쓰느냐에 따라 세 종류 정도로 분류 가능
- 단일 DB
- 읽기, 쓰기 DB 분리
- 이벤트 스토어, 읽기 분리 (이벤트 소싱)
5. 기능 위주 구성 (Functional organization - 스크리밍 아키텍처)
- 스크리밍: 시스템 구성이 의도!!!!! 하고 비명을 질러야 한다
- 폴더 구성에서 차이가 남
- 모델, 컨트롤러 폴더가 아니라
- 판매, 고객 등의 단위로 나뉨
- 커질수록 비슷한 목적 끼리 모여있으니 유지보수가 쉬워지지만 프로젝트에 처음 입갤하는 비용이 올라감
6. 마이크로 서비스
(지금 단계에선 관심분야 밖인 주제이긴 했습니다. 아직 실제로 어찌 하는지는 좀 이해가 안 돼요...)
- 시스템을 서브 시스템으로 쪼개는데, 역시 DI를 써서 분리하고
- 아니나다를까 의도 단위로 분리, 겹치는 부분은 서로 다른 클래스로 있을 수 있음 ("바운더리") : 세일즈: 고객연락처, 고객지원: 고객
- 분리하는 스케일은 의견이 갈림
7. 테스트 가능한 아키텍처
(제일 관심있던 부분)
- 테스트 수준별 피라미드
- 수동 테스트 (제일 비용이 쎔)
- UI 자동화 테스트 (유지보수가 힘듦)
- 시스템 테스트 -> (클린 아키텍처에 의해) -> 인수 테스트(Acceptence Test)
- 인수 테스트로 바꾸면, 코드로 비즈니스 로직을 테스트할 수 있게 됨
- 유닛 테스트 (제일 쌈)
- 클린 아키텍처는 서비스 테스트를 자동화하게 해줌: 프레젠테이션, DB, 인프라를 모킹해서 앱, 도메인만 남김
- 예시 프로젝트에서 사용한 것들
- 테스트: NUnit
- 모킹: Moq, AutoMoq
- 인수 테스트작성: 스펙플로우
- (gherkin은 업무상 테스트만 텍스트로 좀 써봤지 실제 코드로 들어가는 건 여기서 처음 봤습니다.)
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- upbit
- Sass
- ArchLinuxARM
- 개발기록
- 오라클 클라우드
- 토이프로젝트
- K8s
- 오라클 클라우드 인프라
- ActivityPub
- javascript
- gitea
- mvu
- pdf.js
- OStatus
- 쿠버네티스
- c++
- Godot Engine
- 왜 생각이 안 났지
- vuex
- 업비트
- C++ FAQ
- Oracle Cloud Infrastructure
- 시스어드민
- exercism
- kotlin당했다
- C#
- scss
- pleroma
- 마스토돈
- rust-lang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함