SlideShare a Scribd company logo
1 of 34
Dagger를 왜 쓸까?
DI 쓴다 = Dagger 쓴다?
DI vs DIP vs IoC
DI (Dependency Injection)
의존성: ex) Abstract Parameter
void showMessage(String message);
DI (Dependency Injection)
public class Messanger{
public showMessage_A(){
System.out.println(“Message A”);
}
}
DI (Dependency Injection)
public class Messanger{
public showMessage_A(){
System.out.println(“Message A”);
}
public showMessage_B(){
System.out.println(“Message B”);
}
}
public class Messagener{
void showMessage(String message){
System.out.println(message);
}
}
showMessage(“Message A”); showCount(“Message B”);
DI (Dependency Injection)
DI (Dependency Injection)
public class Kenya_AA{
private int birthYear;
private int harvestYear;
}
public class CoffeMachine {
private Kenya_AA bean;
public CoffeMachine(Kenya_AA
bean){
this.bean = bean;
}
}
SOLID 원칙중 D (Dependency Inversion Principle) - 의존성 역전의 원칙
(SOLID 원칙 :객체지향 소프트웨어 설계의 근본 원칙, 디자인 패턴의 근본 원칙 객체지향 소프트웨어 설계 도구들의 근본이자 목적이 되는 원칙)
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend on details. Details should depend on abstractions.
- Wikipedia
※ 모든 Parameter 가 Dependency는 아니다.
DI (Dependency Injection)
의존성: ex) Abstract Parameter
void showMessage(String message);
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
SOLID 원칙중 D (Dependency Inversion Principle)
public class CoffeeMachine {
private Kenya_AA bean = new Kenya_AA();
}
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend on details. Details should depend on abstractions.
SOLID 원칙중 D (Dependency Inversion Principle)
public class CoffeeMachine {
private ICoffeBean bean;
public CoffeMachine(ICoffeBean
bean){
this.bean = bean;
}
public Interface ICoffeeBean {
void getBirthYear();
void
getHarvestYear();
}
DI(Dependency Injection) 를 구현하기 위한 원칙
= DIP (Dependency Inversion Principle)
DI (Dependency Injection)
public class CoffeeMachine {
private ICoffeBean bean;
public CoffeMachine(ICoffeBean
bean){
this.bean = bean;
}
- 생성자를 통한 DI
DI (Dependency Injection)
- Setter 를 통한 DI
public class CoffeeMachine {
private ICoffeBean bean;
public CoffeMachine() { }
public setCoffeMachine(ICoffeBean
bean){
this.bean = bean;
}
DI (Dependency Injection)
- 초기화 Interface 를 통한 DI
public class CoffeeMachine
implements
CoffeInjector {
private ICoffeBean bean;
public void injectCoffe(ICoffeBean bean){
this.bean = bean;
}
public interface CoffeInjector {
void injectCoffe(ICoffeBean bean);
}
IoC(Inversion of Control) - 제어의 역전
- Framwork
- RxJava
- DIP
- CallBack
내가 누군가의 코드를 호출한다 - 라이브러리
누군가 나의 코드를 호출한다 - 프레임워크
IoC(Inversion of Control) - 제어의 역전
라이브러리 vs Framwork
내가 생각하는 IoC Container의 등장배경
- DI 가 좋은건 알겠는데…
- 생성자에서 DI를 하면 Compile 타임에 보장은 되지만 생성자 Parameter 가 너
무 많아져서 문제..
- setter DI 를 하기엔 각각 setter 를 모두 만들어줘야하고 dependency가 올바로
들어온다는 보장은 없고…
- 매번 의존관계 (ex new Something()) 을 생성하는것도 귀찮고...
IOC Container 를 사용하지 않았을때 단점
- 손으로 일일이 DI 를 해야한다.
- Compile 타임에 DI 가 제대로 되었는지 확인하기 어렵다. (버그 확률 업)
- DI 를 안하면 확장성이 떨어짐
- 코드가 늘어난다.
Dagger 의 장점
- 컴파일 타임에서 DI 확인가능
- 동일 Instance 를 여러곳에서 많이쓴다면 중복 코드가 줄어든다.
- 테스트가 쉬워진다(?)
- 배우기 어렵다.
- Module Design 도 어렵다.
Dagger 의 단점
Android MVP Pattern
Activity(View)
Presenter
Model(Repository)
Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다.
public class AlramPresenter {
public Boolean isAlramTime(){
Date date = new 시스템시간();
if(date < 수요일){
return true;
} else if(date > 수요일){
return false;
}
}
}
public class AlramPresenterTest {
private AlramPresenter presenter;
@Before
public void setUp(){
presenter = new AlramPresenter();
}
@Test
public void before_수요일_Test(){
Boolean result =
presenter.isAlramTime();
}
@Test
public void after_수요일_Test(){
}
Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다.
public class AlramPresenter {
public Boolean isAlramTime(Date date){
String dateValue =
date.getDate();
if(dateValue < 수요일){
return true;
} else if(dateValue > 수요
일){
return false;
}
}
}
public class AlramPresenterTest {
private AlramPresenter presenter;
@Before
public void setUp(){
presenter = new AlramPresenter();
}
@Test
public void before_수요일_Test(){
Date date = mock(Date.class);
when(date.getDate()).thenReturn(“월요일”);
Boolean result = presenter.isAlramTime(date);
assertTrue(result);
}
}
Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다.
public class AlramPresenter {
public Boolean isAlramTime(Date date){
String dateValue =
date.getDate();
if(dateValue < 수요일){
return true;
} else if(dateValue > 수요
일){
return false;
}
}
}
public class AlramPresenterTest {
private AlramPresenter presenter;
@Before
public void setUp(){
presenter = new AlramPresenter();
}
@Test
public void after_수요일_Test(){
Date date = mock(Date.class);
when(date.getDate()).thenReturn(“금요일”);
Boolean result = presenter.isAlramTime(date);
assertFalse(result);
}
}
public class AlramPresenter {
IActivityView activity;
IRepository repository;
public void AlramPresenter(){
repository = RepositoryImpl();
}
// setter DI
public void setActivityView(IActivityView activity){
this.activity = activity;
}
public void appStart(){
FeedData feed = repository.getFeedList();
// generate viewmodel
...
}
public void refreshView(){
if(activityView != null){
acvitivyView.refreshView();
}
}
}
public class AlramPresenterTest {
private AlramPresenter presenter;
@Before
public void setUp(){
presenter = new AlramPresenter();
}
@Test
public void appStart_Test(){
presenter.appStart();
}
}
public class AlramPresenter {
IActivityView activity;
IRepository repository;
public void AlramPresenter(){
repository = RepositoryImpl();
}
// setter DI
public void setActivityView(IActivityView activity){
this.activity = activity;
}
public void appStart(){
FeedData feed = repository.getFeedList();
// generate viewmodel
...
}
public void refreshView(){
if(activityView != null){
acvitivyView.refreshView();
}
}
}
public class AlramPresenterTest {
private AlramPresenter presenter;
@Before
public void setUp(){
presenter = new AlramPresenter();
}
@Test
public void refreshViewTest(){
IActivityView activity = mock(IActivityView .class);
presenter.setActivityView(activity);
presenter.refreshView();
verify(activity.refreshView());
}
}
Dagger 맛보기
Module Component
Dagger 맛보기
내가 주입하고자 하는 Dependency 를 정의하는곳Module
Dagger 맛보기
Module 로 부터 DI 를 요청하는곳에 Injection 해주는 다리역할Component
Dagger 맛보기
@Inject 요청
Dagger 맛보기
질문
- Scope 는 Module / Component 에 모두 붙일수 있는가? (Component 는 class
에 Module 은 Provides 에 붙이던데..)
- Activity Scope이라고 명명하지만 사실 Component 호출 시점이 중요한것이 아
닌가..? Component 에 Activity Scope 이라고 적어놓고 Fragment 에서 생성하
면 결국 생성은 Fragment 에서 한것이니 Fragment 생명주기를 따르지 않을
까..?
- @Retention 은 무엇인가?

More Related Content

What's hot

Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsSeok-joon Yun
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
React 실무활용 이야기
React 실무활용 이야기React 실무활용 이야기
React 실무활용 이야기철민 배
 
구글테스트
구글테스트구글테스트
구글테스트진화 손
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
Javascript closure 2차과제 이승찬
Javascript closure 2차과제 이승찬Javascript closure 2차과제 이승찬
Javascript closure 2차과제 이승찬승찬 이
 
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기Kim Hunmin
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 양 한빛
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 

What's hot (17)

Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
React 실무활용 이야기
React 실무활용 이야기React 실무활용 이야기
React 실무활용 이야기
 
구글테스트
구글테스트구글테스트
구글테스트
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
Tdd 4장
Tdd 4장Tdd 4장
Tdd 4장
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
Clojure Chapter.6
Clojure Chapter.6Clojure Chapter.6
Clojure Chapter.6
 
Javascript closure 2차과제 이승찬
Javascript closure 2차과제 이승찬Javascript closure 2차과제 이승찬
Javascript closure 2차과제 이승찬
 
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민 track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
track2 04. MS는 Rx를 왜 만들었을까? feat. RxJS/ 네이버, 김훈민
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 

Similar to Why use Dagger in Android

Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
자바스터디(6기) 3
자바스터디(6기) 3자바스터디(6기) 3
자바스터디(6기) 3Jina Lee
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Leonardo YongUk Kim
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
데이터베이스패턴
데이터베이스패턴데이터베이스패턴
데이터베이스패턴Suan Lee
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POPChiwon Song
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Ji Ung Lee
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 JaehoChoe3
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 

Similar to Why use Dagger in Android (20)

Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
자바스터디(6기) 3
자바스터디(6기) 3자바스터디(6기) 3
자바스터디(6기) 3
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
데이터베이스패턴
데이터베이스패턴데이터베이스패턴
데이터베이스패턴
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
MVI on android Droid Knights 2020
MVI on android Droid Knights 2020 MVI on android Droid Knights 2020
MVI on android Droid Knights 2020
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 

Why use Dagger in Android

  • 2. DI 쓴다 = Dagger 쓴다?
  • 3. DI vs DIP vs IoC
  • 4. DI (Dependency Injection) 의존성: ex) Abstract Parameter void showMessage(String message);
  • 5. DI (Dependency Injection) public class Messanger{ public showMessage_A(){ System.out.println(“Message A”); } }
  • 6. DI (Dependency Injection) public class Messanger{ public showMessage_A(){ System.out.println(“Message A”); } public showMessage_B(){ System.out.println(“Message B”); } }
  • 7. public class Messagener{ void showMessage(String message){ System.out.println(message); } } showMessage(“Message A”); showCount(“Message B”); DI (Dependency Injection)
  • 8. DI (Dependency Injection) public class Kenya_AA{ private int birthYear; private int harvestYear; } public class CoffeMachine { private Kenya_AA bean; public CoffeMachine(Kenya_AA bean){ this.bean = bean; } }
  • 9. SOLID 원칙중 D (Dependency Inversion Principle) - 의존성 역전의 원칙 (SOLID 원칙 :객체지향 소프트웨어 설계의 근본 원칙, 디자인 패턴의 근본 원칙 객체지향 소프트웨어 설계 도구들의 근본이자 목적이 되는 원칙) A. High-level modules should not depend on low-level modules. Both should depend on abstractions. B. Abstractions should not depend on details. Details should depend on abstractions. - Wikipedia ※ 모든 Parameter 가 Dependency는 아니다.
  • 10. DI (Dependency Injection) 의존성: ex) Abstract Parameter void showMessage(String message);
  • 11. A. High-level modules should not depend on low-level modules. Both should depend on abstractions. SOLID 원칙중 D (Dependency Inversion Principle) public class CoffeeMachine { private Kenya_AA bean = new Kenya_AA(); }
  • 12. A. High-level modules should not depend on low-level modules. Both should depend on abstractions. B. Abstractions should not depend on details. Details should depend on abstractions. SOLID 원칙중 D (Dependency Inversion Principle) public class CoffeeMachine { private ICoffeBean bean; public CoffeMachine(ICoffeBean bean){ this.bean = bean; } public Interface ICoffeeBean { void getBirthYear(); void getHarvestYear(); }
  • 13. DI(Dependency Injection) 를 구현하기 위한 원칙 = DIP (Dependency Inversion Principle)
  • 14. DI (Dependency Injection) public class CoffeeMachine { private ICoffeBean bean; public CoffeMachine(ICoffeBean bean){ this.bean = bean; } - 생성자를 통한 DI
  • 15. DI (Dependency Injection) - Setter 를 통한 DI public class CoffeeMachine { private ICoffeBean bean; public CoffeMachine() { } public setCoffeMachine(ICoffeBean bean){ this.bean = bean; }
  • 16. DI (Dependency Injection) - 초기화 Interface 를 통한 DI public class CoffeeMachine implements CoffeInjector { private ICoffeBean bean; public void injectCoffe(ICoffeBean bean){ this.bean = bean; } public interface CoffeInjector { void injectCoffe(ICoffeBean bean); }
  • 17. IoC(Inversion of Control) - 제어의 역전 - Framwork - RxJava - DIP - CallBack
  • 18. 내가 누군가의 코드를 호출한다 - 라이브러리 누군가 나의 코드를 호출한다 - 프레임워크 IoC(Inversion of Control) - 제어의 역전 라이브러리 vs Framwork
  • 19. 내가 생각하는 IoC Container의 등장배경 - DI 가 좋은건 알겠는데… - 생성자에서 DI를 하면 Compile 타임에 보장은 되지만 생성자 Parameter 가 너 무 많아져서 문제.. - setter DI 를 하기엔 각각 setter 를 모두 만들어줘야하고 dependency가 올바로 들어온다는 보장은 없고… - 매번 의존관계 (ex new Something()) 을 생성하는것도 귀찮고...
  • 20. IOC Container 를 사용하지 않았을때 단점 - 손으로 일일이 DI 를 해야한다. - Compile 타임에 DI 가 제대로 되었는지 확인하기 어렵다. (버그 확률 업) - DI 를 안하면 확장성이 떨어짐 - 코드가 늘어난다.
  • 21. Dagger 의 장점 - 컴파일 타임에서 DI 확인가능 - 동일 Instance 를 여러곳에서 많이쓴다면 중복 코드가 줄어든다. - 테스트가 쉬워진다(?)
  • 22. - 배우기 어렵다. - Module Design 도 어렵다. Dagger 의 단점
  • 24. Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다. public class AlramPresenter { public Boolean isAlramTime(){ Date date = new 시스템시간(); if(date < 수요일){ return true; } else if(date > 수요일){ return false; } } } public class AlramPresenterTest { private AlramPresenter presenter; @Before public void setUp(){ presenter = new AlramPresenter(); } @Test public void before_수요일_Test(){ Boolean result = presenter.isAlramTime(); } @Test public void after_수요일_Test(){ }
  • 25. Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다. public class AlramPresenter { public Boolean isAlramTime(Date date){ String dateValue = date.getDate(); if(dateValue < 수요일){ return true; } else if(dateValue > 수요 일){ return false; } } } public class AlramPresenterTest { private AlramPresenter presenter; @Before public void setUp(){ presenter = new AlramPresenter(); } @Test public void before_수요일_Test(){ Date date = mock(Date.class); when(date.getDate()).thenReturn(“월요일”); Boolean result = presenter.isAlramTime(date); assertTrue(result); } }
  • 26. Dagger 를 쓰면 테스트가 쉬워진다(?) > DI 를 하면 Test가 가능해 진다. public class AlramPresenter { public Boolean isAlramTime(Date date){ String dateValue = date.getDate(); if(dateValue < 수요일){ return true; } else if(dateValue > 수요 일){ return false; } } } public class AlramPresenterTest { private AlramPresenter presenter; @Before public void setUp(){ presenter = new AlramPresenter(); } @Test public void after_수요일_Test(){ Date date = mock(Date.class); when(date.getDate()).thenReturn(“금요일”); Boolean result = presenter.isAlramTime(date); assertFalse(result); } }
  • 27. public class AlramPresenter { IActivityView activity; IRepository repository; public void AlramPresenter(){ repository = RepositoryImpl(); } // setter DI public void setActivityView(IActivityView activity){ this.activity = activity; } public void appStart(){ FeedData feed = repository.getFeedList(); // generate viewmodel ... } public void refreshView(){ if(activityView != null){ acvitivyView.refreshView(); } } } public class AlramPresenterTest { private AlramPresenter presenter; @Before public void setUp(){ presenter = new AlramPresenter(); } @Test public void appStart_Test(){ presenter.appStart(); } }
  • 28. public class AlramPresenter { IActivityView activity; IRepository repository; public void AlramPresenter(){ repository = RepositoryImpl(); } // setter DI public void setActivityView(IActivityView activity){ this.activity = activity; } public void appStart(){ FeedData feed = repository.getFeedList(); // generate viewmodel ... } public void refreshView(){ if(activityView != null){ acvitivyView.refreshView(); } } } public class AlramPresenterTest { private AlramPresenter presenter; @Before public void setUp(){ presenter = new AlramPresenter(); } @Test public void refreshViewTest(){ IActivityView activity = mock(IActivityView .class); presenter.setActivityView(activity); presenter.refreshView(); verify(activity.refreshView()); } }
  • 30. Dagger 맛보기 내가 주입하고자 하는 Dependency 를 정의하는곳Module
  • 31. Dagger 맛보기 Module 로 부터 DI 를 요청하는곳에 Injection 해주는 다리역할Component
  • 34. 질문 - Scope 는 Module / Component 에 모두 붙일수 있는가? (Component 는 class 에 Module 은 Provides 에 붙이던데..) - Activity Scope이라고 명명하지만 사실 Component 호출 시점이 중요한것이 아 닌가..? Component 에 Activity Scope 이라고 적어놓고 Fragment 에서 생성하 면 결국 생성은 Fragment 에서 한것이니 Fragment 생명주기를 따르지 않을 까..? - @Retention 은 무엇인가?