4. 의존 자동 주입 #3-1 @Qualifier 애노테이션을 이용한 의존 객체 선택

2021. 7. 9. 13:58JAVA/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