티스토리 뷰
List, Map으로 빈 주입받기
List랑 Map으로 여러 개의 빈을 주입받을 수 있다. 아래 코드를 통해 어떻게 주입을 받는지 테스트하였다.
예제
우선 인터페이스 하나를 정의하고 하나의 인터페이스를 통해 두 클래스(@Component를 통해 빈 등록)를 구현하였다. 만약 아래와 같이 인터페이스를 통해 빈을 주입한다면 아래와 같이 경고 또는 오류가 발생할 것이다.


위 캡처의 오류는 인터페이스를 구현한 객체가 2개인데 어느 빈을 주입할지 몰라서 오류가 발생한 것이다. 만약 특정한 객체를 주입하고 싶다면 구현한 객체에 @Primary, @Qualifier 어노테이션으로 주입해 주면 된다.
<Spring> @Qualifier이란?
@Qualifier이란? @Qualifier은 @Primary 어노테이션과 다르게 빈 객체에 이름을 지정하여 객체를 주입하는 방식이다. @Primary이란?" data-og-description="@Primary이란? @Primary 어노테이션은 예를 들어 클래스 A에
oniic.tistory.com
<Spring> @Primary이란?
@Primary이란? @Primary 어노테이션은 예를 들어 클래스 A에 인터페이스 B를 선언했는데 인터페이스를 구현한 객체 2개가 존재할 경우 스프링은 어느 객체를 주입해야 하는지 알 수 없게 되는데 주입
oniic.tistory.com
만약 여러 개의 객체를 주입받고 싶으면 어떻게 하면 될까?
위와 같이 구현 객체가 여러 개인 상태에서 주입받게 되면 오류가 발생할 것이다. 이를 해결하고자 List와 Map을 통해 여러개의 구현 객체를 주입 받을 수 있다.
@SpringBootTest
public class TestMain {
// 오류 발생
/*@Autowired
private InterfaceTest test;
@Test
void test1() {
System.out.println(test);
}*/
@Autowired
private List<InterfaceTest> list;
@Autowired
private Map<String, InterfaceTest> map;
@Test
void test() {
list.stream().forEach(l -> System.out.println("값: " + l));
for(Map.Entry<String, InterfaceTest> entry : map.entrySet()) {
System.out.println("키:" + entry.getKey() + " 값:" + entry.getValue());
}
}
}
값: hello.itemservice.bean.Test1@452c9bff
값: hello.itemservice.bean.Test2@b8c68f1
키:test1 값:hello.itemservice.bean.Test1@452c9bff
키:test2 값:hello.itemservice.bean.Test2@b8c68f1
위의 소스 코드를 보면 List와 Map에 InterfaceTest를 구현한 2개의 객체가 동시에 주입 받게 된다. List는 구현 객체의 참조 값을 주입 받게 되고, Map은 key와 value로 구성되기 때문에 key는 구현 객체 이름의 앞글자를 소문자로 바꾼 값을 String key 값에 저장되고, value는 구현 객체의 참조 값이 주입된다.
정리
만약 인터페이스를 통해 구현된 객체가 여러 개인 경우 특정한 객체를 주입하고 싶으면 @Primary, @Qualifier 어노테이션으로 주입해 주면 되고, 여러 객체를 주입하고 싶으면 List와 Map을 통해 주입받으면 된다.
본 포스팅은 “스프링 핵심 원리 - 기본편/인프런”를 학습한 내용을 정리한 것
'Java > Spring' 카테고리의 다른 글
| <Spring> 트랜잭션 프록시 내부 호출시 문제점 (0) | 2024.07.29 |
|---|---|
| <Spring> @SessionAttribute 이란? (0) | 2024.07.25 |
| <Spring> @RequiredArgsConstructor과 의존성 주입 (0) | 2023.10.09 |
| <Spring> @Qualifier이란? (1) | 2023.10.09 |
| <Spring> @Primary이란? (0) | 2023.10.08 |
