Spring Framework 에서 사용되는 어노테이션으로, 의존성 주입 시 여러 빈(Bean) 중에서 특정 빈을 선택하여 주입하기 위해 사용됨. 주로
@Autowired
와 함께 사용되며, 동일한 타입의 여러 빈이 존재할 때 어떤 빈을 주입할지 명확히 지정하는 데 활용됨
Spring 에서 의존성 주입을 할 때, 기본적으로 타입에 따라 빈을 주입함. 그러나 동일한 타입의 빈이 여러 개 존재할 경우 어떤 빈을 주입할지 모호해지기 때문에 충돌이 발생할 수 있음. 이 때 @Qualifier
를 사용하여 주입할 빈을 명확히 지정할 수 있음.
Service
인터페이스를 구현한 두 개의 클래스가 있을 떄, 특정 구현체를 주입하고 싶다면 @Qualifier
를 사용함import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
public interface Service {
void perform();
}
@Service
@Qualifier("serviceA")
public class ServiceA implements Service {
@Override
public void perform() {
System.out.println("Service A is performing");
}
}
@Service
@Qualifier("serviceB")
public class ServiceB implements Service {
@Override
public void perform() {
System.out.println("Service B is performing");
}
}
이제 특정 구현체를 주입할 때 @Qualifier
를 사용
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class Client {
private final Service service;
@Autowired
public Client(@Qualifier("serviceA") Service service) {
this.service = service;
}
public void doSomething() {
service.perform();
}
}
Client
클래스는 ServiceA
를 주입받아 사용함. 만약 "serviceB"
를 주입받고 싶다면 @Qualifier("serviceB")
로 지정할 수 있음.
@Qualifier
는 생성자뿐만 아니라 필드 주입이나 세터 메서드 주입에서도 사용할 수 있음@Autowired
@Qualifier("serviceB")
private Service service;
@Autowired
public void serService(@Qualifier("serviceB") Service service) {
this.service = service;
}
Spring 에서는 빈의 이름을 명시적으로 지정할 수 있음. 이 경우 @Qualifier
와 함께 빈 이름을 지정해 주입할 수 있음.
@Service("customServiceA")
public class ServiceA implements Service {
// Implementation
}
@Autowired
@Qualifier("customServiceA")
private Service service;
@Qualifier
는 빈의 이름이나 다른 식별자를 사용해 주입할 빈을 선택하기 때문에, 오타나 빈 이름의 불일치로 인해 주입 오류가 발생할 수 있음. 따라서 빈 이름을 정확히 지정해야 함@Qualifier
를 사용하지 않으면, Spring은 기본적으로 타입에 따라 자동으로 주입할 빈을 선택함. 그러나 동일한 타입의 빈이 여러 개 있는 경우에는 명시적으로 지정해야 함DevService
, 프로덕션 환경에서는 ProdService
를 주입하고자 할 때, @Qualifier
를 사용해 빈을 구분할 수 있음