Jin's IT Story.

의존성 주입이란 무엇일까 객체를 직접 만들지 않는 이유

| 2026-11-09
목차
    두 개의 블루 톤 모듈 부품이 유기적으로 결합하는 모습을 형상화한 의존성 주입 개념 썸네일 이미지
    프로그램을 개발할 때 하나의 객체가 모든 일을 혼자 처리하지는 않습니다. 보통 여러 객체가 서로 협력하며 기능을 동작시키는데, 이때 객체가 다른 객체를 직접 생성해 사용하면 코드 간의 결합도가 지나치게 높아지는 문제가 발생합니다. 이러한 문제를 해결하고 소프트웨어의 유연성을 높이기 위해 등장한 대표적인 디자인 패턴이 바로 의존성 주입(Dependency Injection, DI)입니다.

    의존성 주입 뜻과 객체 간의 관계 이해하기

    의존성 주입 뜻은 쉽게 말해 '객체가 필요한 부품을 내부에서 직접 만들지 않고, 외부에서 만들어진 객체를 전달받아 사용하는 방식'을 의미합니다. 여기서 의존성이란 한 클래스가 자신의 작업을 수행하기 위해 다른 클래스의 도움을 받아야 하는 관계를 뜻합니다.

    예를 들어 렌터카를 이용하는 운전자를 생각해 볼 수 있습니다. 운전자가 도로를 달리기 위해 특정 차량의 부품을 직접 사서 조립할 필요는 없습니다. 렌터카 업체에서 이미 완성되어 정비가 끝난 차량을 받아 타고 가기만 하면 됩니다. 이처럼 객체가 자신이 사용할 부품(의존성)을 스스로 만들지 않고 외부에서 넣어(주입)받는 원리가 의존성 주입입니다.

    객체를 직접 생성할 때 발생하는 결합도 문제

    개발자가 클래스 내부에서 new 키워드로 다른 객체를 직접 생성하면 두 코드 사이의 결합도(Coupling)가 매우 강해집니다. 결합도가 높다는 것은 한쪽 코드가 수정되거나 변경되었을 때, 그 객체를 사용하는 다른 쪽 코드까지 연쇄적으로 수정해야 함을 의미합니다.

    만약 식당 주인이 메뉴판을 바꿀 때마다 주방 기구 전체를 새로 사서 설치해야 한다면 매우 비효율적일 것입니다. 기존 방식대로 클래스 내부에서 의존 객체를 직접 만들어 쓰면, 하위 클래스의 이름이나 동작 방식이 바뀔 때마다 이를 참조하는 상위 클래스 코드를 일일이 수정해야 하는 번거로움과 오류 위험이 따릅니다.

    IoC(제어의 역전)와 의존성 주입의 작동 방식

    의존성 주입을 설명할 때 빼놓을 수 없는 개념이 바로 IoC(Inversion of Control, 제어의 역전)입니다. 일반적인 프로그램에서는 개발자가 작성한 코드가 전체 실행 흐름과 객체의 생성 및 소멸을 직접 제어합니다.

    하지만 IoC 환경에서는 이러한 객체 관리의 제어권이 개발자에게서 프레임워크나 외부 컨테이너로 넘어갑니다. 객체의 생명주기를 외부에서 관리하고 필요한 시점에 알아서 주입해주기 때문에 제어의 흐름이 뒤바뀌었다고 하여 제어의 역전이라 부릅니다. 의존성 주입은 이러한 IoC 설계 철학을 실제 코드 수준에서 구현하는 구체적인 기법 중 하나입니다.

    의존성 주입(DI)을 활용하면 얻는 명확한 장점

    의존성 주입 기법을 프로젝트 구조에 적용하면 소프트웨어의 전체적인 유지보수성과 확장성이 대폭 향상됩니다. 대표적인 장점은 다음과 같습니다.

    • 코드의 재사용성과 유연성 증가: 각 구성 요소가 독립된 모듈처럼 작동하므로 필요에 따라 부품을 쉽게 교체할 수 있습니다.
    • 유닛 테스트의 용이성: 실제 데이터베이스나 외부 API 대신 가짜 객체(Mock)를 주입하여 개별 기능을 독립적으로 안전하게 테스트할 수 있습니다.
    • 낮은 결합도와 높은 가독성: 각 클래스가 자신의 핵심 로직에만 집중할 수 있어 전체적인 프로그램 구조가 훨씬 명확해집니다.

    유연한 소프트웨어를 만드는 첫걸음

    결국 의존성 주입은 객체 간의 끈끈한 연결고리를 약하게 만들어 변화에 유연하게 대처할 수 있도록 돕는 핵심 설계 방식입니다. 객체를 내부에서 직접 만들지 않고 외부에서 받아 쓰는 원리를 이해하면 한층 더 깔끔하고 확장 가능한 코드를 작성할 수 있습니다.

    요즘 대부분의 백엔드 및 모바일 앱 개발 프레임워크에서는 이 패턴을 기본으로 채택하고 있으므로, 기본 개념을 잘 파악해 두는 것이 안정적인 개발 환경을 구축하는 데 큰 도움이 될 것입니다.