UseCase 사용의 이유, ViewModel에서 Repository를 직접 연결하면 안될까?

2025. 2. 21. 16:58개발/소프트웨어 디자인 패턴

728x90
반응형

Nia 프로젝트를 참고하여 Network 모듈을 만들고 API를 연결하고 있었는데,

ViewModel에서 어떤건 Repository를 직접 연결하고 어떤건 UseCase를 이용하여 통신을 했다.

그렇다면 이 두개는 어떤 기준으로 달라진걸까?

1. Repository는 언제 사용하는가?

Repository는 “데이터를 어떻게 가져올 것인지”에 대한 역할을 한다.

따라서 Repository를 바로 연결하는 것은 단순 데이터 조회인 경우에 사용할 수 있다.

1️⃣ 구조

ViewModel → Repository → DataSource (API, DB 등)

2️⃣ 장점

  • 구조가 단순하여 코드가 직관적이다.
  • 작은 규모의 프로젝트에서 빠르게 개발할 수 있다.

3️⃣ 단점

  • ViewModel이 비즈니스 로직을 직접 다루게 되어 책임이 증가함.
  • 여러 ViewModel에서 동일한 로직을 사용할 경우 중복 코드가 발생할 수 있음.
  • 유닛 테스트 시 ViewModel이 Repository에 강하게 결합되어 있어 테스트하기 어려움.

4️⃣사용 예) 데이터를 가져오거나 저장할 때 (Data Layer)

  • 데이터 소스를 추상화하는 역할 (API, DB, SharedPreferences 등)
  • ViewModel이나 UseCase에서 데이터를 요청할 때 사용
interface UserRepository {
    suspend fun getUser(userId: String): User
}
class UserRepositoryImpl(private val apiService: ApiService) : UserRepository {
    override suspend fun getUser(userId: String): User {
        return apiService.getUser(userId)
    }
}

API에서 데이터를 불러오거나, DB에서 캐싱하는 등의 작업을 처리하는 Data Layer의 역할을 한다.

2. UseCase는 언제 사용하는가?

UseCase는 "데이터를 어떻게 사용할 것인지"에 대한 역할을 한다.

따라서 조회한 데이터를 가공하고 저장하고 UI를 업데이트 할 때 사용할 수 있다.

1️⃣ 구조

ViewModel → UseCase → Repository → DataSource

2️⃣ 장점

  • ViewModel에서 비즈니스 로직을 분리하여 **관심사 분리(SRP, Single Responsibility Principle)**를 적용.
  • 여러 ViewModel에서 같은 UseCase를 사용할 수 있어 코드 중복을 줄일 수 있음.
  • UseCase 단위로 테스트가 가능하여 유닛 테스트가 쉬워짐.

3️⃣ 단점

  • 구조가 조금 더 복잡해짐.
  • 작은 프로젝트에서는 과한 구조가 될 수도 있음.

4️⃣ 비즈니스 로직이 필요할 때 (Domain Layer)

  • 데이터를 가져온 후 추가적인 로직이 필요할 때
  • 여러 개의 Repository를 조합해서 사용할 때
  • 여러 ViewModel에서 같은 로직을 공유할 때
class GetUserUseCase(private val userRepository: UserRepository) {
    suspend operator fun invoke(userId: String): User {
        val user = userRepository.getUser(userId)
        return user.copy(name = user.name.uppercase()) // 비즈니스 로직 추가
    }
}

3. 프로젝트에 적용하는 기준

  • 단순한 데이터 가져오기만 필요할 때 ⇒ Repository
  • 여러 Repository에서 데이터를 가져와야 할 때 ⇒ UseCase
  • 데이터를 변환, 필터링, 가공하는 로직이 필요할 때 ⇒ UseCase
  • 여러 ViewModel에서 같은 로직을 사용해야 할 때 ⇒ UseCase

따라서

  • 데이터 저장/조회만 필요하면 Repository를 사용
  • 비즈니스 로직이 필요하거나 여러 Repository를 조합해야 하면 UseCase를 사용
728x90
반응형