Files
2nd/10_Wiki/Topics/Dependency_Injection.md
T
2026-05-02 23:33:34 +09:00

3.8 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, tags, raw_sources, last_reinforced, github_commit
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score tags raw_sources last_reinforced github_commit
P-REINFORCE-WIKI-DEV-DI 의존성 주입과 유연한 객체 조립 (Dependency Injection) Unified verified
DI
의존성 주입
Dependency Injection
객체 조립
제어의 역전
A 1.0
Design_Patterns
Dependency_Injection
Clean_Architecture
SOLID
Testability
Datacollector_Export_2026-05-02
2026-05-02

의존성 주입과 유연한 객체 조립 (Dependency Injection)

1. 개요

의존성 주입(DI, Dependency Injection)은 객체가 자신이 사용할 의존 객체를 내부에서 직접 생성(New)하지 않고, 외부(컨테이너 혹은 설정자)로부터 주입받는 설계 패턴이다. 이는 객체 간의 결합도를 낮추고 제어의 역전(IoC)을 실현하는 구체적인 수단으로, 변경에 유연하고 테스트가 용이한 고도화된 소프트웨어 구조를 구축하는 핵심 기법이다.

2. 주입 방식의 분류

  • 생성자 주입 (Constructor Injection): 객체 생성 시점에 의존성을 필수로 전달받음. 객체의 불변성을 보장하고 누락된 의존성을 컴파일 타임에 확인 가능하여 가장 권장되는 방식.
  • 수정자 주입 (Setter Injection): 선택적인 의존성이 있거나 런타임에 의존성을 변경해야 할 경우 사용. 객체 생성 후 언제든 주입 가능하나, 주입되지 않은 상태로 사용될 위험 존재.
  • 인터페이스 주입 (Interface Injection): 의존성을 주입받는 메서드를 포함한 인터페이스를 구현하여 주입. 자바 등의 언어에서는 잘 사용되지 않음.

3. 엔지니어링 가치

  • 결합도 완화 및 유연성 확보: 클래스가 구체적인 구현체(Concrete Class)가 아닌 인터페이스에 의존하게 되므로, 코드 수정 없이도 설정만으로 다른 구현체(예: MySQL -> MongoDB)로 교체 가능.
  • 테스트 용이성 (Mocking): 실제 데이터베이스나 네트워크 서비스 대신 가짜 객체(Mock/Stub)를 주입하여, 환경에 구애받지 않고 핵심 비즈니스 로직을 독립적으로 정밀 테스트 가능.
  • 보일러플레이트 코드 감소: DI 컨테이너(Spring, NestJS, Inversify 등)가 객체의 생명주기와 의존 관계 조립을 자동화해 주므로, 개발자는 핵심 로직 구현에만 집중 가능.

4. 트레이드오프 및 주의사항

  • 가독성의 양면성: 코드 수준에서 의존 관계가 명시적으로 드러나지 않고 컨테이너 설정에 숨겨져 있어, 시스템의 전체적인 실행 흐름(Runtime Flow)을 파악하기 위해 추가적인 학습과 도구 활용이 필요함.
  • 초기 학습 곡선: DI 컨테이너의 동작 원리와 설정 방식을 숙지해야 하며, 잘못된 설정으로 인한 런타임 에러(Circular Dependency 등)를 디버깅하는 데 숙련도 요구.
  • 오버헤드: 미미한 수준이지만 리플렉션(Reflection) 기반의 DI 프레임워크는 초기 구동 시 성능 저하가 있을 수 있음. 성능이 극도로 중요한 환경에서는 수동 주입이나 컴파일 타임 DI 고려 필요.

🧪 검증 상태 (Validation)

  • 정보 상태: 검증 완료 (Verified)
  • 출처 신뢰도: A
  • 검토 이유: 객체 간의 결합을 끊고 시스템의 조립성과 테스트 가능성을 극대화하기 위한 현대 소프트웨어 개발의 필수 구현 표준 정립.