Groo

Dependency Injection 디자인 패턴 본문

프로그래밍 기초/Pattern

Dependency Injection 디자인 패턴

김주엽 2020. 5. 4. 15:16

안녕하세요, 오늘은 프로그래밍 과정에서 새롭게 추가하면 좋을만한 패턴인 의존성 주입에 대해 알아보겠습니다.
의존성 주입은 어느 프로그래밍 언어에서도 공통적으로 적용 가능하기 때문에 범용성이 높은 패턴이라고 부릅니다.

💊 Dependency Injection 대체 무엇인가?

소프트웨어 프로그래밍의 관점에서 Dependency Injection 즉 의존성 주입을 간단히 설명한다면 하나의 객체(C)가 다른 객체(B)를 필요로하는 특정 객체(A)에게 의존성을 대신 간접적으로 전달해주는 역할이라고 말할 수 있습니다. 아래의 예시를 보겠습니다.

 

A라는 특정 객체가 B라는 다른 객체를 참조하고 싶다면 이전 같은 경우에는 A가 B를 직접적으로 참조하였습니다. 그러나 의존성 주입을 활용한다면 C라는 하나의 객체가 A라는 특정 객체를 대신해 의존성을 간접적으로 전달해주고 있는 모습을 볼 수 있습니다.

 

이와 같이 A라는 각 클라이언트들이 필요로하는 객체를 직접적으로 접근하지 않아도 C라는 서비스가 관련 일들을 모두 통틀어서 클라이언트에게 주입해주기 때문에 이들은 객체간의 결합도를 줄이며 유연성과 확장성이 높은 관계를 맺을 수 있게되는 것입니다.

🔦 의존성 주입의 다양한 종류는?

위에서 설명한 의존성 주입 패턴을 프로그램 내에 쉽게 적용할 수 있도록 도와주는 다양한 종류의 라이브러리 및 프레임워크가 존재합니다. 의존성 주입은 어느 프로그래밍 언어에서도 동일하게 적용 가능하므로 각 언어에 따라 알맞게 선택하여 사용하면 됩니다.

 

🎨 의존성 주입의 장점은?

의존성 주입 기술을 활용하는 것은 필수가 아니며 이를 적용하지않고도 프로그램을 구현해낼 수 있습니다. 그러나 프로그램 내에 의존성 주입 기술을 적용한다면 수 많은 이점들을 얻을 수 있을 것이며 프로그램을 더욱 체계적으로 구현 가능한 것이 장점입니다.

 

1. 코드의 재사용성 증가

만약 특정 객체를 여러 클라이언트에서 의존한다면 각 클라이언트가 특정 객체를 모두 구현할 필요없이 서비스가 이를 한 번만 구현하여 여러 클라이언트에게 의존성을 주입해주어 효율적입니다.
2. 리펙토링의 과정 수월

특정 객체에 의존성이 존재하는 클라이언트와 특정 객체를 필요로하는 클라이언트에게 간접적으로 의존성을 주입하는 서비스의 모듈이 체계적으로 분리되어 리펙토링 과정에서 조금 더 수월합니다.
3. 보일로 코드 감소

특정 객체를 필요로하는 클라이언트가 직접적으로 그 객체를 구현하지 않고 주입 받는 형식으로 이루어지기 때문에 필요할 때만 데이터를 전달받아 보일러 코드와 같이 메모리 누수 현상을 막을 수 있습니다.
4. 프로그램 테스트 용이

프로그램 내의 각 모듈들이 체계적으로 분리되어 Unit Test를 보다 더 쉽게 진행할 수 있습니다.

⏰ IOC 제어 역전이란?

DI 의존성 주입을 확실히 이해하기 위해서는 Inversion Of Cotrol 즉 제어 역전에 대해서 알아야합니다. 이는 개발자가 직접적으로 프로그램의 흐름을 제어하는 코드를 작성하는 것이 아닌 외부 프레임워크 또는 라이브러리의 흐름 제어를 전달 받는 것입니다.

 

IOC 원칙을 통해 소프트웨어를 개발한다면 인스턴스 생성, 호출 등 잡다한 일들을 개발자가 직접 하지 않아도 외부 프레임워크 또는 라이브러리가 이를 알아서 처리하게 되는 것이죠, 따라서 모든 제어 권한의 소유는 간단히 개발자가 아닌 외부 모듈인 것입니다.

👍 글을 마치며

오늘은 Dependency Injection 디자인 패턴의 개념과 종류 및 장점에 대해서 알아보는 시간을 가졌습니다. 저 또한 처음에는 의존성 주입에 관한 내용이 많이 어렵고 이를 굳이 프로그램 내에 적용을 해야하는 이유에 대해서 궁금하였습니다. 하지만 앞에서도 말했듯이 이를 프로그램 내에 적용한다면 장점들이 워낙 많고 효율적이기 때문에 좋을 것이라고 생각했습니다. 다음 시간에는 의존성 주입 라이브러리를 활용하여 실제로 DI 디자인 패턴을 바탕으로 코드를 작성해보는 연습을 해보도록 하겠습니다. 감사합니다.

Comments