본문 바로가기
전공공부/모바일 프로그래밍

책 "아키텍처를 알아야 앱 개발이 보인다" #2

by 시아나 2022. 4. 6.

Dagger2를 이용한 의존성 주입 기법

의존성 주입(DI: Dependency Injection) : 하나의 객체에 다른 객체의 의존성을 제공하는 기술

의존성 : 객체 지향에서 두 클래스 간의 관계, 일반적으로 둘 중 하나가 다른 하나를 필요로 한다.
주입 : 생성자나 메서드 등을 통해 외부로부터 생성된 객체를 전달받는 것

-> 의존 관계에 있는 클래스의 객체를 외부로부터 생성하여 주입받는 것

의존성 주입의 필요성

  • 변경의 전이 : 의존 관계에 있는 클래스를 변경함으로 인해 다른 하나도 변경해야 하는 것
  • 제어의 역전(IoC, Inversion of Control) :
    어떠한 일을 수행하도록 만들어진 프레임워크에 제어권을 위임함으로써 관심사를 분리하는 것
    의존관계에 있는 클래스의 생성 및 관리를 외부에 위임하는 것

의존성 주입의 장단점

장점

  • 인터페이스 기반으로 설계되며, 코드를 유연하게 함
  • 주입하는 코드만 따로 변경하기 쉬워 리팩토링이 수월함
  • 의존성 주입을 사용하는 결과로  stub나 mock 객체를 사용하여 단위 테스트를 하기가 더욱 쉬워짐
  • 클래스 간의 결합도를 느슨하게 한다
  • 인터페이스 기반으로 설계하므로 여러 개발자가 서로 사용하는 클래스를 독립적으로 개발할 수 있다.
    즉, 클래스 간에 의존하는 인터페이스만 알면된다.

단점

  • 간단한 프로그램을 만들 때는 번거롭다
  • 동작과 구성을 분리해 코드를 추적하기 어렵게 하고 가독성을 떨어뜨릴 수 있다. 
    즉, 개발자는 더 많은 파일을 참조해야한다.
  • Dagger2와 같은 의존성 주입 프레임워크는 컴파일 타임에 에노테이션 프로세서를 이용하여 파일을 생성하므로 빌드에 시간이 조금 더 소요된다.

 

Dragger2란?

자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크
리플렉션을 사용하지 않고 런타임에 바이트 코드도 생성하지 않는 특징을 가짐
컴파일 타임에 애노테이션(@Module, @Provides) 프로세서에 의해 의존성 주입과 관련된 모든 코드를 분석하고 자바 소스 코드를 생성함

장점 :

  • 자원 공유의 단순화, 지정된 범위의 생명 주기 내에서 동일한 인스턴스를 제공
  • 복잡한 의존성을 단순하게 설정, 애플리케이션이 커질수록 많은 의존성을 갖는데 Dragger는 이를 쉽게 제어해줌
  • 유닛 테스트를 쉽게 도와줌
  • 자동 코드 생성, 생성된 코드는 명확하고 디버깅이 가능
  • 난독화 문제가 없음, 라이브러리의 크기가 작음

 

애노테이션

@Module :
의존성을 제공하는 클래스에 붙임

include 속성 :
@Provides 메서드의 상속 가능, 모듈 간 상속을 할 때 중복되는 타입이 존재하면 안됨.
ex) B가 A를 상속한다면 ModuleB에 @Module(include = ModuleA.class)

@Provides :
의존성을 제공하는 메서드에 붙임, 기본적으로 null 반환을 제한함
-> @Nullable : null을 반환할 수 있게 함. Provides, Component 둘다 있어야함.

@Component :
의존성을 제공받는 컴포넌트에 붙임, 컴포넌트 메서드의 반환형을 보고 모듈과의 관계를 맺음
interface와 abstract 클래스에만 붙일 수 있음
ex) @Component(modules = MyModule.class)

속성 :

  • modules : 컴포넌트에 바인드되는 @Module이 지정된 클래스 배열을 선언
  • dependencies : 컴포넌트에 다른 컴포넌트의 의존성을 사용하는 경우 클래스 배열을 선언

 

오브젝트 그래프(컨테이너) : 컴포넌트, 모듈, 객체 등의 관계

컴포넌트 메서드 : @Component가 붙은 모든 타입은 최소한 하나의 추상적인 메서드를 가져야함.
메서드 이름은 상관x, 메서드 매개 변수와 반환형은 규칙을 엄격하게 따라야함

  • 프로비전 메서드(Provision methods)
    매개변수를 갖지 않으면서 반환형은 모듈로부터 제공되거나 주입되는 메서드
  • 멤버-인젝션 메서드(Member-injection methods) @Inject
    하나의 매개 변수를 갖는 메서드, void를 반환 or 빌더 패턴처럼 메서드 체이닝이 가능한 메서드를 만들기 위해 매개 변수 타입을 반환형으로 갖는 메서드로 선언 가능

 

의존성 주입하기

주입방법 : 필드 주입, 생성자 주입, 메서드 주입

 

'전공공부 > 모바일 프로그래밍' 카테고리의 다른 글

책 "아키텍처를 알아야 앱 개발이 보인다" #1  (0) 2022.04.06
kotlin 공부 #3  (0) 2022.03.23
kotlin 공부 #2  (0) 2022.03.22
looper  (0) 2021.08.31
23일차  (0) 2021.07.28