Android

[ISSUE]org.gradle.api.CircularReferenceException: Circular dependency between the following tasks

중곰 2025. 3. 25. 19:22

 

안녕하세요.

 

자체적으로 멀티 모듈화 작업을 해보다가 순환 참조 이슈에서 바보같은 실수를 하게 되어 정리하고자 글을 남깁니다.

 

Now in Android 모듈화와 Android Architecture에 맞게 모듈화 작업을 해보는 과정에

" org.gradle.api.CircularReferenceException: Circular dependency between the following tasks "

이슈가 발생 되었습니다.

 

문제 원인

* 고수준 모듈이 저수준 모듈에 직접 의존

최종 구조

* 고수준 모듈이 자신이 정의한 인터페이스에만 의존

* 저수준 모듈이 이 인터페이스를 구현

 

조금 더 살펴보면

문제발생 된 부분을 보면

* 의존성 흐름 : feature/diary → domain → data → datastore

* DIP 준수 : 클린아키텍처의 레이어 방향을 준수

* 문제점

  - 빌드 시스템에서 순환 참조가 발생 (gradle 수준)

  - Clean Architecture에서는 의존성 방향이 바깥쪽(UI)에서 안쪽(domain)으로 향해야 합니다.

 

해결 방법으로 저는 app module에서 중앙 관리화를 선택하여 NIA 와 다른 형태로 진행하였습니다.

 

1. app Module 중앙관리형

dependencies {
    implementation(projects.core.domain)
    implementation(projects.core.data)
    implementation(projects.core.datastore)
    
    implementation(projects.feature.dairy)
    ....
}

              

- Gradle의 모든 의존성을 해결하여 중앙 관리 방식으로 빌드 시점에 의존성을 해결하게 됩니다.

domain
  ↓ (repository interface)
data
  ↓ (datastore interface)
datastore

 이유 : 해당 구조로 인해서 수정하였습니다.

 

그럼 NIA 와 차이는 무엇인지를 보면,

NIA:
domain (repository interface)
  ↓
data (repository implementation)
  ↓
datastore (data source implementation)

현재:
domain (repository interface)
  ↓
data (repository implementation + datastore interface)
  ↓
datastore (datastore implementation + data model 참조)

 

이렇게 해서 구조화와 각 모듈의 의존성을 어떻게 할 것인가에 대한 차이로 인한 

순환 참조 이슈가 발생되었습니다.

 

이로 인해 멀티 모듈화 할때 어떻게 모듈의 의존성을 가져갈것인가를 다시 살펴볼 수 있는 기회가 되었던것 같습니다.

 

반응형