MultiModule을 구현할때, DI를 통해 주입받는 경우가 많이 생깁니다.
아래는 예시인 ViewModel입니다.
@HiltViewModel
class DustViewModel @Inject constructor(
private val dustRepository: DustRepository
) : ViewModel() {
private var _uiState: MutableStateFlow<DustUiState> =
MutableStateFlow<DustUiState>(DustUiState.Loading)
val uiState = _uiState.asStateFlow()
}
sealed interface DustUiState {
object Loading : DustUiState
data class Error(val throwable: Throwable) : DustUiState
data class Success(val data: List<String>) : DustUiState
}
여기서 dustRepository를 쓰고 타입을 지정할때, RepositoryImp이 눈에 띕니다.
마틴 형님의 클린 아키텍처는 프레젠테이션 레이어가 도메인 레이어를 바라보고,
도메인 레이어가 Interface를 가지며, 데이터 레이어의 역전을 거치기 때문에
프레젠테이션 레이어에서는 추상화된 Interface만 보이게 됩니다.
하지만 Google이 내세우는 Clean Architecture는 도메인 레이어를 Optional한 레이어로 보고있으며 재사용 가능한 Usecase의 집합 으로 보고 있습니다.
이럴경우 구상 객체에 internal
연산자를 붙여주는것이 좋습니다.
interface DustRemoteSource {
suspend fun fetchDustList(numOfRows: Int, pageNo: Int, sidoName: String): NetworkDust
}
//internal 추가
internal class DustRemoteSourceImp @Inject constructor(
private val api: DustAPI
) : DustRemoteSource {
override suspend fun fetchDustList(numOfRows: Int, pageNo: Int, sidoName: String): NetworkDust {
return api.fetchDustList(
serviceKey = API_KEY,
returnType = RETURN_TYPE,
numOfRows = 0,
pageNo = 0,
sidoName = sidoName
)
}
internal
을 붙이면 자동 완성 시, 구상 객체가 나오지 않게 됩니다.
감사합니다! <3