본문 바로가기

전체 글

(271)
[Android] ContributesAndroidInjector란? 개요 이번 포스팅에서는 Android용 대거(Dagger)의 annotation 중 하나인 ContributesAndroidInject에 대해서 알아본다. 기존 방식 Android에서 대거를 활용할 때 Activity, Fragment 같은 안드로이드 시스템에서 생성하는 객체들에 의존성을 주입할 때 직접 각 컴포넌트를 생성하고 inject하는 코드까지 작성하는 보일러 플레이트가 존재했다. // StorageModule에 대한 정보를 추가한 컴포넌트 정의 @Component(modules = [StorageModule::class]) interface MainComponent { // 이 컴포넌트에 의해 주입을 원하는 클래스 fun inject(activity: RegistrationActivity) } ..
[Android] 11. 구글 코드랩 Dagger를 이용한 리팩토링 - @Provides & Qualifiers 개요 해당 게시글은 코드랩을 번역한 게시글입니다. @Provides annotation and Qualifiers 안드로이드 프로젝트에 유용한 다른 annotation들이 있다. @Provides @Inject와 @Binds 외에 대거 모듈 내부에서 어떻게 객체를 제공해야하는 지 알려줄 때 @Provides를 활용할 수 있다. @Provides 처리된 함수의 반환 타입은 대거 그래프에 추가된다. 그리고 해당 함수의 매개변수는 대거가 제공하는 방법을 알고 있어야한다. 본 포스팅 예시에서, Storage 타입을 아래와 같이 구현하여 제공할 수 있다. StorageModule.kt @Module class StorageModule { // @Provides는 이 함수의 반환 타입을 어떻게 생성하는지 알게 한다..
[Android] 10. 구글 코드랩 Dagger를 이용한 리팩토링 - Multiple Activities with the same scope 개요 해당 게시글은 구글 코드랩을 번역한 게시글입니다. Multiple Activities with the same scope 세팅 버튼을 클릭하면 앱이 중단된다. Settings 관련된 코드를 리팩토링해보자. 현재 SettingsActivity의 필드들은 대거로 주입받아야 한다. 1. 대거에게 SettingsActivity가 의존하는 객체들이 어떻게 생성되는지 알려준다. SettingsViewModel.kt이 존재한다. SettingViewModel.kt class SettingsViewModel @Inject constructor( private val userDataRepository: UserDataRepository, private val userManager: UserManager ) { ....
[Android] 9. 구글 코드랩 Dagger를 이용한 리팩토링 - Login Flow 개요 해당 게시글은 구글 코드랩을 번역한 게시글입니다. Refactoring the Login Flow 객체를 어떤 수명 주기의 범위로 Scoping하는 것 외에도 subcomponent를 만드는 것은 앱의 다른 부분을 각각 캡슐화하는 좋은 방법이다. 앱의 흐름에 따라 Dagger의 하위 그래프(Subcomponent를 생성하는 일)을 통해 앱을 구조화하면 메모리 및 시작 시간 측면에서 더 성능이 뛰어나고 확장성이 좋은 앱을 만드는데 도움이 된다. 읽기 쉽고 모듈화에 좋은 앱을 개발하기 위해서는 앱에 있는 모든 객체를 제공하는 거대한 단일 컴포넌트를 만드는 것을 피해야 한다. Login flow를 위해 다른 subcomponent를 생성하여 리팩토링해보자. login 패키지에 LoginComponent...
[Android] 8. 구글 코드랩 Dagger를 이용한 리팩토링 - Scoping Subcomponents 개요 해당 게시글은 구글 코드랩 문서의 번역 게시글입니다. Scoping Subcomponents RegistrationViewModel을 Activity와 Fragment 사이에서 공유하기 위해 subcomponent를 생성했다. 이전에 작업한 것 처럼 Component와 클래스에 @Singleton 등 으로 같은 Scope를 지정하면 해당 타입은 Component에서 고유한 인스턴스가 된다. 하지만 AppComponent에서 @Singleton을 이미 사용하고 있기 때문에 @Singleton을 사용할 수 없는 상황이다. 이 경우에 새로운 scope를 @RegistratinoScope라고 부를 수 있지만 이는 적절하지 않다. Scope 명명 기법은 그것이 수행하는 목적을 나타내서는 안된다. Annota..
[Android] 7. 구글 코드랩 Dagger를 이용한 리팩토링 - Subcomponents 개요 해당 게시글은 구글 코드랩을 번역한 게시글입니다. Subcomponents Registraion Flow 아직 Registration 관련 프래그먼트는 리팩토링이 되지 않았다. 관련된 프래그먼트는 EnterDetailsFragment와 TermsAndConditionsFragment이다. 해당 프래그먼트들은 대거에 의해 의존성 주입을 받아야한다. AppComponent.kt @Singleton @Component(modules = [StorageModule::class]) interface AppComponent { ... fun inject(activity: RegistrationActivity) fun inject(fragment: EnterDetailsFragment) fun inject(fr..
[Android] 6. 구글 코드랩 Dagger를 이용한 리팩토링 - Main Flow 개요 해당 게시글은 구글 코드랩을 번역한 게시글입니다. Using Scope 가끔 한 컴포넌트에서 같은 객체를 의존성 주입해야하는 상황이 존재한다. 다른 곳에서 같은 인스턴스를 공유하기 원할 때 (e.g. UserManager) 객체 자체를 생성한는 데 매우 많은 비용이 소모되어 의존성 주입 시 마다 새로운 객체 생성을 원치 않을 때 (e.g. Json Parser) Scope를 이용하여 컴포넌트에서 고유한 객체를 가지는게 가능해진다. 혹은 "컴포넌트의 수명주기로 타입을 스코핑한다"라고 말한다. 이 의미는 해당 타입을 제공할 때 마다 같은 인스턴스를 제공하는 것을 의미한다. AppComponent의 경우 @Singleton Scope를 활용할 수 있다. 컴포넌트에 @Singleton으로 Scoping하면..
[Android] 5. 구글 코드랩 Dagger를 이용한 리팩토링 - Main Flow 개요 해당 게시글은 구글 코드랩을 번역한 게시글입니다. Main Flow에 대거를 적용하기 이전과 마찬가지로 MainActivity가 Dagger를 사용하여 의존성을 관리하기를 원한다. 이 경우에는 MainViewModel, UserManager가 관리 대상이다. 대거에게 MainActivity가 의존성 주입을 받는 대상이라고 알려야 한다. AppComponet에 MainActivity를 매개 변수로 사용하여 메소드를 추가한다. AppComponent.kt @Component(modules = [StorageModule::class]) interface AppComponent { ... // 컴포넌트에 의해 의존성을 주입 받는 클래스 fun inject(activity: RegistrationActivi..