필드주입을 쓰면 안되는 이유를 아시는지요.
· 7 min read
레거시 코드를 마이그레이션 하던중 @Autowired을 통해 필드 주입으로만 의존성을 주입되어 있는 것을 발견하였다. 이를 생성자 주입으로 변경 하려고 하였지만 왜? 라는 의문이 들었고 이 포스팅 작성을 시작하였다.
의존성 주입
Spring Framework에서 의존성을 주입하는 방법은 3가지가 있다.
- 생성자 주입(Constructor Injection)
- 필드 주입(Field Injection)
- 수정자 주입(Method-Setter Injection)
그럼 이중 어떤 방법이 가장 권장될까?
결론이 생성자 주입 이라는 것은 아마 스프링 사용자라면 대부분 알고있다. 하지만 왜 생성자 주입이 가장 권장되는지 정확히 알고있지 못하다. 지금부터 이부분에 대해서 파악해보자.
1. 생성자 주입
@Component
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processOrder() {
paymentService.pay();
}
}
2. 필드 주입
@Component
public class OrderService {
@Autowired
private PaymentService paymentService;
public void processOrderPay() {
paymentService.pay();
paymentService.pay();
}
}
3. 수정자 주입 (Method - Setter 주입)
@Component
public class OrderService {
private PaymentService paymentService;
@Autowired
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processOrder() {
paymentService.pay();
}
}