Skip to content

Latest commit

 

History

History
100 lines (77 loc) · 2.08 KB

@Qualifier 란 무엇일까.md

File metadata and controls

100 lines (77 loc) · 2.08 KB

@Qualifier란 무엇일까?

@Qualifier("testWebClient")

스프링에는 @Qualifier 어노테이션이 존재한다. 어노테이션의 역할에 대해 알아보자.


interface Formatter {}
@Component
class FooFormatter : Formatter {

    fun format(): String {
        return "Foo Format"
    }
}
@Component
class BarFormatter : Formatter {

    fun format(): String {
        return "Bar Format"
    }
}

하나의 인터페이스 구현체에 2개의 구현체가 있고, 구현체는 모두 Bean으로 등록되어 있다.는 것을 코드로 보면 위와 같다.


@Service
class FooService(
    private val formatter: Formatter
)

위와 같이 formatter Bean으로 주입을 받는다면 스프링에서는 어떤 구현체를 의존 주입시켜야 할 지 알 수 없다.

이럴 때 사용할 수 있는 것이 @Qualifier 이다. 즉, 해당 Bean은 @Qualifier에 지정한 이름으로 등록하라는 것이다.


@Service
class FooService(
    @Qualifier("barFormatter")
    private val formatter: Formatter
)

위처럼 barFormatter의 Bean을 등록하라고 명시하는 어노테이션이라고 할 수 있다.


@Service
class FooService(
    private val barFormatter: Formatter
)

하지만 이렇게 Bean 이름을 직접 명시하면 되기 때문에 @Qualifier은 굳이 사용해야 하나? 라는 생각이 있다.


@SpringBootTest
class CacheApplicationTests(
    private val applicationContext: ApplicationContext
) {

    @Test
    fun contextLoads() {
        applicationContext.let {
            val names = applicationContext.beanDefinitionNames
            for (name in names) {
                println("Bean Name: $name")
            }
        }
    }
}
...
Bean Name: barFormatter
Bean Name: fooFormatter
Bean Name: fooService
...

Bean 이름은 위와 같이 따로 지정하지 않으면 Class 이름에서 맨 앞 글자가 소문자로 등록이 된다.(ex: FooServce 클래스라면 fooService가 Bean 이름이 된다.)