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