앞의 글에서 의존성 주입이란 무엇인지. 왜 필요한지를 알게 되었다.
이번 글에서는 이러한 의존성 주입을 쉽게 할 수 있도록 도와주는 프레임웍 Dagger2에 대해 살펴본다.
그 전에 앞의 글에서 의존성 주입을 위해 필요했던 사항을 살펴보도록 한다.
의존성 주입을 위해 필요한 사항
의존성
클래스간의 강한 의존성은 인터페이스화를 통해 약한 의존성을 가지도록 만들 수 있다.
주입
클래스A에 의존성이 있는 클래스B의 인스턴스를 클래스A 내부에서 생성하는 것이 아니라 클래스A 외부(Container)에서 생성하여 주입 클래스A에 주입함으로써 클래스간 결합도를 약하게 만들 수 있다.
*위의 내용이 이해가 가지 않는다면 앞의 글을 먼저 읽고 오도록 하자.
Dagger2란
Dagger2란 의존성 주입을 체계적으로 할 수 있도록 만들어진 프레임웍이다. 따라서 위의 의존성 주입을 위한 필요 사항들을 쉽게 할 수 있도록 구현되어 있다.
의존성 주입에 필요한 요소들
먼저 의존성 주입을 위한 필수 요소에 대응하는 Dagger2의 개념을 살펴보자.
Container(Component)
먼저 주입(Injection)을 하기 위한 가장 기본적인 요소인 Container이다. Container은 외부에서 클래스의 인스턴스를 생성하는 공간이다. Dagger2에서는 이러한 Container을 Component라 부른다.
Module
Module은 클래스의 인스턴스들을 모아놓는 공간으로 Component에 의존성을 제공하는 역할을 한다.
기존 IOC에는 Module이라는 개념이 없지만, Dagger에서는 특정 Container(Component)가 제공해야 하는 의존성이 Module 단위로 관리되어야 한다는 것이 편하다는 것을 고려하여 Module을 통해 클래스의 인스턴스들을 모듈 단위로 관리한다.
*Module : 특정 기능을 위한 코드의 묶음 예) 네트워크를 위한 코드의 묶음, DB 조작을 위한 코드의 묶음
위의 그림4와 같이 하나의 Container에 Network Module과 Database Module이 들어갈 수 있다.
Provider(Provides)
Provider은 인스턴스를 제공(Provide)하는 역할을 한다. 즉, 주입부의 인스턴스를 제공하는 것이 바로 Provider이다.
*Provider, Provide, Provides 모두 같은 의미로 쓰인다.
*Provider는 그림5와 같이 모듈 단위로 관리된다.
정리
모든 의존성 주입 프레임웍에는 의존성 주입에 필수적인 요소들이 구현되어 있다. Dagger2에서도 마찬가지로 의존성 주입에 필수적인 요소들이 위와 같이 구현되어 있다.
Component, Module, Provider의 관계를 알았으면 다음 글에서 이것들을 이용해 어떻게 의존성을 주입하는지 살펴보도록 하자.