@Autowired로 의존성 주입을 했지만, 주입할 수 있는 대상이 여러개가 있을 때?
가정
Service와 Repository가 있다고 가정하자.
Repository에 빈 등록을 하지 않고,
Service에서 Autowired를 통해 bookRepository에 의존성 주입을 시도했다고 하자.
위와 같은 상황은 에러가 발생한다.
@Autowired를 사용하지 않았다면 오류가 없었겠지만, 의존성 주입을 하려는데 빈에 등록이 되어있지 않으니 오류가 발생하는 것이다.
만약 위와 같은 상황을 조금 변경하고 싶다면, @Autowired(required = false)를 한다면 의존성을 옵셔널로 설정해 꼭 필요하지 않다는 것을 설정한다.
구현체가 두개가 있고, BookRepository bookRepository가 있을 때, @Autowired를 그냥 사용하면 두개의 구현체 중에 어떤 것을 의존성을 주입해야 할지 몰라 에러를 뱉는다.
해결책
이때, @Primary(여러 개라면 내가 default로 사용할 구현체 지정)를 사용하거나, 모든 빈을 다 받거나, @Qyalifier(누굴 쓸건지 명시)를 활용할 수 있다.
@Autowired
List<BookRepository> bookRepositories;
-> 하게 되면 모든 구현체의 의존성을 리스트에 전부 담을 수 있다.
추천하는 방법은 아니지만, 타입으로 본 다음 이름도 본다.
무슨 말이냐 하면, BookRepository myBookRepository로 한다면 주입받을 빈의 id와 동일하게 설정한다면 알아서 체크하고 사용해준다.
그럼 이런게 어떻게 가능한 것이냐?
beanPostProcessor라는 라이프 사이클 인터페이스의 구현체에 의해서 동작하는 것이다.
beanPostProcessor은 Bean의 인스턴스를 만든 다음에, Bean의 초기화(initializer..?) 라이프 사이클 이후에 부가적인 작업을 할 수 있는 것이다.
@PostConstruct를 통해서 Bean이 생성된 다음에 작업할 함수를 정의할 수도 있다.
<궁금증>
bookRepositiory인터페이스를 구현하는 클래스 2개가 있었다.
Service클래스에서 @Autowired BookRepository bookRepository를 선언했을 때, 빈 주입해야할 것이 2개가 있는데 의존성 주입해야할 대상이 누구인지 모르겠다는 에러메세지를 나타낸다.
왜 이러지?
아~ Interface interface = new 구현객체();
이걸 말한거구나~?직음?!
'개발 > Spring' 카테고리의 다른 글
터미널로 Spring실행하는 방법 (0) | 2020.12.26 |
---|---|
[Spring] 인프런 8차 Event (0) | 2020.12.25 |
[Spring] 인프런 2차 강의 (0) | 2020.12.24 |
IoC 컨테이너란? (0) | 2020.12.23 |
의존성 2 in Spring (0) | 2020.11.03 |