@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 |