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