본문 바로가기

Spring/Dependency Injection

[Spring Framework] @Qualifier 를 사용하는 이유

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

 

DI를 하는 방법에는 이전 강의에서 다룬 것처럼

어노테이션이라는 방식을 사용하여 코드 내에 설정을 심는 방식과, @Autowired라는 방법을 사용한다고 했습니다.

 

 

이번 시간에는 @Autowired만으로는 동작하지 않는 상황들을 보고, @Qualifier는 무엇이고 왜 사용하는지에 대해서 알아보고자 합니다.

 

 

 

저번 시간에 작성했던 방식은, xml 안에 Animal이라는 객체를 이용해 생성된 bean이 하나만 있었기 때문에

@Autowired가 setter의 인자가 Animal인 것을 보고

xml의 유일한 Animal class형인 객체와 자동으로 연결해 준다고 했었습니다.

 

 

그렇다면 만약에 xml 안에 Animal class가 여러개 있다면 어떻게 될까요?

당연히 Autowired는 두 개의 Animal 객체가 있으니 어떤 것을 연결해야 할지 모르기 때문에 에러가 나게 됩니다.

 

 

따라서 우리는 Qualifier라는 옵션을 이용해서 어떤 것을 binding할지 알 수 있도록 해주려고 합니다.

Qualifier은 안에 xml 파일 내에 있는 bean 객체의 id를 적어줌으로써

내가 원하는 애를 정확하게 콕 찝어 바인딩 해줄 수 있도록 만들어줍니다.

 

아래와 같이 AnimalPrintName의 setAnimal 부분에 @Qualifier을 추가하여 코드를 수정해보겠습니다.

 

 

- AnimalPrintName.java

public class AnimalPrintName implements AnimalPrint {

	Animal animal;
	
	public AnimalPrintName() {
		// TODO Auto-generated constructor stub
	}
	
	public AnimalPrintName(Animal animal) {
		this.animal = animal;
	}

	@Override
	public void print() {
		System.out.printf("Name is %s", animal.getName());

	}

	@Autowired
	@Qualifier("animal1")
	@Override
	public void setAnimal(Animal animal) {
		this.animal = animal;
		
	}

}

 

 

- setting.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
	
	<context:annotation-config/>
	<bean id = "animal1" class = "spring.entity.Animal" p:name="BINGO" p:age="10"/>
	<bean id = "animal2" class = "spring.entity.Animal" p:name="COCO" p:age="5"/>
	<bean id = "console" class = "spring.console.AnimalPrintName">
	
	</bean>

</beans>

 

 

코드를 수정하면 아래와 같이 잘 실행되는 모습을 볼 수 있습니다.

 

 

 

728x90
반응형