Spring/Dependency Injection

[Spring] @Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기

Dev.Cho 2024. 11. 13. 07:17

Bean의 이름이 설정되는 방법

Bean의 이름은 @Bean 어노테이션이 붙은 함수의 이름으로 자동 설정된다. 예를 들어 다음과 같이 Bean들이 설정되어 있다고 해보자.

@Configuration
class DefaultContainerConfiguration {
    @Bean
    fun blogName(): String {
        return "KotlinWorld"
    }

    @Bean
    fun blogAge(): Int {
        return 3
    }
}

 

그러면 blogName 이라는 이름의 Bean은 "KotlinWorld"라는 값을 가지고, blogAge 라는 이름의 Bean은 3이라는 값을 가져 아래 그림과 같은 모양이 된다.

 

 

@Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기

하지만, Bean의 이름을 다르게 설정하거나, 하나의 Bean에 여러 개의 이름을 설정해야 할 수 있다. 이런 경우 @Bean Annotation의 name 프로퍼티를 사용하면 Bean의 이름을 커스텀하게 설정할 수 있다.

 

예를 들어 blogName의 Bean의 이름을 blogName1과 blogName2로 설정하고 싶다면 다음과 같이 blogName 함수 위에 @Bean(name = ["blogName1", "blogName2"]) 이라고 코드를 작성하면 된다.

@Configuration
class DefaultContainerConfiguration {
    @Bean(name = ["blogName1", "blogName2"])
    fun blogName(): String {
        return "KotlinWorld"
    }

    @Bean
    fun blogAge(): Int {
        return 3
    }
}

 

그러면 이제 IOC Container는 다음과 같은 모양이 된다.

 

 

따라서 기존의 blogName은 더이상 Bean의 이름이 아니게 되기 때문에 다음 코드와 같이 context.getBean("blogName")을 호출하면, NoSuchBeanDefinitionException 예외가 발생하게 된다.

fun main(args: Array<String>) {
    val context = AnnotationConfigApplicationContext(DefaultContainerConfiguration::class.java)

    println(context.getBean("blogName"))
}

 

아래는 코드를 실행한 결과이다.

 

 

NoSuchBeanDefinitionException 예외를 해결하기 위해서는 커스텀하게 설정한 Bean의 이름인 blogName1이나 blogName2을 사용하면 된다.

fun main(args: Array<String>) {
    val context = AnnotationConfigApplicationContext(DefaultContainerConfiguration::class.java)
    
    println(context.getBean("blogName1"))
    println(context.getBean("blogName2"))
}

 

그러면 다음과 같은 결과가 나오는 것을 볼 수 있다.

 

 

여기까지 @Bean의 name 프로퍼티를 사용해 Bean의 이름을 커스텀하게 설정하는 방법을 알아봤다.

 

 

전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
반응형