Dev/Flutter

Flutter/Dart 와 함께 클린 아키텍쳐 학습하기

healthyryu 2025. 8. 21. 13:48

Clean Architecture 는 각 계층의 역할을 정확히 이해하면 유지보수가 쉽고 확장 가능한 앱을 만들 수 있는 설계 방법론

로버트 C. 마틴이 제안한 소프트웨어 설계 원칙, 코드를 독립적인 계층으로 분리하여 각 계층이 명확한 책임을 갖도록 하는 구조

 

핵심 목표

- 관심사의 분리 : UI, 비즈니스 로직, 데이터 처리 등 명확히 구분

- 의존성 관리 : 안쪽 계층이 바깥쪽 계층에 의존하지 않도록 설계

- 테스트 용이성 : 각 계층을 독립적으로 테스트 가능

- 유지보수성 : 한 계층의 변경이 다른 계층에 미치는 영향 최소화

 

 

3개 주요 계층

1. Presentation Layer (표현 계층)

- 역할 : 사용자 인터페이스와 상호작용 처리

- 구성요소 : Page, Widget, 상태관리(BLoC, Riverpod, Provider)

- 특징 : Flutter에 의존적, UI 로직만 포함, 비즈니스 로직 없음

- 데이트 흐름 : Domain Layer 의 UseCase 호출하여 데이터 획득(?)

 

2. Domain Layer (도메인 계층)

- 역할 : 핵심 비즈니스 로직과 규칙 관리

- 구성요소 : Entities, UseCase, Repository Interface

- 특징 : 순수 Dart 코다, 프레임워크에 독립적, 가장 안정적인 계층 

- 핵심 개념 : 애플리케이션의 비즈니스 규칙을 캡슐화

 

3. Data Layer (데이터 계층)

- 역할 : 외부 데이터 소스와의 상호작용

- 구성요소 : Repository 구현체, Data Source, Model(DTO-Data Transfer Objects)

- 특징 : API, 로컬DB접근, JSON 변환 처리, 캐싱 구현 등.

 

 

Domain Layer 의 Entity 와 Data Layer 의 Model 은 생김새는 비슷하나 목적이 다릅니다.

Data Layer 의 Model 의 경우는 외부 데이터를 내부에서 사용하는 객체로 변환을 합니다. API 값을 가져오거나 보내거나(fromJson(), toJson()) 데이터베이스 값을 가져올때 사용하며, 실제로 앱 내에서의 모델은 Domain Layer 의 Entity 입니다.

 

Model

class UserModel {
  final int id;
  final String name;
  final String email;

  const UserModel({
    required this.id,
    required this.name,
    required this.email
  });

  factory UserModel.fromJson(Map<String, dynamic> json) {
    return UserModel(
      id: json['id'] as int,
      name: json['name'] as String,
      email: json['email'] as String
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email
    };
  }

  User toEntity() {
    return User(
      id: id,
      name: name,
      email: email
    );
  }
}

 

Entity

class User {
  final int id;
  final String name;
  final String email;

  const User({
    required this.id,
    required this.name, 
    required this.email
  });

  // 기타 메서드
  ...
}
반응형