View - ViewModel - Repository - DataSource 라는 네 가지 주요 계층을 기반으로 프로젝트 구조를 설계해보았다. 최대한 불필요한 것들은 제외하고, 서로의 역할을 분리해주어 유지보수와 확장성을 극대화할려고 시도한 구조이다.

ViewView는 사용자가 직접 상호작용하는 UI를 담당하는 계층이다.
• 사용자 인터페이스 표시: 화면에 UI 요소를 렌더링한다.
• 사용자 입력 전달: 사용자가 입력한 데이터를 ViewModel에 전달하여 상태를 업데이트하도록 한다.
View는 ViewModel에 직접 의존하여 데이터를 표시하고, 사용자의 인터랙션을 처리한다. 이 계층에서는 UI 상태 관리 외의 비즈니스 로직이나 데이터 처리 로직은 전혀 포함되지 않으며, 단순히 화면과 사용자의 상호작용을 담당한다.
ViewModelViewModel은 UI의 상태를 관리하고, 화면에 표시할 데이터를 가공하는 역할을 한다.
또한, 간단한 비즈니스 로직을 처리하며, Repository를 통해 데이터를 가져오거나 저장한다.
View에 전달한다. Repository 호출: 데이터를 가져오거나 저장할 때 Repository를 호출하여, 필요한 데이터를 처리한다.ViewModel은 View와 Repository 사이의 중재자 역할을 한다. 이 계층에서 복잡한 비즈니스 로직을 처리하는 것보다는, 간단한 변환 작업이나 검증 작업을 맡고, 더 복잡한 로직은 나중에 Domain Layer로 분리할 수 있다.
RepositoryRepository는 데이터 처리 로직을 담당하며, DataSource에서 데이터를 가져오고 이를 ViewModel이 이해할 수 있는 형태로 변환하여 제공한다. 또한, 데이터를 저장하는 역할도 한다. 주요 역할은 다음과 같다:
DataSource와의 인터페이스 역할: 데이터의 출처(API, 데이터베이스 등)와의 상호작용을 담당한다.
데이터 변환: DataSource에서 가져온 원시 데이터를 도메인 객체로 변환한다. 예를 들어, DataSource에서 가져온 JSON 데이터를 User와 같은 도메인 객체(비즈니스 객체)로 변환하여 ViewModel에 제공한다.
데이터 저장: 데이터를 DataSource에 저장하는 역할도 맡는다. 예를 들어, 사용자 데이터를 데이터베이스나 로컬 저장소에 저장하는 등의 작업을 수행한다.
Repository는 데이터의 출처와 형태를 추상화하여 ViewModel에 데이터를 제공하는 중요한 역할을 한다.
DataSourceDataSource는 실제 데이터를 처리하는 계층이다. 데이터는 API, 데이터베이스, 로컬 저장소 등에서 가져올 수 있으며, CRUD 작업을 수행한다. 주요 역할은 다음과 같다:
데이터 가져오기: API 호출, 데이터베이스 쿼리, 로컬 저장소에서 데이터를 가져온다.
데이터 저장 (Create, Update, Delete) : 새로운 데이터를 DataSource에 저장한다.
API 호출: 외부 API를 호출하여 데이터를 생성, 수정, 삭제한다.
ex) UserApi 클래스의 createUser() 메서드는 새로운 사용자 정보를 API 서버에 전송하여 사용자 계정을 생성한다.
데이터베이스 갱신: 로컬 데이터베이스에 데이터를 삽입, 수정, 삭제한다.
ex) ProductDatabase 클래스의 updateProduct() 메서드는 로컬 데이터베이스에서 상품 정보를 수정한다.
로컬 저장소 쓰기: 파일, Shared Preferences 등 로컬 저장소에 데이터를 write한다.
ex) UserLocalDataSource 클래스의 saveUserSession() 메서드는 Shared Preferences에 사용자 세션 정보를 저장한다.
DataSource는 실제 데이터를 저장하고 가져오는 작업만을 수행하며, 비즈니스 로직은 포함하지 않는다. 이 계층은 단순히 데이터를 제공하고 처리하는 역할과 데이터 출처에 대한 구체적인 구현만을 담당합니다.
예를 들어, Dio와 같은 HTTP 클라이언트를 사용하여 API를 호출하고, sqflite와 같은 데이터베이스 라이브러리를 사용하여 데이터베이스 쿼리를 실행한다.
Domain Layer의 추가현재 구조는 View-ViewModel-Repository-DataSource로 간단하게 구성되어 있지만, 앱이 커짐에 따라 Domain Layer를 추가할 수 있다. Domain Layer는 비즈니스 로직을 담당하는 계층으로, 주로 UseCase를 포함하고 있다. UseCase는 특정 도메인 로직을 처리하고, 필요한 데이터는 Repository에서 가져온다.
Domain Layer는 확장성 있는 프로젝트에서 비즈니스 로직을 집중적으로 관리할 수 있게 해준다. 예를 들어, 여러 Repository나 DataSource를 조합하여 복잡한 비즈니스 로직을 처리하는 기능을 추가할 수 있다.