23
dependency Injection with Dagger 2 BBBTech Inc. 윤윤윤 for Android

Dagger 2.0 을 활용한 의존성 주입

  • Upload
    -

  • View
    62

  • Download
    0

Embed Size (px)

Citation preview

dependency Injection with

Dagger 2

BBBTech Inc. 윤승용

for Android

Dependency injection?

• 디자인 패턴의 한 종류• IOC (Inversion of control) 원리 사용• 객체와 관련된 의존성을 외부에서 주입

Dependency injection?

Dependency injection?

Dependency injection?No DI With DI

Dependency injection 의 장점• 재사용성• 테스트용이성• 유지보수성

Problem?

Problem?

Dependency Injection Framework

Dependency Injection Framework

• Spring

• Guice

• Dagger 1

• PicoContainer

• CDI

• Dagger 2

Dependency Injection Framework

• Spring

• Guice

• Dagger 1

• PicoContainer

• CDI

• Dagger 2

Dagger 2

• 컴파일 타임 체크 가능• 디버깅과 추적이 가능함• Dagger 1 보다 13% 성능 향상• 의존성에 대한 범위 제한이 가능함

Android 에서 어떻게 활용할 것인가 ?

• Context 가 필요한 클래스• Application 생명주기와 밀접한 클래스

(DB Manager, System Services, Analytics tracker)

• 핵심 비즈니스 로직

Android 에서 어떻게 활용할 것인가 ?

• Context 가 필요한 클래스• Application 생명주기와 밀접한 클래스

(DB Manager, System Services, Analytics tracker)

• 핵심 비즈니스 로직ButterKnife 의 Object 버전이라 생각하면 이해하기 편할

Dagger 2 API

• @Inject : 의존성을 요청• @Module : 의존성을 제공하는 메서드들을 가진 클래스• @Provide : 모듈 내에서 언급된 의존성들을 어떻게 구성하고 제공하는지 알려주는 메서드• @Component : @Module 들과 @Inject 사이의 다리 역할

Dagger 2 API

Dagger 2 는 모듈 (@Module) 에서 제공 (@Provide)하는 요소들을 브릿지 (@Component) 에서 연결시켜준 클래스 내에서 요청(@Inject) 하는 의존 요소나 다른 @Provide 에서 요청하는 인자들에 주입 시켜준다 .

Dagger 2 API

• @Inject : 의존성을 요청• @Module : 의존성을 제공하는 메서드들을 가진 클래스• @Provide : 모듈 내에서 언급된 의존성들을 어떻게 구성하고 제공하는지 알려주는 메서드• @Component : @Module 들과 @Inject 사이의 다리 역할• @Scope : 의존성 관련 객체의 범위를 지정함 • @Qualifier : 같은 클래스의 종속성을 식별하는 식별자

Dagger 2 API

• @Inject : 의존성을 요청• @Module : 의존성을 제공하는 메서드들을 가진 클래스• @Provide : 모듈 내에서 언급된 의존성들을 어떻게 구성하고 제공하는지 알려주는 메서드• @Component : @Module 들과 @Inject 사이의 다리 역할• @Scope : 의존성 관련 객체의 범위를 지정함 • @Qualifier : 같은 클래스의 종속성을 식별하는 식별자

Constructor Injection

• 생성자에 @Inject 어노테이션• 생성자 인자가 의존 요소• 이 경우에 private final 에 의존성을 주입할 수 있다

Method Injection

• 메서드에 @Inject 어노테이션• 메서드 인자가 의존 요소• 객체가 생성된 후 주입이 발생• 의존요소에 this 를 전달할 경우에만 사용하는 것을 권장함

Field Injection

• 필드 ( 멤버변수 ) 에 @Inject 어노테이션• 필드는 private final 이 될 수 없다• 객체가 생성된 후 주입이 발생• 자체적으로 주입에 대한 처리가 필요함• Constructor Injection 을 사용하지 못하는 경우 사용 가능

(e.g. Activity)

Scope Annotations

• 단 하나만의 인스턴스를 생성한다• @Singleton 은 제일 큰 범위의 어노테이션이다• 아래와 같은 코드로 Custom 스코프 어노테이션을 지정할 수 있다

Show me the code!!

결론• Android 프레임워크 특성상의 Boilerplate 코드들을 줄일 수 있음• 객체간의 결합도를 느슨하게 만들어 테스트나 유지보수가 편리함• MVP 패턴의 아키텍쳐를 고려해봤을 때 , Presenter 요소를 매

Activity 마다 쉽게 주입할 수 있게 됨 .

• 다만 , 개념이 어렵고 의존관계에 대한 코드상의 트래킹이 어려울 가능성이 있기 때문에 , 프로젝트 내 모든 의존성을 Dagger 로 대체하는 것은 오버 엔지니어링이라는 판단 .

• Test 가 반드시 필요한 핵심 비즈니스 모델과 Boilerplate 코드가 난무하는 Application, Activity, Fragment 요소들에만 우선적으로 적용하는 것을 목표 .