본문 바로가기
Java/객체 지향

의존성 주입(Dependency Injection)과 조립자

by 정구정구 2026. 6. 12.

의존성(Dependency)이란?

어떤 객체가 자신의 기능을 수행하기 위해 필요로 하는 외부 요소

 

 한 객체가 다른 객체를 사용할 때, 의존성이 있다고 한다. 

public class OrderService {

    private Rider rider = new Rider(); // 의존성
    
    ...
    
}

 

의존성 주입(Dependency Injection)이란?

 

외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴

 

 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮춘다.

 

 

의존성 주입(Dependency Injection) 이 필요한 이유

1. 객체 간 결합도 감소

  • 특정 구현체에 강하게 의존하지 않으므로, 코드 변경이 쉽고 유지보수가 용이

2. 코드 재사용성과 확장성 증가

  • 다양한 의존성을 주입 받아 동작할 수 있어, 같은 코드로 다른 시나리오를 쉽게 처리 가능

3. 테스트 용이성  증가

  • 실제 의존성을 사용하지 않고 테스트용 객체를 주입해서 테스트를 쉽게 작성 가능

 

public interface DeliveryAgent {
    void deliver(); // 배달
}
public class Rider implements DeliveryAgent{
    @Override
    public void deliver() {
        // 라이더 배달
    }
}
public class Drone implements DeliveryAgent{
    @Override
    public void deliver() {
        // 드론 배달
    }
}
public class OrderService {

    private final DeliveryAgent agent;

    public OrderService(DeliveryAgent agent) {
        this.agent = agent;
    }
    
    public void order() {       
        agent.deliver();    
    }
}
public static void main(String[] args) {

    OrderService service1 = new OrderService(new Rider());
    service1.order(); // 라이더가 배달

    OrderService service2 = new OrderService(new Drone());
    service2.deliver(); // 드론이 배달
    
}

 

 

조립자

의존성 주입(조립)을 담당하는 객체

 

 main이 의존성 주입과 실행을 모두 담당하는 것은 좋은 객체 지향 방식이 아니다. 한 객체는 하나의 책임을 지는 것이 유지보수에 아주 유리하기 때문이다. 의존성 주입 코드를 모두 모아 정리한 객체가 조립자이다.

 

// 조립자
public class DeliveryContext {

    // 도심 배송: 라이더 주입
    public static OrderService urbanCenter() {
        return new OrderService(new Rider());    // 여기서 '주입(Injection)' 해줌!
    }

    // 하늘길 배송: 드론 주입
    public static OrderService skyZone() {
        return new OrderService(new Drone());
    }
}
public static void main(String[] args) {

    OrderService urban = DeliveryContext.urbanCenter();
    urban.order(); // 라이더가 배달

    OrderService sky = DeliveryContext.skyZone();
    sky.deliver(); // 드론이 배달
    
}