@Autowired로 의존관계 주입하기
앞 포스팅(@ComponentScan으로 스프링 빈 스캔하기)에서 @Component와 @ComponentScan을 이용하여 스프링 빈을 스프링 컨테이너에 등록하였습니다. 이제는 @Autowired를 이용하여 의존관계를 자동으로 주입할 수 있도록 해보겠습니다.
@Autowired로는 여러가지 방법으로 의존관계를 주입할 수 있는데, 우선은 가장 기본적이고 많이 사용하는 방법인 생성자를 통해 주입해보도록 하겠습니다.
@Autowired 생성자 주입
1. 스프링 빈 생성하기
먼저 @Component를 이용해 원하는 스프링 빈을 생성하겠습니다. (물론 @ComponentScan도 적절한 위치에 정의가 되어 있어야겠습니다. )
@Component
public class Book implements Product{}
2. @Autowired 작성하기
그 후, 의존관계 주입이 필요한 곳(생성자)에 @Autowired를 작성합니다. 이 때, @Autowired를 작성하는 클래스도 @Component (스프링 빈)이어야 합니다. 그 이유는, 스프링 컨테이너가 컨테이너에 등록된 스프링 빈들을 찾아보면서 의존관계를 주입하도록 동작하기 때문입니다. (즉, 아래 OnlinOrder 빈과 Product 빈을 컨테이너에서 찾아서 서로 의존관계를 만들어 줍니다. 따라서 의존관계를 형성하려는 객체들이 모두 빈으로 등록되어 있어야 합니다.)
@Component
public class OnlineOrder implements Order {
Product product;
@Autowired // 얘를 쓰려면 OnlineOrder도 @Component (스프링 빈) 이어야 한다.
public OnlineOrder(Product product) { // 생성자 주입
this.product = product;
}
public Product getProduct() {
return product;
}
}
이렇게 @Autowired로 생성자 주입을 진행하였습니다. 위 과정을 그림으로 정리하면 아래와 같습니다.
1. @ComponentScan
- 빈 이름 기본: 스프링 빈의 기본 이름은 클래스명을 사용하되, 맨 앞글자만 소문자를 사용합니다.
- 빈 이름 직접 지정: @Component("customBeanName")과 같이 이름을 지정할 수 있습니다.
2. @Autowired 의존관계 자동 주입
- 생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입합니다.
- 기본 조회 전략은 타입이 같은 빈을 찾아서 주입합니다.
- getBean(Product.class)와 동일하다고 이해하면 됩니다. (Book은 Product을 상속하므로 Product 타입 입니다.)
그럼 이 때, 의문이 들 수도 있는데요, 만약 Product 인터페이스를 상속하는 클래스가 여러 개이고, 그 클래스들이 모두 빈으로 등록되어 있다면 어떤 클래스를 주입해 줄까요?? 빈으로 등록된 모든 자식 클래스들이 Product 타입을 가지고 있으니 그 중 어떤 클래스가 선택될까요?
이에 대한 설명과 @Autowired를 사용하는 자세한 방법은 다른 포스팅에 정리하도록 하겠습니다! 우선 이번 포스팅은 간단하게 @Autowired를 이용해 어떻게 빈들의 의존관계를 주입하였는지에 대해서만 작성하였습니다.
다음 포스팅에서는 @Autowired를 이용하여 의존관계를 주입하는 다양한 방법과 같은 타입의 빈들이 등록되었을 때 어떻게 동작하는지에 대해서 알아보겠습니다!!
[전체 소스코드]
GitHub - eunhwa99/SpringBlog
Contribute to eunhwa99/SpringBlog development by creating an account on GitHub.
github.com
[참고자료]
김영한, "스프링 핵심 원리 - 기본편", 인프런