본문 바로가기

Spring/Spring 공부

@Qualifier

@Qualifier는 Spring에서 동일한 타입의 여러 빈(Bean)이 존재할 때, 특정 빈을 명확하게 지정하는 데 사용하는 어노테이션입니다.

 

보통 **자동 주입(@Autowired)**을 사용할 때 같은 타입의 빈이 여러 개 있을 경우 어떤 빈을 선택해야 할지 지정하는 역할을 합니다.

 

1. @Qualifier가 필요한 이유

Spring에서 같은 인터페이스를 구현한 여러 개의 빈이 있을 경우, 어떤 빈을 주입해야 할지 알 수 없기 때문에 NoUniqueBeanDefinitionException 예외가 발생합니다.

 

동일한 타입의 여러 빈이 있을 때 문제 발생

@Component
public class ServiceA implements MyService {
    @Override
    public void execute() {
        System.out.println("ServiceA 실행");
    }
}

@Component
public class ServiceB implements MyService {
    @Override
    public void execute() {
        System.out.println("ServiceB 실행");
    }
}

 

위 코드에서 ServiceA, ServiceB 두 개의 빈이 MyService 인터페이스를 구현하고 있습니다.

 

@Service
public class MyComponent {
    private final MyService myService;

    @Autowired
    public MyComponent(MyService myService) {  // 어떤 빈을 주입할까?
        this.myService = myService;
    }
}

Spring은 MyService 타입의 빈이 두 개(ServiceA, ServiceB) 있으므로 어떤 것을 주입해야 할지 몰라 NoUniqueBeanDefinitionException 예외가 발생합니다.

 

2. @Qualifier를 사용한 특정 빈 주입

이 문제를 해결하기 위해 @Qualifier를 사용하여 특정 빈을 지정할 수 있습니다.

@Service
public class MyComponent {
    private final MyService myService;

    @Autowired
    public MyComponent(@Qualifier("serviceA") MyService myService) {
        this.myService = myService;
    }
}

@Qualifier("serviceA")를 사용하면 serviceA라는 이름을 가진 빈이 주입됩니다.

빈 이름은 기본적으로 클래스의 첫 글자를 소문자로 변환한 값이므로, "serviceA"가 ServiceA를 가리킵니다.

 

@Component("serviceA")
public class ServiceA implements MyService { ... }

빈의 이름을 명확하게 지정할 수도 있습니다.

 

3. @Primary를 사용한 기본 빈 설정

@Qualifier를 사용하지 않고도 특정 빈을 기본값으로 지정할 수 있습니다.

@Component
@Primary
public class ServiceA implements MyService { ... }

@Component
public class ServiceB implements MyService { ... }

이제 @Autowired MyService myService를 사용하면 자동으로 ServiceA가 주입됨.
(왜냐하면 @Primary가 붙어 있기 때문)

하지만 @Qualifier를 사용하면 여전히 특정 빈을 선택할 수 있습니다.

 

@Autowired
public MyComponent(@Qualifier("serviceB") MyService myService) { ... }

ServiceB가 명시적으로 주입됩니다.

 

4. 필드에 @Qualifier 사용

@Autowired와 함께 필드에 직접 @Qualifier를 지정할 수도 있습니다.

@Service
public class MyComponent {
    @Autowired
    @Qualifier("serviceA")
    private MyService myService;
}

하지만, 필드 주입보다는 생성자 주입을 권장합니다.
(테스트 용이성과 유지보수성을 고려하면 생성자 주입이 더 좋음)

 

 

결론

  • @Qualifier는 동일한 타입의 여러 빈이 있을 때 특정 빈을 선택할 때 사용.
  • 필드 주입보다는 생성자 주입을 권장.
  • @Primary를 사용하면 특정 빈을 기본값으로 설정할 수 있음.
  • @Bean 설정과도 함께 사용할 수 있음.
  • @RequiredArgsConstructor를 사용할 때는 직접 생성자를 작성해야 @Qualifier 사용 가능.

 

@Qualifier는 특정 빈을 명확하게 선택할 때 유용하지만, 너무 자주 사용하면 코드가 복잡해질 수 있으므로 @Primary나 @Configuration을 활용하는 것도 좋은 방법

'Spring > Spring 공부' 카테고리의 다른 글

Hibernate 간단하게  (4) 2024.11.04
POJO 클래스  (0) 2024.10.30
Lombok 정의와 어노테이션 기능 정리  (2) 2024.10.30
Swagger , http://localhost:8080/swagger-ui/ 404오류  (2) 2024.10.23
Jacoco  (1) 2024.10.23