의존성 주입에 대한 총 정리

Dear·2025년 9월 30일

TIL

목록 보기
70/74

💙 의존성

의존성이란 종속성이라고도 하며 A가 B에 의존성이 있다는 것은 B의 변경 사항에 대해 A 또한 변해야 된다는 것을 의미한다.

💙 의존성 주입

메인 모듈(main module)이 ‘적접’ 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자(dependency injector)가 이 부분을 가로채 메인 모듈이 ‘간접’적으로 의존성을 주입하는 방식이다.
이를 통해 메인 모듈(상위 모듈)은 하위 모듈에 대한 의존성이 떨어지게 된다.
이를 ‘디커플링이 된다’고도 한다.

"A가 B에 의존한다" = A 안에 B가 있다
즉, 의존하는 쪽(A) 안에 의존받는 대상(B)이 있다.

// 자동차(A)가 엔진(B)에 의존
public class Car {  // A (의존하는 쪽)
    private Engine engine;  // B (의존받는 대상)
    
    public void start() {
        engine.turnOn();  // 엔진이 없으면 자동차가 작동 안됨
    }
}

public class Engine {  // B
    public void turnOn() {
        System.out.println("부릉부릉");
    }
}
  • A가 B를 사용
  • A 코드 안에 B가 포함됨
  • B가 바뀌면 A가 영향받음

💚 의존성의 방향

  • Car가 메인(상위 모듈)
  • Engine이 하위 모듈
  • Car가 Engine에 의존성을 가지고 있다 (Car → Engine)

"의존성을 준다"는 표현이 헷갈릴 수 있는데, 정확히는:

  • Car가 Engine을 필요로 하는 것 = Car가 Engine에 의존한다
  • 즉, 의존성의 방향은 Car → Engine

💚 의존성 주입 전 (직접 의존)

public class Car {
    private Engine engine;
    
    public Car() {
        this.engine = new Engine(); // Car가 Engine을 직접 생성
    }
}
  • Car가 Engine을 직접 생성
  • Car와 Engine이 강하게 결합(tightly coupled)

💚 의존성 주입 후 (간접 의존)

public class Car {
    private Engine engine;
    
    public Car(Engine engine) { // 외부에서 Engine을 주입받음
        this.engine = engine;
    }
}

// 의존성 주입자가 관리
Car car = new Car(new Engine()); // 외부에서 Engine을 만들어서 넣어줌
  • Car는 Engine을 외부에서 받음
  • 의존성 주입자가 중간에서 Engine을 제공
  • Car와 Engine이 느슨하게 결합(loosely coupled) = 디커플링

💚 의존성 주입자

public class Main {  // ← 이 Main이 의존성 주입자 역할
    public static void main(String[] args) {
        Engine engine = new Engine();  // Main이 Engine 생성
        Car car = new Car(engine);     // Main이 Car에 Engine을 주입
    }
}

💙 핵심 정리

  • 메인: Car (상위 모듈)
  • 의존성: Car가 Engine에 의존한다 (Car는 Engine 없이 작동 불가)
  • 의존성 주입: 외부(의존성 주입자)가 Car에게 Engine을 "주입"해준다

"의존성을 준다"는 표현보다는 "의존성을 가진다" 또는 "의존성을 주입받는다"가 더 정확한 표현

🤍 회고

프로그래밍을 공부하면서 자주 접하는 '의존성', '의존하다', '의존성을 주다'라는 표현들이 막상 쓰일 때마다 애매하고 모호하게 다가왔다. 그래서 이번 기회에 이 개념들을 좀 더 명확히 이해하기 위해 정리해 두었다.

profile
친애하는 개발자

0개의 댓글