본문 바로가기

Spring

Autowire 알아보기 - 2

이전 글에서는 빈의 의존성이 1개인 경우만 공부해봤습니다. 해당하는 타입의 빈이 복수개일 경우는 어떻게 처리되는지 살펴보겠습니다.

BookRepository라는 인터페이스를 구현한 클래스 2개가 존재한다고 가정하겠습니다. 아래 스크린샷을 참고해주세요.

BookRepository
MyBookRepo
YourBookRepo

이 상황에서 BookService가 의존성 주입을 하게 되면 에러를 뱉게 됩니다. MyBookRepo랑 YourBookRepo중 어느 것을 선택해서 주입해야 될지 스프링이 판단하지 못하는 상황입니다.

3가지의 액션을 통해 이러한 상황을 해결할 수 있는데 하나씩 살펴보도록 하겠습니다.

@Primary
원하는 빈에 @Primary를 선언하여 동일한 빈일 경우 @Priamry라는 어노테이션이 붙은 빈을 주입해주게 만들 수 있습니다.

@Qualifier("빈의 이름")
빈의 이름은 small case로 시작하는 클래스의 이름과 동일하게 됩니다.

타입에 해당하는 모든 빈을 받기
아래와 같이 리스트를 활용해 모든 빈을 다 받을 수 있습니다. 1개면 1개 2개면 2개 n개면 n개를 받을 수 있습니다.

이름 직접 명시
그리고 이외에 추천하지 않는 방식이 한 가지 있는데 빈의 이름을 직접 명시하여 주입하는 방법입니다. 해당하는 타입의 빈이 여러 개일 경우 아래와 같이 이름을 직접 명시하여 의존성 주입이 가능하게 됩니다.

Autowire의 동작 원리는?
어떻게 동작하는 것이 궁금하실 수 있는데 BeanPostProcessor 라이프사이클 인터페이스의 구현체에 의해서 동작을 하게 됩니다. 검색 중 자세하게 설명해주신 좋은 글이 있어 링크하니 궁금하신 분들은 참고하시면 좋겠습니다.

heowc.dev/2020/07/04/how-does-autowired-work/ 

 

허원철의 개발 블로그

Spring - @Autowired는 어떻게 동작하는 걸까?

heowc.dev