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
});
// 기타 메서드
...
}
'Dev > Flutter' 카테고리의 다른 글
[강의자료] Json 무엇이고 Dart 에서 어떻게 사용할까? (3) | 2025.07.25 |
---|---|
Android Emulator 안드로이드 에뮬레이터 Light, Dark 모드 전환 (0) | 2025.07.16 |
Dart 에서 Collection Map 을 알아보자 (0) | 2025.06.25 |
Flutter 빌드 오류 (0) | 2025.06.16 |
Flutter iOS Android 폴더 생성 (0) | 2025.06.08 |