Android/Dependency Injection

    [Dagger2 심화] 1. @Provides의 특수한 형태 @Binds

    @Binds는 @Provides의 특수한 형태일 뿐이며, @Provides와 같은 역할을 한다. 다른 점은 Binds에는 여러 제약이 있고, 제약이 많은 만큼 코드를 덜 생성한다는 점이다. 지금부터 @Binds에 어떠한 제약이 있는지 어떤 경우에 사용이 되어야 하는지 살펴보자. @Binds @Binds는 하나의 객체를 변수로 받아 해당 변수를 생성(생성자 주입)하고 프로퍼티, 메서드까지 @Inject가 붙은 모든 주입을 처리하고 나서 반환하는 Annotation이다. @Binds는 @Provides와 같은 역할을 하지만, @Provides에 비해 많은 제약이 있어 코드를 덜 생성한다. @Binds를 쓰기 위한 조건으로는 두 개의 필수적인 조건이 있다. @Binds는 추상(abstract) 클래스의 추상(..

    [Dagger2] 5. @Named Annotation을 이용한 Provider 구분

    같은 타입의 Provider가 있을때 구분 앞서 Provider을 이용해 주입(Inject)가 되는 것을 보았다. 하지만, Provider만 사용하여 주입하는 것에는 문제점이 있다. 바로 Provider에서 제공(Provide)하는 인스턴스의 타입이 같을 때 어떤 인스턴스를 주입해야 하는지 모른다는 것이다. 예를 들어 아래와 같은 Module이 있다고 해보자. @Module class PersonModule { @Provides fun providesStudentName(): String = "StudentA" @Provides fun providesTeacherName(): String = "TeacherB" } 이 모듈에서 제공하는 두가지 Provider의 반환 타입은 모두 String이다. 이 때 ..

    [Dagger2] 4. Component Injection 메서드 - 멤버 인젝션(Member Injection)

    멤버 인젝션(Member Injection) 메서드 앞서 다룬 프로비전(Provision) 메서드에서는 Provider에 의해 제공되는 인스턴스를 반환하였다. 그와 달리 Member Injection 메서드에서는 인스턴스를 만든다음 Provider에 의해 제공되는 인스턴스를 주입시킨다. 이는 다음 두가지 방식으로 주입이 가능하다. 바로 필드 주입 방식과 메서드 주입 방식이다. 예제3과 함께 두가지 방식을 설명한다. 예제3은 다음의 코드 구조를 가진다. 예제 링크 : https://github.com/seyoungcho2/Dagger2Example @Component(modules = [PersonModule::class]) interface SchoolComponent{ fun injectStudent(..

    [Dagger2] 3. Component Injection 메서드 - 프로비전(Provision)

    Interface로서의 Component 앞서 Component는 Interface의 역할을 한다고 하였다. Component Interface에서 제공되는 함수는 두 가지가 있을 수 있다. 하나는 프로비전 메서드로 그 자체로 Provider에 의해 반환되는 인스턴스를 반환하는 메서드이며, 다른 하나는 멤버 인젝션 메서드로 인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는 메서드이다. 우리는 이 둘을 다음과 같이 부른다. 프로비전(Provision) 메서드 그 자체로 Provider에 의해 만들어진 인스턴스나, 프로퍼티가 주입된 인스턴스를 반환하는 메서드 멤버 인젝션(Member Injection) 메서드 인자로 받는 인스턴스에 Provider에 의해 반환되는 인스턴스를 제공하는..

    [Dagger2] 2. Dagger2에서 Injection이 일어나는 방식

    Dagger2의 IOC Container 구성 앞의 글에서 Dagger2의 3가지 구성요소 Container, Module, Provider에 대해 배웠다. Component : 클래스의 인스턴스를 모아놓는 저장소(Container) 역할. 각 인스턴스들은 Module 단위로 제공된다. Module : Module 단위로 클래스의 인스턴스를 모아놓는 역할 Provider : 클래스의 인스턴스를 제공(Provide)해주는 역할 이제 각 부분이 어떤 역할을 하는지 알았으므로 더욱 상세히 정리해보고자 한다. Dagger2을 이용해 의존성 주입 구현하기 앞의 글에서 다음과 같은 그림을 본 적이 있다. 는 의존성을 약화시키기 위한 인터페이스의 역할에 대해 설명하면서 나온 그림이다. CPU Time을 구하기 위해 ..