[Android]internal 한정자를 애용하자

0
post-thumbnail

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

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글