Spring이 제공하는 IOC Container을 만드는 방법
Spring에서는 IOC Container을 만들기 위해 다양한 방법을 제공한다. Annotation을 기반으로 동작하는 IOC Container을 만들 수도 있고, xml을 기반으로 동작하는 IOC Container을 만들 수도 있다. 하지만 xml을 기반으로 동작하는 IOC Container은 이제는 거의 사용되지 않기 때문에 이번 글에서는 Annotation을 기반으로 동작하는 IOC Container을 만드는 방법을 살펴본다.
Annotation을 기반으로 동작하는 IOC Container 만들기
Annotation을 기반으로 동작하는 IOC Container는 AnnotationConfigApplicationContext 라는 클래스를 사용해 생성할 수 있다. AnnotationConfigApplicationContext라는 이름이 조금 생소할 수 있지만 아래와 같이 단어를 개별로 분리해 보면, 매우 직관적인 이름인 것을 알 수 있다.
Annotation + Config + ApplicationContext
여기서 Config는 설정 파일이라는 뜻이며, ApplicationContext는 IOC Container의 다른 이름이다. 즉, AnnotationConfigApplicationContext란 Annotation으로 설정하는 IOC Container라는 뜻으로, AnnotationConfigApplicationContext는 IOC Container 내부에 포함될 Bean들에 대한 설정 정보가 담긴 Configuration 파일을 받아 IOC Container을 생성한다.
그러면 Configuration 파일을 먼저 만들어보도록 하자. Configuration 파일은 클래스 위에 @Configuration 어노테이션을 붙인 후, 내부에 포함될 Bean을 생성하는 함수에 @Bean 어노테이션을 붙여 만들 수 있다.
예를 들어 blogName 이라는 이름과 "Kotlin World" 값을 가진 Bean과, blogAge 라는 이름과 3이라는 값을 가진 Bean을 가진 IOC Container Configuration 파일 DefaultContainerConfiguration은 다음과 같이 만들 수 있다.
*함수의 이름이 Bean의 이름이 된다.
@Configuration
class DefaultContainerConfiguration {
@Bean
fun blogName(): String {
return "KotlinWorld"
}
@Bean
fun blogAge(): Int {
return 3
}
}
이렇게 만들어진 DefaultContainerConfiguration 클래스는 AnnotationConfigApplicationContext의 인자로 넘어감으로써 IOC Container로 만들어질 수 있다.
* 아래 코드의 context는 IOC Container을 뜻한다.
val context = AnnotationConfigApplicationContext(DefaultContainerConfiguration::class.java)
그러면 이 코드를 실행하면 다음과 같은 IOC Container가 생성된다.
내부에 두개의 Bean이 등록된 것을 볼 수 있다.
IOC Container로부터 Bean 가져오기
name 값으로 Bean 가져오기
IOC Container로부터 Bean을 가져오기 위해서는 context 객체에 getBean 함수를 호출한 후 Bean의 name을 인자로 넘기면 된다. 예를 들어 우리가 위에 등록한 두 개의 Bean을 가져오기 위해서는 다음과 같이 context.getBean("blogName")과 context.getBean("blogAge")를 호출하면 된다.
fun main(args: Array<String>) {
val context = AnnotationConfigApplicationContext(DefaultContainerConfiguration::class.java)
println(context.getBean("blogName"))
println(context.getBean("blogAge"))
}
그러면 위 코드를 실행해보면 다음과 같은 결과가 나오는 것을 볼 수 있다.
우리가 등록한 두 개의 Bean이 제대로 가져와진 것을 볼 수 있다.
Class로 Bean 가져오기
IOC Container에서 Bean을 가져오기 위한 다른 방법은 Class를 사용하는 것이다. 우리가 등록한 blogName = "Kotlin World"는 String 클래스이므로 context.getBean(String::class.java)을 통해 등록된 Bean을 가져올 수 있고, blogAge = 3는 Int 클래스 이므로 println(context.getBean(Int::class.java))을 통해 가져올 수 있다.
가져오는 코드는 다음과 같다.
fun main(args: Array<String>) {
val context = AnnotationConfigApplicationContext(DefaultContainerConfiguration::class.java)
println(context.getBean(String::class.java))
println(context.getBean(Int::class.java))
}
그러면 이 코드를 실행하면 이전과 같은 결과가 나오는 것을 볼 수 있다.
우리가 등록한 두 개의 Bean이 제대로 가져와진 것을 볼 수 있다.
Code: GitHub
도움이 되셨다면 ⭐️를 눌러주세요!