2021. 7. 9. 13:58ㆍJAVA/Spring
본 글은 초보 웹개발자를 위한 스프링5 프로그래밍 입문 도서의 내용을 복습하기 위해서 작성된 글입니다.
3. @Qualifier 애노테이션을 이용한 의존 객체 선택
@Qualifier 애노테이션이란 무엇인가?
- 스프링 설정 클래스에서 설정한 Bean 메서드들 중 같은 클래스 타입의 자동 주입 가능한 빈이 2개 이상이면 자동 주입시 보통 예외를 발생시킨다.
- 위와 같은 문제를 해결하기 위해서 자동 주입할 빈을 한정하는 기능이 @Qualifier 애노테이션이다.
@Qualifier 애노테이션 사용 위치
- Bean 설정 메서드
- setter 메서드 or 필드 멤버 : @Autowired 애노테이션과 동일하게 setter 메서드 또는 필드 멤버에 적용해도 효과는 동일하다.
@Qualifier 애노테이션 첫번째 사용 위치 : Bean 설정 메서드
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import chap04_03.spring.ChangePasswordService;
import chap04_03.spring.MemberDao;
import chap04_03.spring.MemberPrinter;
import chap04_03.spring.MemberRegisterService;
import chap04_03.spring.VersionPrinter;
import chap04_03.spring.after.MemberListPrinter;
import chap04_03.spring.after.MemberInfoPrinter;
@Configuration
public class AppCtx{
... 생략
// 특이점
// @Qualifer 애노테이션을 사용하면 자동주입 가능한 빈이 2개 이상인 경우 자동 주입 대상 빈을 한정할 수 있다.
// memberPrinter1() 메서드의 한정값은 "printer"로 지정된다.
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter1()
{
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2()
{
return new MemberPrinter();
}
}
이 코드에서 memberPrinter1() 메서드에 "printer" 값을 갖는 @Qualifier 애노테이션을 붙였다. 이 설정은 해당 빈의 한정 값으로 "printer"를 지정한다. 이렇게 지정한 한정 값은 @Autowired 애노테이션에서 자동 주입할 빈을 한정할 때 사용한다.
@Qualifier 애노테이션 두번째 사용 위치 : setter 메서드
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import chap04_03.spring.Member;
import chap04_03.spring.MemberDao;
import chap04_03.spring.MemberPrinter;
public class MemberListPrinter {
private MemberDao memberDao;
private MemberPrinter printer;
... 생략
// 특이점
// @Qualifier 애노테이션의 값을 printer로 설정하여 자동 의존 주입
// 과정에서 한정자 값이 "printer"인 빈 설정 메소드를 대상으로
// 의존 객체를 생성한다.
@Autowired
@Qualifier("printer")
public void setPrinter(MemberPrinter printer) {
this.printer = printer;
}
... 생략
}
setPrinter() 메서드에 @Autowired 애노테이션을 붙였으므로 MemberPrinter 타입의 빈을 자동 주입한다. 이때 @Qualifier 애노테이션 값이 "printer"이므로 한정 값이 "printer"인 빈을 의존 주입 후보로 사용한다.
앞서 스프링 설정 클래스에서 @Qualifier 애노테이션의 값으로 "printer"를 준 MemberPrinter 타입의 빈(memberPrinter1)을 자동 주입 대상으로 사용한다.
@Qualifier 애노테이션을 이용한 자동 주입 대상 빈 지정
3.1 빈 이름과 기본 한정자
빈 설정에 @Qualifier 애노테이션이 없으면 빈의 이름을 한정자로 지정한다.
@Configuration
public class AppCtx2{
@Bean
public MemberPrinter printer()
{
return new MemberPrinter();
}
@Bean
@Qualifier("mprinter")
public MemberPrinter printer2()
{
return new MemberPrinter();
}
@Bean
public MemberInfoPrinter infoPrinter()
{
MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
return infoPrinter;
}
}
printer() 메서드로 정의한 빈의 한정자는 빈 이름인 "printer"가 된다.
printer2 빈은 @Qualifier 애노테이션 값은 "mprinter"가 한정자가 된다.
@Autowired 애노테이션도 @Qualifier 애노테이션이 없으면 필드나 파라미터 이름을 한정자로 사용한다.
빈 이름과 한정자 관계
빈 이름 | @Qualifier | 한정자 |
printer | printer | |
printer2 | mprinter | mprinter |
infoPrinter | infoPrinter |
References
초보 웹개발자를 위한 스프링5 프로그래밍 입문, 최범균 저
https://github.com/yonghwankim-dev/spring5/tree/master/sp5-chap03/src/main/java
'JAVA > Spring' 카테고리의 다른 글
4. 의존 자동 주입 #4 상위/하위 타입 관계와 자동 주입 (0) | 2021.07.12 |
---|---|
4. 의존 자동 주입 #3-2 @Qualifier 애노테이션 적용을 통한 특정 빈 설정 메소드 수행 확인 (0) | 2021.07.12 |
4. 의존 자동 주입 #2 @Autowired 애노테이션을 이용한 의존 자동 주입 (0) | 2021.07.09 |
4. 의존 자동 주입 #1 예제 프로젝트 준비 (0) | 2021.07.09 |
3. 스프링 DI(Dependency Injection) #6 getBean() 메서드 사용 (0) | 2021.07.09 |