728x90
# Repository
- Repository는 데이터 소스 (Local 및 Remote) 와 상호 작용하는 메서드를 정의하는 인터페이스이다. 이는 애플리케이션과 데이터 소스(예: 네트워크 API, 로컬 데이터베이스) 사이의 추상화 계층을 제공한다.
- 이를 사용하면 데이터 소스가 변경되거나 다양화되어도 애플리케이션 나머지 부분에 미치는 영향을 최소화할 수 있다.
- Domain Module 에서 Interface 를 구현한다.
# RepositoryImpl
- 실제 데이터 소스와의 상호 작용을 처리하며, Repository 인터페이스에서 정의된 메서드를 구현. 이 구현체는 데이터를 가져오고, 변환하며, 애플리케이션에 필요한 형식으로 데이터를 제공한다. **RepoImpl**을 사용함으로써 데이터 관련 로직을 한 곳에서 관리할 수 있어 코드의 중복을 방지하고 유지보수를 용이하게 한다
- Data Module 에서 Domain Module 의 Interface 를 의존하며, 이에 대한 내부 로직을 구현한다.
- RepositoryImpl 을 통해서 Domain Module 은 의존성 역전 원칙을 이용해 Data Module 에서 데이터를 전달받을 수 있다.
# UseCase
- 비즈니스 로직을 캡슐화하는 단위
- 애플리케이션의 특정 비즈니스 요구 사항을 충족하는 하나의 작업을 담당합니다. UseCase는 **Repository** 를 사용하여 필요한 데이터를 가져오고, 이 데이터를 처리하여 사용자에게 필요한 결과를 제공한다.
- 이를 사용함으로 인해 비즈니스 로직을 UI 또는 프레젠테이션 로직으로부터 분리할 수 있어, 애플리케이션의 다른 부분과 독립적으로 비즈니스 로직을 개발하고 테스트가 가능하다.
- 단일 책임 원칙에 따라 하나의 기능만을 구현해도 되지만, 필수 권장사항은 아니다
장점
- 유지보수의 용이성: 코드의 각 부분이 분리되어 있어 변경이 필요한 경우 해당 부분만 수정하면 된다.
- 테스트의 용이성: 각 구성 요소를 독립적으로 테스트할 수 있다
- 유연성과 확장성: 새로운 데이터 소스나 비즈니스 로직을 추가하는 것이 쉽다.
- 응집도와 결합도의 균형: 각 구성 요소가 특정한 역할과 책임을 가지며, 필요한 경우에만 다른 구성 요소와 상호 작용 가능하다.
# 종합하여 사용해보기
// Domain Module
data class Post(
val title: String,
val content: String
)
interface BlogTestRepository {
fun getPost(): Post
}
class GetPostUseCase @Inject constructor(
private val repository: BlogTestRepository
) {
operator fun invoke(): Post = repository.getPost()
}
// Data Module
class BlogTestRepositoryImpl(
remoteDataSource: RemoteDataSource
): BlogTestRepository {
override fun getPost(): Post {
return remoteDataSource.getPostDto().toDomain()
}
}
- Domain Module 에서 GetPostUseCase 는 repository 를 의존하고, invoke 메소드로 repository.getPost() 를 호출한다
- BlogTestRepository 는 Interface 로 생성되었으며, 내부 추상화 함수는 getPost 로 Post 를 Return 하도록 설정하였다.
- Data Module 에서는 BlogTestRepository 의 구현체로 BlogTestRepositoryImpl 클래스를 생성하였으며, 이곳에서 실제 네트워크 통신을 처리하고, Post 를 Return 하도록 설정했다.
위의 예시는 아주 간단히 처리하였으면서도, 일반적으로 사용되는 방법이다.
이러한 예시를 따라서 Repository 및 UseCase Pattern 을 사용하고 테스트 용이성의 증가, 코드 재사용성을 늘리며 클린 코드를 작성해보도록 하자
728x90
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android] 안드로이드 10초만에 한 프로젝트의 앱을 빌드 타입에 따라 나눠 설치하는 방법 (0) | 2024.10.01 |
---|---|
[Android] Google 에서 제공해주는 오픈소스 라이선스 관리용 라이브러리 (1) | 2024.09.29 |
[Android] 안드로이드 멀티모듈 (Multi-Module) 의 정의와 사용 이유를 알아보자 (0) | 2024.09.28 |
[Android] 안드로이드 클린 아키텍처 (Clean Architecture) 에 대해서 알아보자 (4) | 2024.09.28 |
[Android] Django 로컬 서버 (localHost) 를 Android 에서 연동하는법 (0) | 2024.09.27 |