ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] @Autowired 과정
    legacy/Spring 2024. 6. 25. 14:13

    @Autowired 주입 과정

    1. Spring Bean 생성
      1. 애플리케이션이 시작되면서 스프링 컨테이너가 빈을 생성한다. 생성된 빈은 스프링 컨테이너에 의해 관리된다. → 이를 제어의 역전(IoC)라고 한다.
    2. 의존성 탐색
      1. 스프링 컨테이너는 @Autowired가 붙은 필드, 세터, 생성자를 탐색한다.
    3. 의존성 주입
      1. 2번을 통해 의존성 주입이 필요한 객체를 찾고, 찾은 객체의 클래스와 일치하는 인스턴스를 스프링 컨테이너에서 찾아서 주입한다. 이때, 찾은 객체의 클래스와 일치하는 Bean이 여러 개가 존재한다면 별도의 처리가 필요하다. → 아래에서 확인한다.
    4. 주입 완료
      1. 의존성 주입이 완료되면 초기화 콜백(@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{}
Designed by Tistory.