도메인 레이어
도메인 레이어는 복잡한 비즈니스 로직이나 여러 ViewModel에서 재사용되는 간단한 비즈니스 로직의 캡슐화를 담당합니다. 모든 앱에 이러한 요구사항이 있는 것은 아니므로 이 레이어는 선택사항입니다. 따라서 복잡성을 처리하거나 재사용성을 선호하는 등 필요한 경우에만 도메인 레이어를 사용해야 합니다.
- 코드 중복을 방지합니다.
- 도메인 레이어 클래스를 사용하는 클래스의 가독성을 개선합니다.
- 앱의 테스트 가능성을 높입니다.
- 책임을 분할하여 대형 클래스를 방지합니다.
이러한 클래스를 간단하고 가볍게 유지하려면 각 사용 사례에서는 기능 하나만 담당해야 하고 변경 가능한 데이터를 포함해서는 안 됩니다. 대신 개발자가 UI 레이어 또는 데이터 레이어의 변경 가능한 데이터를 처리해야 합니다.
종속 항목
일반적인 앱 아키텍처에서 UseCase는 UI레이어의 ViewModel과 데이터 레이어의 Repository 사이에 적합합니다.
UseCaseㄴ는 재사용 가능한 로직을 포함하기 때문에 다른 UseCase에 의해 사용될 수도 있습니다. 도메인 레이어에 여러 수준의 UseCase가 있는 것은 정상입니다.
예를 들어 아래 예에 정의된 사용 사례는 UI 레이어의 여러 클래스가 시간대를 사용하여 화면에 적절한 메시지를 표시하는 경우 FormatDateUseCase를 사용할 수 있습니다.
class GetLatestNewsWithAuthorsUseCase(
private val newsRepository: NewsRepository,
private val authorsRepository: AuthorsRepository,
private val formatDateUseCase: FormatDateUseCase
) { /* ... */ }
수명 주기
사용 사례는 고유한 수명 주기를 갖지는 않습니다. 대신 그 사용 사례를 사용하는 클래스로 범위가 지정됩니다. 즉, UI 레이어의 클래스에서, 서비스에서 또는 Application 클래스 자체에서 사용 사례를 호출할 수 있습니다. 사용 사례는 변경 가능한 데이터를 포함해서는 안 되므로 개발자가 사용 사례 클래스의 새 인스턴스를 종속 항목으로 전달할 때마다 그 인스턴스를 만들어야 합니다.
Threading
도메인 레이어의 UseCase는 기본안정성을 갖추어야 합니다. 즉, Main Thread 로부터 안전하게 호출되어야 합니다. UseCase는 long-running blocking 작업을 실행하는 경우 관련 로직을 적절한 스레드로 옮깁니다. 그러나 그 작업 전에 개발자는 계층 구조에서 그러한 차단 작업이 더 잘 배치되는 다른 레이어가 있는지 확인합니다.
일반적으로 복잡한 계산은 재사용이나 캐싱을 유도하기 위해 데이터 레이어에서 이루어집니다.
예를 들어 결과를 캐시하여 앱의 여러 화면에서 재사용해야 하는 경우 대용량 목록을 대상으로 한 리소스 집약적인 작업은 도메인 레이어보다 데이터 레이어에 더 잘 배치됩니다.
class MyUseCase(
private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
suspend operator fun invoke(...) = withContext(defaultDispatcher) {
// Long-running blocking operations happen on a background thread.
}
}
저장소 결합
로직은 여러 저장소와 관련되어 있고 복잡해질 수 있으므로 GetLatestNewsWithAuthorsUseCase 클래스를 만들어 ViewModel에서 로직을 추상화하고 가독성을 높일 수 있습니다. 또한 로직을 보다 쉽게 개별적으로 테스트하고 앱의 다른 부분에서 재사용할 수도 있습니다.
'Android' 카테고리의 다른 글
[Android] Kakao Login 구현하기2 - 프로젝트 설정 (0) | 2023.09.30 |
---|---|
[Android] Kakao Login 구현하기1 - 기본 설정 (1) | 2023.09.30 |
[Android] 데이터 레이어 (0) | 2023.09.29 |
[Android] UI 레이어 - 이벤트와 상태 (0) | 2023.09.29 |
[Android] 앱 아키텍처 UI레이어와 UiState (0) | 2023.09.28 |
댓글