SpringBoot

의존성 주입(DI)의 세 가지 방식: 필드 주입, 생성자 주입, Setter 주입

초코너무조코 2025. 6. 3. 22:46
728x90

의존성 주입(DI, Dependency Injection)은 객체 간의 결합도를 낮추고, 테스트나 유지보수를 용이하게 하기 위한 핵심 패턴입니다. 스프링(Spring) 같은 프레임워크에서는 DI를 통해 객체 간 관계를 효율적으로 관리할 수 있습니다.

DI에는 대표적으로 다음과 같은 세 가지 방식이 있습니다.

1. 필드 주입 (Field Injection)

@Component
public class OrderService {
    @Autowired
    private PaymentService paymentService;
}

장점

  • 코드가 간결하다.
  • 가장 쉽게 적용할 수 있다.

단점

  • 테스트하기 어렵다 (Mock 주입이 복잡).
  • final 키워드를 사용할 수 없다.
  • 순환 참조 문제에 취약하다.

Tip: 빠르게 시제품을 만들 때는 편하지만, 유지보수에는 적합하지 않을 수 있습니다.


2. 생성자 주입 (Constructor Injection)

@Component
public class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

장점

  • 불변성 보장 (final 사용 가능).
  • 테스트가 용이하다.
  • 의존성 누락을 컴파일 시점에 확인할 수 있다.

단점

  • 의존성이 많을 경우 생성자가 길어질 수 있다.

Best Practice: 스프링 팀에서도 생성자 주입을 가장 권장합니다.


3. Setter 주입 (Setter Injection)

@Component
public class OrderService {
    private PaymentService paymentService;

    @Autowired
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

장점

  • 선택적 의존성 주입이 가능하다.
  • 유연하게 설정 변경 가능.

단점

  • 객체가 완전히 초기화되지 않은 상태로 사용될 가능성 존재.
  • 테스트 시 누락된 의존성을 런타임까지 알기 어렵다.

정리

방식  장점   단점 추천 사용처
필드 주입 간단하고 코드가 짧음 테스트 불편, final 불가 프로토타입, 실험적 코드
생성자 주입 불변성, 테스트 용이 생성자가 길어질 수 있음 대부분의 경우 추천
Setter 주입 선택적 의존성 처리 가능 불완전한 객체 가능성 설정값 등 선택적 의존성

결론:
생성자 주입이 가장 안정적이며 테스트와 유지보수 측면에서도 유리합니다. 가능하다면 생성자 주입을 기본으로 사용하고, 상황에 따라 Setter나 필드 주입을 보완적으로 사용하는 것이 좋습니다.

 

728x90