프로젝트 멀티모듈 적용
F-lab에서 멀티모듈로 프로젝트를 진행하고 있는데 프로젝트 구성을 현재 같이 프로젝트를 진행 하는 분께서 멀티 모듈을 구성했다. 나도 직접 처음부터 멀티 모듈 구성을 적용해보고 싶어서 코테 과제 속에 적용해보았고, 그 과정 속에서 겪은 시행착오를 정리해보고자 한다.
문제의 발생
처음 모듈 구성
app(presentation)
data (remote 포함)
domain
모듈 의존성
app -> domain
data -> domain
모듈 내부 구성
data - repositoryImpl, datasource, retrofit
domain - usecase, repository interface, usecase hilt 모듈
app - activity와 viewModel
우선 처음에 data와 domain 모듈을 완성하고 빌드했을 때 성공을 했기 때문에 app까지 추가 진행을 하였고 테스트를 위해 앱을 빌드하는 순간
error: [Dagger/MissingBinding] domain.repository.XXXRepository cannot be provided without an @Provides-annotated method
문제와 마주하게 되었다. 처음 에러와 마주했을 때는 repository module을 만들어줬는데 왜 찾을 수 없지? 원인을 알아내지 못한 채 이런 저런 방법을 다 시도하다가 아예 다른 예제 프로젝트를 참고하여 모듈 구조를 변경 해보았다.
변경 모듈 구성
app
presentation
data
domain
모듈 의존성
app -> data, domain, presentation
data -> domain
presentation -> domain
그리고 hilt의 module class들을 app 모듈에 넣었고 빌드에 성공했다.
문제 원인 파악 과정
첫 모듈에서 왜 의존성을 찾지 못하는 문제가 발생했는가에 대해 아래 두가지의 연결고리를 찾다가 원인을 알게 되었다.
- data와 domain단을 완성해서 빌드를 했을 때는 문제 없이 빌드 되었다가 viewmodel과 연결하는 순간 왜 문제가 발생했을까
- 첫번째 모듈 구성과 두번째 모듈 구성에서 실패와 성공의 차이는 무엇일까
-> A가 B를 의존하고 있고 B과 C를 의존하고 있으면 A와 C 사이에도 의존 관계가 성립힌다
-> 하나의 모듈은 dependencies에 추가하지 않은 다른 모듈에 있는 클래스를 참조할 수 없다
이말인 즉슨,
ViewModel이 Usecase를 의존하고 있고 Usecase는 Repository를 의존 관계가 있으므로 Viewmodel과 Repository는 의존관계가 성립한다.
첫번째 구조에서,
app이 domain 모듈을 dependencies에 추가했기 때문에 usecase 의존성은 얻을 수 있었지만 data 모듈은 추가하지 않았기 때문에 data 모듈에 있던 repository를 찾지 못했던 것이었고,
반면에 두번째 구조는,
app 모듈에서 presentation, data, domain을 모듈을 모두 dependencies에 추가했기 때문에 모든 의존관계를 찾아서 주입할 수 있었던 것이었다.
그래서
첫번째 app 모듈 dependencies에 data 모듈을 추가해봤더니 실패했던 빌드가 성공하는 걸 확인할 수 있었다.
시간을 많이 투자한 것에 비해 해결책이 간단해서 약간 허무했지만 답답했던 속이 뚫리는 기분이 들었다. 대거&힐트 작동 방식에 대해서 다시 정리해야 겠다.
요즘 레이어 별로 모듈을 따로 구성함으로서 철저하게 의존성 분리가 되는 걸 경험하게 되면서, 회사에서도 클린 아키텍처에 DI를 적용했었는데 그동안 클린 아키텍처를 제대로 적용하고 있었나 되돌아 보고 있는 중이다...
'TIL' 카테고리의 다른 글
22/08/06 TIL (0) | 2022.08.06 |
---|---|
2022/07/17 TIL (0) | 2022.07.17 |
2022/07/15 TIL (0) | 2022.07.15 |
2022/07/14 TIL (0) | 2022.07.15 |