https://docs.spring.io/spring-framework/reference/core/beans/annotation-config/autowired.html
https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-autowire.html
자동 주입은 @Autowired 어노테이션을 통해 수행됩니다. 스프링은 이 어노테이션이 붙은 필드나 생성자, Setter 메서드에 자동으로 의존성을 주입합니다.
자동 주입(Autowired)은 스프링 프레임워크에서 객체 간의 의존성을 자동으로 주입해 주는 기능으로, 개발자가 의존성을 수동으로 설정하지 않아도 스프링 컨테이너가 필요한 객체를 자동으로 찾아 주입해 줍니다. 스프링의 DI(Dependency Injection) 기능의 일환으로, 코드를 더 간결하게 작성할 수 있고, 객체 간의 결합도를 낮출 수 있습니다.
자동 주입 방식에는 필드 주입, Setter 주입, 생성자 주입이 있습니다.
@Autowired 어노테이션을 사용하여 의존성을 주입합니다.@Component
public class OrderService {
@Autowired
private PaymentService paymentService;
public void processOrder() {
paymentService.pay();
}
}
@Autowired 어노테이션을 사용하여 의존성을 주입합니다.@Component
public class OrderService {
private PaymentService paymentService;
@Autowired
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processOrder() {
paymentService.pay();
}
}
@Autowired 어노테이션을 사용하여 의존성을 주입합니다.@Autowired 어노테이션을 생략할 수 있습니다.@Component
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processOrder() {
paymentService.pay();
}
}
@Autowired 어노테이션을 사용하면, 스프링 컨테이너는 아래의 순서로 주입할 빈을 검색합니다.
@Qualifier 어노테이션을 함께 사용하여 주입할 빈을 명시할 수 있습니다.아래 예제는 같은 타입의 여러 빈 중에서 @Qualifier를 사용하여 특정 빈을 주입하는 방법입니다.
@Component
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(@Qualifier("creditCardPaymentService") PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processOrder() {
paymentService.pay();
}
}
@Component("creditCardPaymentService")
public class CreditCardPaymentService implements PaymentService {
// ...
}
@Component("paypalPaymentService")
public class PaypalPaymentService implements PaymentService {
// ...
}
@Qualifier*를 사용하여 해결할 수 있습니다.NoSuchBeanDefinitionException이 발생합니다.@Autowired(required = false)로 설정하면, 빈이 존재하지 않을 때 주입을 생략할 수 있습니다.@Autowired(required = false)
private PaymentService paymentService;
Optional을 활용하여 빈이 존재하지 않을 때 null 대신 빈값을 설정할 수 있습니다.@Autowired
private Optional<PaymentService> paymentService;
스프링의 자동 주입은 @Autowired를 통해 스프링 컨테이너가 빈을 자동으로 주입하게 하여 코드의 가독성과 유지보수성을 높여줍니다. 자동 주입의 주요 방식은 필드 주입, Setter 주입, 생성자 주입이 있으며, 각 방식은 필요한 상황에 따라 다르게 선택하여 사용할 수 있습니다.