이번 편에서는 di 에 대해 설명드리겠습니다.
전체 코드는 다음과 같습니다.
di 는 개발에서 한번도 안써본 개발자는 있어도 한번만 써본 개발자는 없을 정도로 편의성을 높혀주는 강력한 도구 입니다.
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 편에서 뵙도록 하겠습니다.
감사합니다.
나만의 안드로이드 앱 만들기(초보자 편) - 페이지 구성 (7) (1) | 2023.12.10 |
---|---|
나만의 안드로이드 앱 만들기(초보자 편) - UI (6-6) (0) | 2023.11.11 |
나만의 안드로이드 앱 만들기(초보자 편) - core (6-4) (0) | 2023.11.11 |
나만의 안드로이드 앱 만들기(초보자 편) - common (6-3) (0) | 2023.11.11 |
나만의 안드로이드 앱 만들기(초보자 편) - 의존성 추가 및 패키지 구분하기 (6-2) (0) | 2023.11.01 |