DI(Dependency injection) 란?

JJAE WON·2021년 9월 3일
1
post-thumbnail

DI란?

DI는 Dependency injection의 준말로 '의존성 주입' 이라는 뜻을 가진다. 소프트웨어 공학에서 말하는 의존성 주입은 하나의 객체에 다른 객체의 의존성을 제공하는 기술이라고 표현한다. '의존 관계'에 있는 클래스들을 '주입'한다는 뜻인데 자세하게 살펴보자!!


🤓 그림으로 살펴보는 DI


의존 관계에 대해서 먼저 살펴보자면 어떤 클래스가 다른 클래스를 참조하는 것을 의미한다.

왼쪽 그림에서는 A객체B,C 객체를 참조하는 일반적인 의존성 관계의 모양이다.

오른쪽 그림은 외부에서 의존관계에 있는 B,C 객체를 생성한 후, setter 또는 생성자를 사용하여 의존 객체를 주입하고 있는 형태이다.


🤓 코드로 살펴보는 DI

  • 의존성 주입이 없는 코드
class MemoRepository{
	private val db = SQLiteDatabse()

	fun load(id : String){}
}

fun main(){
	val repository = MemoRepository()
	repository.load("8092")

}

데이터베이스로부터 저장된 데이터를 불러오는 MemoRepository 클래스가 있다.
내부에서 자체적으로 데이터베이스 객체 생성을 하고 있다.

그렇기 때문에 외부(main)에서 MemoRepository를 참조하여 데이터를 불러오기 위해선 인스턴스를 생성해 주어야 한다.

이런 경우에는 코드의 재활용성이 떨어지고, 만약 MemoRepository가 수정될 경우 main 도 수정해주어야 한다는 문제점이 생기게 된다.

그럴 경우, 결합도가 높다고 이야기 한다.


  • 의존성 주입이 있는 코드
class MemoRepository(private val db:Database){
	fun load(id : String){}
}

fun main(){
	val db = SQListeDatabase()
	val repository = MemoRepository(db)
	repository.load("8092")

}

위와 다른 점은 데이터베이스 객체 생성에 대한 책임을 MemoRepository에서 가지고 있지 않고
생성자의 매개변수로 데이터베이스를 전달받는 구조이다.

외부(main)에서 데이터베이스 객체를 생성하고 MemoRepository 생성자 매개변수로 데이터베이스 객체를 전달하는 구조이다.

이 경우에는, 의존하는 클래스를 직접 생성하는 것이 아니라 주입해주기 때문에 결합도도 낮추고 좀 더 유연한 코드를 만들 수 있게 된다.


DI의 특징

그림과 코드로 살펴본 DI의 특징을 정리하고 장점을 덧붙이자면 다음과 같다.

  1. 코드의 재활용성 을 높일 수 있기 때문에 유지보수가 용이해진다.
  2. 클래스 간 결합도를 낮출 수 있다.
  3. 인터페이스 기반으로 설계되며, 코드를 유연하게 한다.
  4. 단위 테스트하기가 더 쉬워진다.

추가로 !!
DI는 객체지향 설계의 다섯가지 원칙 SOLID 중에서
마지막 원칙인 의존관계 역전 원칙 (Dependency inversion principle) 을 따른다.

의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다!"



🤔 Android에서 어떻게 DI를 구현할까?

유지보수도 쉽고, 결합도도 낮출 수 있는 의존성 주입을 Android에서 어떻게 구현하면 좋을까?!

  1. 수동적으로 DI 구현하기
    위에서 살펴본 코드처럼 생성자의 매개변수로 전달하는 방법이 수동적으로 DI를 구현할 수 있는 대표적인 방법이다.
    하지만, Activity 나 Fragment 처럼 안드로이드 프레임워크에서 인스턴스화해서 제공하는 클래스에는 생성자의 매개변수로 DI를 구현하기가 쉽지 않다.

  2. DI 라이브러리 사용하기
    1번으로 DI를 구현하는데에는 한계가 있어 등장한 것이 DI 라이브러리이다.
    DI 라이브러리는 정확한 사용방법을 제안하고, 쉬운 설정 방법을 궁극적인 목표로 한다.
    대표적인 라이브러리는 Dagger, Koin, Hilt가 있다.



참고


profile
안드왕 찐천재가 되고싶다.

0개의 댓글