@Qualifier

Yuno·2024년 8월 18일
0

Spring Framework 에서 사용되는 어노테이션으로, 의존성 주입 시 여러 빈(Bean) 중에서 특정 빈을 선택하여 주입하기 위해 사용됨. 주로 @Autowired 와 함께 사용되며, 동일한 타입의 여러 빈이 존재할 때 어떤 빈을 주입할지 명확히 지정하는 데 활용됨


👉 사용 배경

Spring 에서 의존성 주입을 할 때, 기본적으로 타입에 따라 빈을 주입함. 그러나 동일한 타입의 빈이 여러 개 존재할 경우 어떤 빈을 주입할지 모호해지기 때문에 충돌이 발생할 수 있음. 이 때 @Qualifier 를 사용하여 주입할 빈을 명확히 지정할 수 있음.


👉 사용 방법

  1. 동일한 타입의 빈이 여러 개 있는 경우
    예를 들어, 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") 로 지정할 수 있음.


  1. 필드 주입 시 사용
    @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 를 사용해 빈을 구분할 수 있음
profile
Hello World

0개의 댓글