Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발새발 블로그

간단한 예제로 보는 Dagger2 적용해보자! - 개발새발블로그 본문

android

간단한 예제로 보는 Dagger2 적용해보자! - 개발새발블로그

SeanBlog 2020. 2. 2. 17:58

안녕하세요! 개발새발로 코딩하는 블로그입니다.

오늘 알아볼주제는 dagger2 입니다!

 

먼저 DI 에 대해 아셔야합니다.

 

 

DI 란?

DI( Dependency Injection ) : 의존성 주입을 의미합니다.

특정 객체의 인스턴스가 필요한 경우 이를 외부에서 생성하여 전달하는 기법입니다.

 

Dagger란 이 의존성 주입을 쉽게 구현하기 위해 사용되는 라이브러리입니다.

 

 

여기서 말하는 의존성이란???

  • 코드에서 두 모듈간의 연결도
  • 두 클래스 간의 관계도
  • 의존성이 높다??? =  Coupling(결합도)이 높다는것입니다.

 

그렇다면 의존성이 높다는 것은 안좋나요??

  • 하나의 모듈이 변경됨에 따라 결합된 다른 모듈이 영향을 받게될 수 있습니다.
  • 두개의 모듈일때는 괜찮지만 최악의경우 모듈이 100개,1000개…n 개 일때 하나의 모듈변경으로 인해 다른 모듈이 영향을 받는다면??...
  • 나머지 모듈이 제대로 동작하는지에 대한 검증이 필요할 수도 있습니다. 그럼 시간과 비용도 n만큼??
  • 최종적으로 결합도가 높으면 독립성이 떨어집니다. 반대로 결합도가 낮으면 독립성이 높아지죠!

그렇다면 DI, 의존성 주입의 목적은 무엇이죠?

  • 가장 큰 목적은 모듈을 Test가 가능하다는 것!, 독립된 모듈에 대한 테스트 코드 작성이 용이해집니다.
  • 하나의 모듈이 변경되어도 다른 모듈들이 영향을 받지 않으므로 유지보수가 용이해집니다!
  • new를 이용한 생성자를 없앨수 있죠! 모듈내에서 다른 모듈을 초기화하면 결합도가 높아지므로 객체생성은 다른곳에서 하고 생성된 객체를 참조하는 방식을 사용합니다!
  • 최종적으로 객체생성을 외부에서 하므로 클래스의 독립성이 증가되며 이에따라 클래스를 테스트 가능하며, 코드 재사용의 가능성도 높아집니다...!

정리 - DI,(의존성주입)

두개이상의 클래스간의 결합도를 낮추기 위해 외부에서 객체를 생성(new)하고 주입하는 것

 

 

간단한 예제를 통해 무슨말인지 확인하시죠!

 

먼저 기존 저희가 작성하던 코딩방법입니다.

 

라면을 끓인다고 가정하겠습니다.

라면 끓이기위해서는 물, 스프, 면이 필요하겠죠

 

먼저 Water 클래스를 생성해줍니다.

 Water Class

다음으로 Soup 클래스를 생성해줍니다. (전 면보다 스프를 먼저 넣거든요.)

Soup

다음으로 Noodle 클래스를 생성해줍니다.

Noodle

마지막으로 구성품을 합쳐 만들어지는 Ramen 클래스를 작성해줍니다.

Ramen

 

이렇게 만들어진 클래스들을  MainActivity에서 사용하려면 어떻게 하셨었나요?

MainActivity

이런식으로 

 Water water = new Water();
 Noodle noodle = new Noodle();
 Soup soup = new Soup();

 

먼저 각각의 객체를 전부 생성해주고 해당 객체를

Ramen ramen;

ramen = new Ramen(soup,water,noodle);

 

이런식으로 Ramen 클래스를 생성해 직접 넣어 최종적으로 라면을 완성했습니다.

 

 

 

그럼 이제 Dagger 를 사용해보죠!

먼저 Dagger는 Module과 Component, Inject 3가지가 있습니다.

쉽게 설명하여

Module 은 공급할 객체를 생성합니다. 면,물,스프가 되겠군요.

Component 는 Module을 불러와 생성한 객체를 어디로 주입할지 정합니다. ( 연결해주는 역할이라고 생각하세요.)

Inject 는 최종적으로 주입받은것을 가져옵니다.

 

간단하게 , Module이 공급을하고 그걸 Component가 연결해줘 Inject가 최종적으로 주입을 받습니다. 

 

헷갈리실수 있지만 간단한 예제로 위의 작성했던 코드를 변경해보겠습니다.

 

먼저 graddle에 dagger 라이브러리를 추가해야겠죠?

 

Step 1

해당 최신 버전은 dagger 공식 github에서 확인하실수 있습니다.

 

https://github.com/google/dagger

 

google/dagger

A fast dependency injector for Android and Java. Contribute to google/dagger development by creating an account on GitHub.

github.com

 

 

Step 2

 

 

다음으로 Module을 작성해줍니다.

 

하나씩 설명해보죠!

 

먼저 Ramen 객체를 제공할 RamenModule이라는 클래스를 생성하고,

해당 클래스에 @Module이라고 어노테이션을 붙여줍니다.

그 후 인스턴스를 제공해주는 메소드에는 @Provides 라고 붙입니다.

 

간단하게 MainActivity에서 new 연산자를 통해 일일히 생성하던 것을

Module이 대신 미리 만들어준다고 생각하면 됩니다.

 

Step 3

이후 연결을 위해 Component를 작성합니다.

ComponentInterface로 생성하였으며,

@Component 어노테이션을 통해 작성해두었던 RamenModule을 가져옵니다.

이 후 어디에 주입할지만 정해주면 됩니다.

저는 MainActivity로 하였으며 사용된 inject 메소드명은 변경가능합니다.

 

간단하게 RamenModule 을 가져와 MainActivity에 주입! 한다고 생각하시면됩니다.

 

Step 4

마지막으로 MainActivity에서 사용해보겠습니다.

사용하기전에 먼저 Build -> Rebuild Project 해주세요!

빌드를 해주시면 자동으로 Dagger component파일이 생성됩니다..! ( Dagger + "컴포넌트 이름" )

ex) DaggerRamenCompent

 

 

먼저,

@Inject
Ramen ramen;

 

을 통해 주입을 받고,

 

RamenCommponent ramenCommponent = DaggerRamenCommponent.builder()
.ramenModule(new RamenModule())
.build();

ramenCommponent.inject(this);

 

작성했던 컴포넌트를 통해 RamenModule을 MainActicity에 주입해줍니다!

 

그러면 끝!! 간단하지않나요?

Ramen 클래스를 new 연산자를 통해 생성하지 않아도됩니다..!

 

 

 

심화자료를 원하신다면,

 

Pluu Dev 에서 번역해준 글도 있으니 참고하시면 좋을꺼같습다.

http://pluu.github.io/blog/android/2017/01/12/android-dagger/

 

 

Pluu Dev - [번역] 쉬운 Dagger2

[번역] DroidKaigi 2019 ~ 멀티 모듈 프로젝트에서의 Dagger를 사용해 Dependency Injection Posted on 27 Jan 2020 Fragment Lifecycle과 LiveData Posted on 25 Jan 2020 ViewBinding의 작은 변화 Posted on 19 Jan 2020 [번역] Unicode 이모티콘에 얽힌 이것저것 (이모티콘 표준과 프로그래밍 핸들링) Posted on 11 Jan

pluu.github.io

 

Comments