8. • Robert C Martin이 제안한 아키텍처
• 50년 넘게 개발해보니, 이렇게 하면 좋더라.
è Best Practice
클린 아키텍처!
9. • 50년 전의 프로그래머를 오늘날 PC에 앉혀둔다면, 24시간 이내에
코드를 작성할 수 있다.
• 프로그램의 구성요소를 정렬하고 조립하는 방법에 대한 규칙은
보편적이며 시간이 흐름에 따라 변하지 않았다.
è보편적 규칙이 존재함
è클린 아키텍처를 통해 이 규칙을 학습
왜 클린 아키텍처인가?
10. • 제대로 된 소프트웨어를 만들면, 소수의 인력으로 프로그램을
지속시킬 수 있다.
è나는 천국에 가 보았다.
왜 클린 아키텍처인가?
20. • 추상적인 것 (일찍 결정해야 함)
• 비즈니스 규칙 (what)
• ex. 저장 à 주문 내역 저장
• ex. 입출력 à 주문 양을 입력
• 구체적인 것 (늦게 결정해도 됨)
• 도구 (how)
• ex. 데이터베이스 à mysql
• ex. 화면 à TextField를 활용해 주문양을 입력
è 플러그인 아키텍처를 통해 늦게 결정해도 되는 요소를 미룸
일찍 결정해야 하는 것과 아닌 것
32. • 경계는 소프트웨어 요소를 서로 분리
• 경계 반대편의 요소를 알 수 없음
è한 쪽에서 일어나는 변경이 경계 밖으로 영향을 주지 않음
경계의 의미
33. • 소스 수준 분리: 모든 컴포넌트가 동일한 주소 공간에서 실행.
함수 호출로 통신. (모놀리틱)
• 바이너리 수준 분리: jar, dll, shared library. 동일한 주소 공간에서
실행 + 함수 호출로 통신. 다른 프로세스에서 실행 +
IPC(Socket/Shared Memory). 독립적으로 배포 가능
• 실행 수준 분리: 데이터 구조에만 의존. 네트워크로 통신.
(마이크로 서비스)
경계선 긋기
34. • 소스 수준 분리: 모든 컴포넌트가 동일한 주소 공간에서 실행.
함수 호출로 통신. (모놀리틱)
• 바이너리 수준 분리: jar, dll, shared library. 동일한 주소 공간에서
실행 + 함수 호출로 통신. 다른 프로세스에서 실행 +
IPC(Socket/Shared Memory). 독립적으로 배포 가능
• 실행 수준 분리: 데이터 구조에만 의존. 네트워크로 통신.
(마이크로 서비스)
경계선 긋기
51. • Application: 일반적인 앱 개발
• Plugin: Native 기능 활용
• Package: 재사용 강화를 위한 서브 컴포넌트 개발
• Module: 플러터 모듈을 네이티브에 포함시키기 위한 모듈 개발
• Skeleton: 기본 기능 포함된 샘플
프로젝트 유형
52. • Application: 일반적인 앱 개발
• Plugin: Native 기능 활용
• Package: 재사용 강화를 위한 서브 컴포넌트 개발
• Module: 플러터 모듈을 네이티브에 포함시키기 위한 모듈 개발
• Skeleton: 기본 기능 포함된 샘플
프로젝트 유형
53. • Application: 일반적인 앱 개발
• Plugin: Native 기능 활용
• Package: 재사용 강화를 위한 서브 컴포넌트 개발 à 플러터 패키지
• Module: 플러터 모듈을 네이티브에 포함시키기 위한 모듈 개발
• Skeleton: 기본 기능 포함된 샘플
프로젝트 유형
59. • lib
• src ß 외부 프로젝트에서 접근 불가 (private)
• data
• presentation
• usecase
• domain.dart ß 외부 프로젝트에서 접근 가능
è 공개할 파일들을 domain.dart에 모두export 해야 함
è 캡슐화는 잘 되어있으나, 멀티모듈로 사용할 때는 불편함
Domain 패키지 구조
60. • lib
• data ß 외부 프로젝트에서 접근 가능
• presentation ß 외부 프로젝트에서 접근 가능
• usecase ß 외부 프로젝트에서 접근 가능
è 캡슐화는 완화되지만, 멀티모듈로 사용할 때 편리함
캡슐화를 완화한 Domain 패키지 구조
61. • 플러그인 아키텍처 à 중요한 결정을 뒤로 미룸
• 유스케이스 지원을 위한 내부 도메인과, 상세 구현을 위한 외부 인프라를
분리
• 내부 도메인을 먼저 개발하고, 테스트할 수 있음
• 외부 인프라는 나중으로 미루거나, 쉽게 변경이 가능함
• 경계선 긋기 à 변경의 영향 범위 최소화
• 소스코드 수준에서 경계선 긋기
• 플러터 패키지를 활용하면 침범하기 어려운 경계선을 그을 수 있음
• 내부 도메인은 순수 dart 패키지로, 독립성을 지킬 수 있음
정리