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 호출, 로컬 파일 접근, 데이터베이스 쿼리 등을 처리합니다.
  1. dto
    • Data Transfer Object를 정의하는 디렉토리입니다.
    • 외부 데이터(JSON, DB 레코드 등)를 Dart 객체로 변환하거나, 반대로 Dart 객체를 JSON으로 변환하는 역할을 합니다.
  2. repository
    • Domain 계층의 repository interface를 구현한 구체적인 클래스가 위치합니다.
    • Data Source와 상호작용하며 데이터를 가공한 후 Domain 계층에 전달합니다.

 

domain

Domain 계층은 애플리케이션의 비즈니스 로직을 처리하는 계층입니다.
이 계층은 외부 시스템(API, DB 등)과 독립적으로 작동하도록 설계되어야 합니다.

하위 디렉토리 설명

  1. entity
    • 애플리케이션의 핵심 데이터 모델을 정의합니다.
    • DTO와는 달리 외부 데이터 소스(API, DB 등)에 의존하지 않습니다.
    • 비즈니스 로직과 도메인 규칙을 포함할 수 있습니다.
  2. repository
    • Domain 계층의 repository interface가 위치합니다.
    • 데이터 소스에 접근하기 위한 추상화를 제공합니다.
    • 구현은 Data 계층에서 처리됩니다.
  3. usecase
    • 비즈니스 로직을 처리하는 클래스가 위치합니다.
    • 각 유스케이스는 단일 작업(예: 영화 목록 가져오기, 영화 상세 정보 불러오기)을 처리합니다.
    • Repository를 의존성으로 주입받아 데이터를 처리합니다.

 

presentation

Presentation 계층은 UI와 관련된 코드를 포함하며, 화면을 구성하고 사용자의 입력을 처리합니다.

하위 디렉토리 설명

  1. pages
    • 각 화면(View)에 관련된 코드가 모여 있는 디렉토리입니다.
    • 일반적으로 **화면(View)**와 ViewModel로 구성됩니다.
  2. widgets
    • 앱에서 재사용 가능한 UI 컴포넌트를 모아놓는 디렉토리입니다.
    • 예: 커스텀 버튼, 카드, 리스트 아이템 등.

 

3. 흐름 요약

데이터 흐름

  1. 사용자 입력:
    • 사용자가 UI에서 동작을 실행합니다.
    • 예: 영화 목록 페이지가 로드됨.
  2. Presentation 계층:
    • ViewModel이 UseCase를 호출해 데이터를 요청합니다.
  3. Domain 계층:
    • UseCase가 Repository Interface를 호출합니다.
    • Repository Interface는 Domain 계층에서 정의된 비즈니스 규칙과 데이터를 사용합니다.
  4. Data 계층:
    • Repository 구현체가 Data Source(API, DB 등)와 상호작용합니다.
    • Data Source는 데이터를 가져와 DTO로 변환한 뒤 Entity로 매핑합니다.
  5. 결과 반환:
    • 데이터를 가공하여 Presentation 계층(ViewModel)로 전달합니다.
    • UI(View)가 데이터를 표시합니다.

 

4. 장점

  • 유지보수성: 각 계층이 독립적으로 설계되어 변경이 쉬움.
  • 테스트 용이성: 각 계층을 독립적으로 Mocking하여 테스트 가능.
  • 의존성 관리: Domain 계층이 Data/Presentation 계층에 의존하지 않아 확장성이 높음.