본문 바로가기
Android 개발/Hilt, Koin, DI(Dependency Injection)

Dependency Injection(DI)에 대해서 알아보자

by Developer88 2019. 12. 28.
반응형

 

Dependency Injection(DI)은 개발을 해 보신분이라면

어디선가는 결국 듣게 되는 개념입니다.

오늘은 복잡해 보이는 이 개념이 무엇인지 정리해 보도록 하겠습니다.

1. Dependency Injection(DI)

1-1. Dependency

우리말로는 의존 혹은 의존성이라고 할 수 있겠는데요.

그럼 누가 누구에게 의존하는 것일까요?

하나의 클래스가 다른 하나의 클래스에 의존하는 것을 의미합니다.

 

A클래스가 객체를 만들기 위해 B를 필요로 하는 것인데요.

B는 A의 의존(Dependency)의 대상이 되는 것이지요.

 

현실에 비교해 보면, 자동차 회사는 타이어 부품회사에 의존하고 있고,

타이어 부품회사는 의존의 대상,즉 Dependency가 되는 것이지요.

각각 Car클래스와 Tire클래스를 생각해 볼 수 있고 Dependency의 개념을 생각해 볼 수 있습니다.

 

 

이제 무엇을 Dependency라고 하는지 알게 되었다면,

Injection에 대해서 알아보겠습니다.

1-2. Injection

injection은 우리말로는 주입이라고 할 수 있는데요.

무엇을 주입한다는 것일까요?

 

이것을 이해하기 위해서,

위에서 애기했던 Car클래스와 Tire클래스의 Dependency를 코드를 통해 보도록 하겠습니다.

Car클래스에서는 Tire클래스의 객체를 생성한 다음 Car클래스의 객체를 만들텐데요.

아래와 같이 Car클래스에서 매번 Tire객체를 만들어 주어야 하겠지요.

 

 

그런데, 실제 공장에서 자동차를 만드는 것을 생각해 보면,

보통 자동차 공장에서 Tire를 만들지는 않지요.

현대차에서도 Tire는 금호타이어같은 회사에 주문해서 받아와 조립할 뿐입니다.

프로그래밍도 그렇게 하자는 것이지요.

 

예를 들어 자동차에 타이어 4개가 필요하다고 하면,

타이어 회사의 어떤 부서에 요청을 할테고,

그것을 다 만들어서 배달해 줄 것입니다.

대부분의 다른 부품들도 마찬가지일 테구요.

 

 

프로그램적으로

Car클래스에서 Tire객체를 만드는 것이 아니라,

외부에서 Tire객체를 만들어 받아와서 Car클래스를 생성하면 되는 것이지요.

이렇게 외부에서 의존관계가 있는 대상을 가져오는 것을

Dependency를 외부에서 주입(Inject)해 준다고 합니다.

 

이렇게 함으로서,

Car클래스에서는 특별히 다른 타이어에 따라서 코드를 수정할 필요없이,

그냥 inject(주입)받아서 사용만 하면 되는 것이지요.

이렇게 하면 분리되어 있는 코드들에 대해서 각각 테스트 하고 수정하는 것이 가능해서 더욱 효율적일 수 있습니다.

 

1-3. Dependency Injection의 간단한 구현

그럼 어떻게 하면 Dependency Injection을 구현할 수 있을까요?

 

Car클래스에 비유해보면,

Car클래스에서 Tire클래스의 객체를 직접 생성하지 않고,

어떻게 Tire클래스의 객체를 전달받을 수 있을까요?

 

Constructor나 setter메소드를 이용해서 객체자체를 전달받으면 될텐데요.

아래와 같이 Car클래스 내부가 아닌 외부에서 타이어 객체를 만들어서

Car클래스에 만들어진 타이어 객체를 전달해 주는 것이지요.

 

 

코드로 까지 보면 그렇게 어렵지 않은 개념이라는 것을 알 수 있을 것 이구요.

굳이 Dagger같은 라이브러리를 이용하지 않고서도,

Dependency Injection이라는 개념을 쉽게 사용할 수 있다는 것을 알 수 있습니다.

 

그런데 왜 굳이 라이브러리가 필요한 것일까요?

이 부분도 자동차에 비교해 보겠습니다.

자동차에는 엄청나게 많은 부품이 들어가게 됩니다.

이를 클래스로 만든다면 Car class에 엄청나게 많은 부품을

객체로 받아들일 수 있는 생성자나 setter메소드가 필요한 것인데요.

그럼 그에 따라서 생성자나 setter메소드를 모두 관리해 주어야 하는 필요성이 생깁니다.

 

이러한 부분에서 효율성을 높이기 위해서,

올바른 순서로 생성시키고 객체를 받아들일 수 있도록 관리하는 dagger와 같은 라이브러리가 필요한 것이지요.

어떤 식으로 Dagger라이브러리를 이용해서 의존성을 구현해 내는지에 관해서는 다른 글에서 정리해 보도록 하겠습니다.

 

728x90

댓글