Flutter
Flutter의 클린 아키텍쳐
merrytang
2024. 12. 30. 21:40
1. 전체 구조의 큰 그림
클린 아키텍처는 애플리케이션을 데이터(Data), 도메인(Domain), 프레젠테이션(Presentation) 계층으로 나눕니다.
- Data 계층: 데이터 소스(API, 로컬 DB 등)와의 상호작용을 담당.
- Domain 계층: 애플리케이션의 핵심 비즈니스 로직과 규칙을 처리.
- Presentation 계층: 사용자 인터페이스(UI)를 처리하고 데이터를 화면에 보여줌.
2. 디렉토리 구조 및 세부 설명
data
Data 계층은 외부 데이터 소스(API, DB 등)와의 상호작용을 관리하고, 데이터를 Domain 계층에서 사용할 수 있도록 가공합니다.
하위 디렉토리 설명
data_source
- 데이터 소스와 직접 연결되는 코드를 작성하는 디렉토리입니다.
- API 호출, 로컬 파일 접근, 데이터베이스 쿼리 등을 처리합니다.
- dto
- Data Transfer Object를 정의하는 디렉토리입니다.
- 외부 데이터(JSON, DB 레코드 등)를 Dart 객체로 변환하거나, 반대로 Dart 객체를 JSON으로 변환하는 역할을 합니다.
- repository
- Domain 계층의 repository interface를 구현한 구체적인 클래스가 위치합니다.
- Data Source와 상호작용하며 데이터를 가공한 후 Domain 계층에 전달합니다.
domain
Domain 계층은 애플리케이션의 비즈니스 로직을 처리하는 계층입니다.
이 계층은 외부 시스템(API, DB 등)과 독립적으로 작동하도록 설계되어야 합니다.
하위 디렉토리 설명
- entity
- 애플리케이션의 핵심 데이터 모델을 정의합니다.
- DTO와는 달리 외부 데이터 소스(API, DB 등)에 의존하지 않습니다.
- 비즈니스 로직과 도메인 규칙을 포함할 수 있습니다.
- repository
- Domain 계층의 repository interface가 위치합니다.
- 데이터 소스에 접근하기 위한 추상화를 제공합니다.
- 구현은 Data 계층에서 처리됩니다.
- usecase
- 비즈니스 로직을 처리하는 클래스가 위치합니다.
- 각 유스케이스는 단일 작업(예: 영화 목록 가져오기, 영화 상세 정보 불러오기)을 처리합니다.
- Repository를 의존성으로 주입받아 데이터를 처리합니다.
presentation
Presentation 계층은 UI와 관련된 코드를 포함하며, 화면을 구성하고 사용자의 입력을 처리합니다.
하위 디렉토리 설명
- pages
- 각 화면(View)에 관련된 코드가 모여 있는 디렉토리입니다.
- 일반적으로 **화면(View)**와 ViewModel로 구성됩니다.
- widgets
- 앱에서 재사용 가능한 UI 컴포넌트를 모아놓는 디렉토리입니다.
- 예: 커스텀 버튼, 카드, 리스트 아이템 등.
3. 흐름 요약
데이터 흐름
- 사용자 입력:
- 사용자가 UI에서 동작을 실행합니다.
- 예: 영화 목록 페이지가 로드됨.
- Presentation 계층:
- ViewModel이 UseCase를 호출해 데이터를 요청합니다.
- Domain 계층:
- UseCase가 Repository Interface를 호출합니다.
- Repository Interface는 Domain 계층에서 정의된 비즈니스 규칙과 데이터를 사용합니다.
- Data 계층:
- Repository 구현체가 Data Source(API, DB 등)와 상호작용합니다.
- Data Source는 데이터를 가져와 DTO로 변환한 뒤 Entity로 매핑합니다.
- 결과 반환:
- 데이터를 가공하여 Presentation 계층(ViewModel)로 전달합니다.
- UI(View)가 데이터를 표시합니다.
4. 장점
- 유지보수성: 각 계층이 독립적으로 설계되어 변경이 쉬움.
- 테스트 용이성: 각 계층을 독립적으로 Mocking하여 테스트 가능.
- 의존성 관리: Domain 계층이 Data/Presentation 계층에 의존하지 않아 확장성이 높음.