[ISSUE]org.gradle.api.CircularReferenceException: Circular dependency between the following tasks
안녕하세요.
자체적으로 멀티 모듈화 작업을 해보다가 순환 참조 이슈에서 바보같은 실수를 하게 되어 정리하고자 글을 남깁니다.
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 참조)
이렇게 해서 구조화와 각 모듈의 의존성을 어떻게 할 것인가에 대한 차이로 인한
순환 참조 이슈가 발생되었습니다.
이로 인해 멀티 모듈화 할때 어떻게 모듈의 의존성을 가져갈것인가를 다시 살펴볼 수 있는 기회가 되었던것 같습니다.