상세 컨텐츠

본문 제목

나만의 안드로이드 앱 만들기(초보자 편) - DI (6-5)

나만의 안드로이드 앱 만들기/초급자

by Victorywskim 2023. 11. 11. 14:00

본문

반응형

이번 편에서는 di 에 대해 설명드리겠습니다.

 

전체 코드는 다음과 같습니다.

https://github.com/tmvlke/SimpleDutch/tree/22bff04ce892503bce7c4e8f081557289f5d4a62/app/src/main/kotlin/wskim/aos/simpledutch/di

 

di 는 개발에서 한번도 안써본 개발자는 있어도 한번만 써본 개발자는 없을 정도로 편의성을 높혀주는 강력한 도구 입니다.

 

Android의 종속 항목 삽입  |  Android 개발자  |  Android Developers

Android의 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 종속 항목 삽입(DI)은 프로그래밍에 널리 사용되는 기법으로, Android 개발에 적합합니

developer.android.com

 

di 툴은 여러가지가 있지만 저는 hilt 를 사용하고 있고, 이를 기반으로 설명을 드리고자 합니다.

다음은 데이터 소스에 대한 의존성을 주입하는 코드입니다.

@Module
@InstallIn(SingletonComponent::class)
class DiDataSourceManager {

    @Singleton
    @Provides
    fun provideUserInfoDataSource(
        sharedPreferencesManager: SharedPreferencesManager
    ): UserInfoDataSource {
        return UserInfoDataSourceImpl(sharedPreferencesManager)
    }

}

 

위 코드가 그럼 대체 뭘 하는 건데? 라는 생각이 들 것 같습니다.

 

di 를 사용하지 않는 상황과 사용하는 상황에 대한 예시는 다음과 같습니다.

class Login {
    private val ds : UserInfoDataSource = UserInfoDataSourceImpl(SharedPreferencesManager())

    fun start(user: User) {
        ds.saveInfo(user)
    }
}

class LoginViewModel() {
	val login = Login()

	fun login() {
		login.start()
	}
}

 

di 를 사용하지 않는다면 위와 같이 계속 객체를 선언하여 메모리에 주입하는 과정이 필요합니다.

 

이 경우에 Login 클래스를 호출함에 있어서 메모리 관리를 적절하게 하지 못한다면 메모리 사용량을 초과하게 되거나 객체를 찾지 못하는 등 여러 문제에 직면 할 수 있습니다.

 

이러한 불편함을 해결하기 위한 방법은 다음과 같습니다.

@HiltViewModel
class LoginViewModel @Inject constructor(
	val login: Login
) {

	fun login() {
		login.start()
	}
}

 

핵심은 @HiltViewModel 와 @Inject constructor 입니다.

 

@HiltViewModel 라는 어노테이션을 이용해서 이 클래스는 Hilt 가 만드는 뷰모델임을 선언하고 내부에는 Login 객체를 생성자로 자동 주입해라 라는 뜻입니다.

 

Hilt 를 잘 주입하였다면 안드로이드 스튜디오에서 다음과 같은 모습을 볼 수 있습니다.

의존성 주입
의존성 가져오기

 

의존성

 

빨간 화살표 아이콘이 객체 옆에 보인다면 의존성 주입이 잘 이루어지고 있다라고 판단 할 수 있습니다.

 

지금까지 설명드린 요소들을 활용하여 추후 앱 개발 시 다양한 로직들을 구성해볼 예정이고, 이를 기반으로 테스트 코드도 같이 작성해보겠습니다.

 

그럼 다음 UI  편에서 뵙도록 하겠습니다.

 

나만의 안드로이드 앱 만들기(초보자 편) - UI (6-6)

이번 편은 UI 입니다. 전체 코드는 다음과 같습니다. https://github.com/tmvlke/SimpleDutch/tree/22bff04ce892503bce7c4e8f081557289f5d4a62/app/src/main/kotlin/wskim/aos/simpledutch/ui 큰 틀은 다음과 같습니다. - feature - navigation

victorywskim.tistory.com

 

감사합니다.

반응형

관련글 더보기