-
[Spring] @Autowired 과정legacy/Spring 2024. 6. 25. 14:13
@Autowired 주입 과정
- Spring Bean 생성
- 애플리케이션이 시작되면서 스프링 컨테이너가 빈을 생성한다. 생성된 빈은 스프링 컨테이너에 의해 관리된다. → 이를 제어의 역전(IoC)라고 한다.
- 의존성 탐색
- 스프링 컨테이너는 @Autowired가 붙은 필드, 세터, 생성자를 탐색한다.
- 의존성 주입
- 2번을 통해 의존성 주입이 필요한 객체를 찾고, 찾은 객체의 클래스와 일치하는 인스턴스를 스프링 컨테이너에서 찾아서 주입한다. 이때, 찾은 객체의 클래스와 일치하는 Bean이 여러 개가 존재한다면 별도의 처리가 필요하다. → 아래에서 확인한다.
- 주입 완료
- 의존성 주입이 완료되면 초기화 콜백(@PostConstruct)이 호출된다.
@Autowired를 통한 3가지 주입 방식
- 생성자 주입
@Service public class UserService { private UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }
- 세터 주입
@Service public class UserService { private UserRepository userRepository; public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }
- 필드 주입
@Service public class UserService { @Autowired private UserRepository userRepository; }
@Autowired 동작 과정
1. 타입 매칭
기본적으로 @Autowired는 일치하는 클래스 타입을 스프링 컨테이너에서 찾아서 주입한다.
2. @Qualifier
스프링 컨테이너에 일치하는 클래스 타입이 여러 개라면 1번 방법으로는 해결할 수 없다.
이때는 @Qualifier를 사용하여 여러 개의 Bean 중에서 특정 Bean을 주입할 수 있다.
- UserRepository
@Repository public interface UserRepository {}
- 스프링 컨테이너에 등록된 2개의 Bean
@Repository public class ManUserRepository implements UserRepository{} @Repository public class FemaleUserRepository implements UserRepository{}
위 상태에서는 애플리케이션을 시작하기도 전에 Bean을 초기화하는 과정에서 오류가 발생한다.
오류메시지 → Parameter 0 of constructor in com.example.cs_study.service.UserService required a single bean, but 2 were found
메시지에서 알 수 있듯이 동일한 타입의 빈이 2개가 조회되어서 UserRepository에 어떤 빈을 주입해야 하는지 알 수 없다고 오류가 발생했다.
생성자 매개변수 부분을 보면 @Qualifier를 사용하여 FemaleUserRepository 타입의 Bean을 주입하겠다고 명시했다.
@Service public class UserService { private UserRepository userRepository; @Autowired public UserService(@Qualifier("femaleUserRepository") UserRepository userRepository) { this.userRepository = userRepository; } }
아래 메시지를 보면 애플리케이션이 정상적으로 실행되었음을 알 수 있다.
3. @Primary
주입하고자 하는 특정 Bean에 @Primary를 사용하면 여러 개의 Bean이 존재할 때 해당 Bean을 가장 먼저 주입하게 된다.
@Repository @Primary public class FemaleUserRepository implements UserRepository{}
- Spring Bean 생성