Clean Architecture
클린 아키텍쳐는 소프트웨어 개발에서 매우 중요한 개념입니다. 이 아키텍쳐는 코드의 유지보수성과 확장성을 높이기 위해 계층을 분리하는 데 중점을 두고 있습니다. 클린 아키텍쳐를 이해하기 위해서는 그 기본 개념과 필요성을 먼저 알아보는 것이 중요합니다.
클린 아키텍처의 정의
클린 아키텍쳐는 로버트 C. 마틴(Robert C. Martin)이라는 소프트웨어 엔지니어가 제안한 아키텍쳐 패턴입니다. 이 아키텍쳐는 소프트웨어의 각 구성 요소를 명확하게 분리하여, 서로의 의존성을 최소화하고, 변경이 용이하도록 설계되었습니다. 클린 아키텍쳐는 일반적으로 여러 개의 계층으로 구성되며, 각 계층은 특정한 역할을 수행합니다.
주요 구성 요소
- Entities
- 엔티티는 비즈니스의 핵심 개념을 나타내는 객체
- 예) User, Product 클래스
- Use Cases
- 유스케이스는 사용자가 시스템을 어떻게 사용할지를 정의하는 애플리케이션의 특정 기능
- 예) 회원가입, 상품등록
- Interface Adapters
- Use Cases 와 Frameworks and Drivers 사이의 중간 연결 역할
- 예) Controller, Presenter, ViewModel
- Frameworks and Drivers
- 시스템 핵심 업무와는 상관없는 계층
- 예) Web, Database, UI, 외부 API 등
이러한 구조는 각 계층이 독립적으로 개발되고 테스트될 수 있도록 도와줍니다.
Flutter에서의 클린 아키텍처 적용
Flutter에서 위의 구조를 다음과 같이 표현할 수 있습니다:
계층 구조
- Presentation Layer
- UI와 같은 화면 표시 및 사용자 입력 처리 계층
- ViewModel, Widget
- Domain Layer:
- 시스템의 비즈니스 로직을 담고 있는 핵심 계층
- Entity : 데이터 모델 클래스 (예. User 클래스)
- UseCase : Entity로 해야할 일 정의(예. 회원가입, 정보수정)
- 시스템의 비즈니스 로직을 담고 있는 핵심 계층
- Data Layer
- 데이터 소스(예: 데이터베이스, API)와 관련된 작업을 처리하는 계층
- Repository : 데이터 처리 방식 결정, Entity 전달
- DataSource : 네트워크 통신, 내부DB와 연동 등을 통해서 데이터 CRUD
- 데이터 소스(예: 데이터베이스, API)와 관련된 작업을 처리하는 계층
의존성 문제 해결
단순하게 계층을 나누어서 적용하게 되면 문제가 발생할 수 있습니다. 외부에서 내부로만 의존성이 있어야 하는데, 반대의 경우가 발생하면 독립성이 낮아지고 의존성이 서로 높아지게 됩니다. 이를 해결하기 위해 클린 아키텍처를 적용할 때 수정이 필요합니다.
개선된 구조
위의 표는 interface를 추가하여 클린 아키텍쳐를 적용한 구조 예시 입니다.
의존하고 있는 부분에 인터페이스를 두어 의존성이 단방향으로 흐르게 수정합니다. 또한, DTO(Data Transfer Object)를 사용하여 DataSource에서 Entity에 의존하지 않도록 구현합니다.
간단한 디렉토리 구조 예시
클린 아키텍쳐를 적용한 간단한 디렉토리 구조 예시는 다음과 같습니다:
lib/
├─ data/
│ ├─ data_source/
│ │ ├─ movie_remote_data_source.dart # 영화 데이터를 가져오는 원격 데이터 소스
│ │ └─ movie_local_data_source.dart # 영화 데이터를 저장하는 로컬 데이터 소스
│ ├─ dto/
│ │ └─ movie_dto.dart # 영화 데이터를 전송하기 위한 DTO
│ └─ repository/
│ └─ movie_repository_impl.dart # MovieRepository 구현체
├─ domain/
│ ├─ entity/
│ │ └─ movie.dart # 영화 엔티티 클래스
│ ├─ repository/
│ │ └─ movie_repository.dart # MovieRepository 인터페이스
│ └─ usecase/
│ └─ get_movies.dart # 영화 목록을 가져오는 유스케이스
└─ presentation/
├─ pages/
│ └─ movie_list/
│ ├─ movie_list.dart # 영화 목록 화면
│ └─ movie_list_view_model.dart # 영화 목록 뷰모델
└─ widgets/
└─ movie_card.dart # 영화 카드 위젯
위와 같은 구조는 각 계층의 역할을 명확히 하고, 코드의 가독성을 높이는 데 도움을 줍니다. 각 디렉토리에는 해당 계층에서 필요한 파일들이 위치하게 되며, 이를 통해 프로젝트의 구조를 쉽게 이해할 수 있습니다.
마무리 및 참고 자료
클린 아키텍쳐는 소프트웨어 개발에서 매우 유용한 패턴입니다. 이를 통해 코드의 유지보수성과 확장성을 높일 수 있으며, 팀원 간의 협업을 원활하게 할 수 있습니다. Flutter와 Swift에서 클린 아키텍쳐를 적용하는 방법을 이해하고, 간단한 디렉토리 구조를 통해 실제 프로젝트에 적용해보는 것이 중요합니다.
'Flutter' 카테고리의 다른 글
flutter Statefulwigets 생명주기 (0) | 2025.01.15 |
---|---|
Flutter : Provider 와 Riverpod (0) | 2025.01.14 |
Firebase 쉽게 연결하기 (1) | 2024.12.20 |
Navigation VS GoRouter (0) | 2024.12.20 |
선언형 UI (0) | 2024.11.21 |