@Qualifier 사용해 보자!
들어가며
개발을 하다 보면 종종 여러 구현체가 동일한 인터페이스를 구현하게 됩니다. 이럴 때 어떤 구현체를 사용할지에 대해서 지정해 주는 에노테이션입니다. 이번 포스팅에서는 사용방법에 대해서 알아보도록 하겠습니다.
@Qualifier이란
@Qualifier 어노테이션은 DI할때 어떤 빈을 등록할 것인지를 명시해 줄 때 사용됩니다. 하지만 기본적으로는 @Autowired을 통해서 DI를 하게 되지만, 동인 한 인터페이스를 가진 구현체가 있을대 @Autowired를 사용하게 되면 빈이 유일하지 않다는 NoUniqueBeanDefinitionException 예외를 발생하게 됩니다. 이럴 때에 구현체를 지정해 주기 때문에 예외를 피할 수 있습니다.
즉 👉🏻 동일한 Interface를 가진 구현체의 대해서 명시할 때 사용됩니다.
@ Qualifier 예시
다음과 같이 이메일 전송에 관한 서비스의 두 개의 이메일 로직을 구현했다고 가정해 봅시다.
public class findEmail implements EmailService {
public void send() {
// 찾기 이메일 로직
}
}
public class joinEmail implements EmailService {
public void send() {
// 가입 이메일 로직
}
}
public interface EmailService {
void send();
}
만약 이 상태에서 DI(의존성 주입)을 하게 되면 위에 설명했던 것처럼 예외가 발생합니다. 스프링 컨테이너에서 두 개의 빈이 등록되어 있으니 Spring빈은 스프링 컨테이너에서 어떤 빈이 해당 로직에서 어떤 구현체를 주입해줘야 하는지 모르기 때문에 NoUniqueBeanDefinitionException 예외가 발생하게 됩니다. 이때 명시적으로 'joinEmail' 구현체를 사용할 거야!라고 명시해 주면 Spring이 아! 이걸 사용하는구나라고 알 수 있어서 올바르게 빈을 등록해 줍니다. @Qualifier 에노테이션은
@Qualifier("JoinEmail")
public class joinEmail implements EmailService {
public void send() {
// 가입 이메일 로직
}
}
클래스상단에 작성해 주면 됩니다.
DI 주입 방법
생성자 주입 시
Lombook을 사용하고 있다면 final 필드에 붙여 작성해 주면 됩니다.
@Qualifier("JoinEmail")
private final MailService mailService;
[오류] @RequiredArgsConstructor과 @Qualifier 이슈
오류 발생롬복의 @RequiredArgsConstructor을 통해 생성자 주입을 아주 편리하게 사용하고 있는 도중에동일한 인터페에스를 사용하는 여러 구현체가 있어서 @Qualifier오류가 뜬것이 아닌가.......(┬┬
back-stead.tistory.com
(롬복 생성자 주입 오류시 해당 포스팅 참고 바랍니다!!)
기존 생성자 주입 시
파라미터에 에노테이션을 작성해 주면 됩니다.
public EmailController(@Qualifier("JoinEmail") MailService mailService) {
this.mailService = mailService;
}
Reference
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] Let's encrypt - 스프링 부트 SSL/TLS 인증서 발급 받기 (0) | 2024.07.12 |
---|---|
[SpringBoot] SSE를 이용한 실시간 알림 구현하기! (0) | 2024.06.13 |
[SpringBoot] Custom @Vailid 어노테이션 만들기 (0) | 2024.05.10 |
[Spring-Boot] Srpingdoc OpenApi 스웨거(Swagger) 사용하기 (0) | 2024.04.24 |
[SpringBoot] 스프링 클라우트 볼트(Vault)를 활용하여 정보관리 (1) | 2024.01.04 |