본문 바로가기

코딩/JAVA 공부

[Spring] 다중 등록 빈 의존 관계 문제

@Autowired 로 의존 관계를 넣어줄 때 빈을 타입으로 조회하게 된다.

완전 똑같진 않지만, .getBean(MemberRepository.class) 와 비슷한 방식으로 빈을 찾아서 의존 관계를 넣어준다.

이때, MemberRepository 의 구현체가 2개 이상이라면 문제가 발생한다.

조회 시 자식이 모두 조회되어 2개 이상의 빈이 있는데, 이 중 어떤 걸 의존 관계로 넣어줘야 할지 모르기 때문.

 

수동으로 의존관계를 넣어줄 수 있지만, 자동으로도 해결 가능한 몇 가지 방법이 있다.

1. @Autowired 필드 명 매칭

2. @Qualifer 끼리 매칭

3. @Primary로 우선순위 선정

 

@Autowired 는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.

@Autowired 워크플로우

   1. 타입 매칭을 시도하고, 만약 빈이 하나면 매칭 진행, 두 개 이상이면

   2. 필드 명 혹은 파라미터 명으로 빈 이름 매칭 진행.

 

@Qualifier 사용

 주입시 추가적인 방법을 제공.

@Qualifier("특정이름") 을 클래스에 붙이고, 의존관계 주입하는 파라미터 혹은 필드 앞에 동일한 어노테이션을 붙이면

@Qualifier 끼리 매칭되어 자동으로 의존관계를 넣어 준다.

이때, @Qualifier 끼리 매칭이 안되면, 빈 이름 중 "특정이름"과 동일한 게 있는지 찾아 넣는다 --> 이거는 매우 헷갈리니 쓰지 말자!

그래도 없으면 NoSuchBeanDefinitionException 발생

@Component
@Qualifier("mainMemberRepository")
public class MemortMemberRepository {
	...
}


@Component
public class MemberServiceImpl {

	private final MemberRepository memberRepository;
	
    @Autowired
    MemberServiceImpl(@Qualifier("mainMemberRepository") MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}

 

@Primary 사용

우선순위를 정하는 방법이다.

@Autowired 시 여러 빈이 매칭 되면, @Primary 가 붙어있는 빈을 먼저 선택한다.