의존관계 주입(Dependency Injection)

강풍윤·2022년 3월 4일
0

Dependency란?

Dependency Injection이란 객체지향 프로그램에서 가장 중요한 개념 중 하나입니다.

Dependency Injection을 이해하기 위해 먼저 'Dependency', 즉 '의존관계'에 대해 먼저 알아보겠습니다.

'의존한다'라는 것을 이해하기 위해 'A가 B를 의존한다'라는 표현에 대해 의미를 알 필요가 있습니다.

"의존대상 B가 변하면 그것이 A에 영향을 미친다"

-토비의 스프링 3-1, 에이콘(2012), p113

즉, B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미치는 관계를 의미합니다.
그 예시로, '햄버거 가게 요리사는 햄버거 레시피에 의존한다.'라는 문장을 살펴보겠습니다. 햄버거 레시피가 변화했을 때, 변화된 레시피에 따라 요리사는 햄버거 만드는 방법을 수정해야 합니다. 레시피의 변화가 요리사의 행위에 영향을 미쳤기 때문에, 요리사는 레시피에 의존한다라고 말할 수 있습니다.

Dependency Injection이란?

그리고 이러한 의존관계를 외부에서 결정하고 주입하는 것을 의존관계 주입(Dependency Injection)이라고 말합니다.

위의 예시로 햄버거 요리사 안에서 의존관계인 햄버거 레시피가 직접 결정했다면, 햄버거 레시피가 제 3자인 햄버거 가게 사장님이 정해서 햄버거 요리사가 그 레시피로 요리하는 상황을 생각해 볼 수 있습니다. 즉, 햄버거 요리사가 의존하고 있는 레시피를 외부(햄버거가게 사장님)에서 결정하고 주입하는 것입니다.

Dependency Injection 사용목적

지금까지 의존관계 주입이라는 개념을 알아보았는데, 왜 이 개념이 중요한지를 설명드리겠습니다.

위에서 배운 내용처럼 Java와 같은 객체지향 프로그램에서 다른 객체를 사용하는 것을 다르게 표현하면 "다른 객체를 의존한다."라고 표현할 수 있습니다.

다른 객체를 사용하기 위해서는
1. 객체를 직접 생성하거나
2. 이미 객체가 생성되어있어야 합니다.

아래의 그림을 보면 두 가지 방법 모두 A객체는 B,C의 기능을 의존하고 있습니다.

하지만, B, C의 기능을 직접 생성하는 경우에는 B, C의 기능 생성부터 메모리 관리, 소멸까지 개발자가 다 관리해주어야 합니다. 때문에 기능을 직접 생성해주는 경우에서는 A객체와 B, C의 기능은 강한 결합으로 이루어져 있다고 할 수 있습니다.

외부에서 기능을 주입하는 경우에는 이미 누군가 생성한 기능을 주입하기 때문에, 외부에서 주입한 기능을 사용만 하면 되기 때문에 약한(느슨한) 결합으로 이루어져 있다고 할 수 있습니다.

객체지향 프로그램에서 느슨한 결합을 사용하게 되면 개발자가 관리할 것이 적어진다는 장점이 있습니다. 또한 외부에서 만든 기능을 다른 객체에서 같은 기능이 필요하면 재사용할 수 있다는 장점도 있습니다. (이로써 같은 코드를 다시 작성할 필요가 없어 코드도 간결해집니다.)

참고자료

  1. 3기_완태, "의존관계 주입(Dependency Injection) 쉽게 이해하기"
    https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

  2. 인프런 - 지식을 배우고 나눠요, "Dependency Injection - DI개념"
    https://www.youtube.com/watch?v=fGOU7JqNHyE&t=546s

profile
https://github.com/KANGPUNGYUN

0개의 댓글