본문 바로가기
프로그래밍/안드로이드

[Android] 안드로이드 Repository Pattern 및 UseCase Pattern 에 대해서 간단히 알아보자

by dev_gyu 2024. 9. 29.
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()
    }
}

 

  1. Domain Module 에서 GetPostUseCase 는 repository 를 의존하고, invoke 메소드로 repository.getPost() 를 호출한다
  2. BlogTestRepository 는 Interface 로 생성되었으며, 내부 추상화 함수는 getPost 로 Post 를 Return 하도록 설정하였다.
  3. Data Module 에서는 BlogTestRepository 의 구현체로 BlogTestRepositoryImpl 클래스를 생성하였으며, 이곳에서 실제 네트워크 통신을 처리하고, Post 를 Return 하도록 설정했다.

위의 예시는 아주 간단히 처리하였으면서도, 일반적으로 사용되는 방법이다.

이러한 예시를 따라서 Repository 및 UseCase Pattern 을 사용하고 테스트 용이성의 증가, 코드 재사용성을 늘리며 클린 코드를 작성해보도록 하자 

 
 
728x90