code
@Qualifier 이란??
sinply
2025. 3. 9. 14:50
반응형
SMALL
🎯 @Qualifier란?
스프링에서 같은 타입의 여러 빈이 있을 때 특정 빈을 주입할 수 있도록 도와주는 어노테이션! 🎯
🔹 @Autowired만 사용할 경우, 어떤 빈을 주입할지 모호할 때 발생하는 충돌을 해결해줘요!
🔹 문자열로 특정 빈을 선택하거나 ✍️ 사용자 정의 어노테이션을 활용할 수도 있어요!
코틀린에서 스프링 프레임워크를 사용할 때, 생성자 주입과 @Qualifier 어노테이션을 함께 활용하여 동일한 타입의 여러 빈 중 특정 빈을 주입하는 방법을 알아보겠습니다.
1. @Qualifier를 사용한 생성자 주입
생성자 주입은 의존성을 클래스의 생성자를 통해 주입하는 방식으로, 객체의 불변성을 보장하고 테스트 용이성을 높여줍니다. @Qualifier 어노테이션은 동일한 타입의 여러 빈 중에서 특정한 빈을 주입하고자 할 때 사용됩니다.
kotlin
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.stereotype.Service
interface PaymentService {
fun processPayment(amount: Double)
}
@Service
@Qualifier("kakaoPaymentService")
class KakaoPaymentService : PaymentService {
override fun processPayment(amount: Double) {
println("Processing payment of $$amount through KakaoPay.")
}
}
@Service
@Qualifier("naverPaymentService")
class NaverPaymentService : PaymentService {
override fun processPayment(amount: Double) {
println("Processing payment of $$amount through NaverPay.")
}
}
@Service
class OrderService(
@Qualifier("kakaoPaymentService") private val paymentService: PaymentService
) {
fun placeOrder(amount: Double) {
paymentService.processPayment(amount)
}
}
위 코드에서 OrderService 클래스는 생성자를 통해 PaymentService 타입의 빈을 주입받습니다. @Qualifier("kakaoPaymentService")를 사용하여 KakaoPaymentService 빈을 명시적으로 주입하고 있습니다.
2. 사용자 정의 @Qualifier 어노테이션
@Qualifier를 직접 문자열로 지정하는 대신, 사용자 정의 어노테이션을 만들어 타입 안전성을 높일 수 있습니다.
kotlin
import org.springframework.beans.factory.annotation.Qualifier
@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@Qualifier
annotation class KakaoPay
@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@Qualifier
annotation class NaverPay
이제 각 구현 클래스와 주입 시에 사용자 정의 어노테이션을 사용할 수 있습니다.
kotlin
@Service
@KakaoPay
class KakaoPaymentService : PaymentService {
override fun processPayment(amount: Double) {
println("Processing payment of $$amount through KakaoPay.")
}
}
@Service
@NaverPay
class NaverPaymentService : PaymentService {
override fun processPayment(amount: Double) {
println("Processing payment of $$amount through NaverPay.")
}
}
@Service
class OrderService(
@KakaoPay private val paymentService: PaymentService
) {
fun placeOrder(amount: Double) {
paymentService.processPayment(amount)
}
}
이러한 방식으로 사용자 정의 @Qualifier 어노테이션을 활용하면, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
반응형
LIST