기록

[Android] Hilt의 @Bind로 유지보수 쉽게 하기 본문

[Study]/Android

[Android] Hilt의 @Bind로 유지보수 쉽게 하기

Dannnnnn 2023. 1. 12. 12:07
반응형

Hilt란?

힐트(Hilt)는 안드로이드에서 의존성 관리를(Dependency Injection, DI) 쉽게 해주는 라이브러리입니다. '의존'이란 한 클래스가 다른 클래스를 참고한다는 뜻인데, 개발을 하다보면 여러 클래스끼리 연결되는 경우가 흔하게 있습니다. 한 클래스가 준비되어야 다른 클래스도 쓸 수 있는 경우이지요.

 

2개 정도의 클래스면 손으로 클래스끼리 연결을 해 줄 수도 있지만, 클래스의 수가 많아지고 연결이 여러곳에서 생기면 일일이 객체를 만드는 것도 번거로운 일이 됩니다.

 

이러한 어려움을 해결하기 위해 Hilt 라이브러리를 사용하여 의존성을 관리할 수 있습니다.

 

Hilt의 이점

Hilt를 사용하면 안드로이드 기본 컴포넌트를 자동으로 주입해줍니다. (e.g. Activity, Fragment, ViewModel)

 

또한, 알아서 객체를 만들어주고 연결해야될 클래스끼리 연결해주어 코드량이 줄어들고, 구성이 간단해져 개발자가 직접 작성해야 할 코드를 줄일 수 있습니다.

 

결과적으로 코드의 결합도를 낮출 수 있고, 테스트를 쉽게 작성할 수 있어 유지 보수에 좋습니다.

 

@Bind 적용 사례

이 포스팅에서는 @Bind를 사용하여 테스트 및 유지보수가 쉬워지는 사례를 코드를 통해 살펴보겠습니다.

class LoginViewModel @Inject constructor(
    private val repository: TempUserRepository,
    ...
) : ViewModel() { 
	...
}

위 코드에서 의존성을 주입하는 부분을 보면 repository의 반환형이 TempUserRepository로 되어있습니다.

서버를 구축하기 이전에 화면 단에서 데이터를 받아오는 것 처럼 보여주고 싶어 임시로 구현한 repository 인데요.

이후 Firebase 서버를 구축하여 Temp가 아닌 Firebase 전용 레파지토리를 사용하려 하니, 위 코드의 로그인 뷰모델 뿐만 아니라 회원가입 뷰모델, 인증 뷰모델 등... 해당 Temp 레파지토리를 선언한 모든 부분의 코드를 일일이 바꿔줘야 합니다.

 

이것은 굉장히 번거로운 작업이고, 애초에 ViewModel이 어떤 Repository를 사용하는지 굳이 알 필요가 있을까요?

 

class LoginViewModel @Inject constructor(
    private val repository: UserRepository, // Interface
    ...
) : ViewModel() {
	...
}

이를 해결하기 위해 UserRepository라는 인터페이스를 생성하고, 현재 테스트 중인 TempUserRepository 대신 실제 사용할 FirebaseUserRepository를 구현해줍니다. TempUserRepository를 바로 주입하던 부분에는 대신 새로 만든 인터페이스를 주입합니다.

 

@Module
@InstallIn(SingletonComponent::class)
abstract class UserRepositoryModule {

    @Binds
    @Singleton
    abstract fun provideNoteRepository(impl: FirebaseUserRepository): UserRepository
}

방금 전 ViewModel에서 인터페이스를 주입하도록 변경했는데, Hilt가 Binds 어노테이션이 선언된 부분의 반환형을 보고 어떤 클래스를 사용할지 찾아주도록 합니다.

 

이렇게 하면 우리 프로젝트가 테스트를 위한 TempRepository를 사용하는지, 실제 프로덕션에 적용할 실제 Repository를 사용하는지 뷰모델이 모르게 할 수 있으며 (알 필요도 없습니다!), 개발 중 Repository를 변경할 일이 있더라도 Binds 부분의 impl의 반환형만 바꿔주면 됨으로써 테스트 및 유지보수가 쉬워집니다.

반응형