[Spring] 의존성 주입이란 무엇인가? IOC Container과 Bean으로 알아보는 의존성 주입
의존성 주입을 알기 위해 미리 알아야 내용들
의존성 주입이란?
의존성이란 하나의 객체가 다른 객체의 기능을 사용하는 것을 뜻한다. 일반적으로 다른 객체에 의존성이 있는 객체를 초기화 하기 위해서는 위해서는 의존성이 있는 객체를 직접 만든 다음 주입해주는 과정을 거친다. 예를 들어 다음과 같은 유저의 정보를 저장하고 가져오는 데이터 레이어 객체 UserRepository가 있다고 해보자.
class UserRepository() {
private val idToUserMap = mutableMapOf<String, String>()
fun getUser(id: String): String? = idToUserMap[id]
fun createUser(id: String, user: String) {
idToUserMap[id] = user
}
}
이 UserRepository를 CreateUserUseCase라는 도메인 레이어 객체가 사용한다면, CreateUserUseCase는 다음과 같이 구현될 수 있다.
class UserCreator(private val repository: UserRepository) {
fun createUserWithRandomId(user: String) {
val id = UUID.randomUUID().toString()
repository.createUser(id, user)
}
}
그러면 이 UseCreator는 어떻게 사용할 수 있을까? 바로 다음과 같이 UserRepository 객체를 초기화 한다음, 해당 UserRepository 객체를 UserCreator에 주입해 사용할 수 있다.
fun main() {
val userRepository = UserRepository() // UserRepository 객체 초기화
val userCreator = UserCreator(userRepository) // UserRepository 객체를 UserCreator에 주입
userCreator.createUserWithRandomId("세영")
}
이제 의존성을 주입한다는 것이 무엇인지 알았으니, 이번에는 Spring 프레임웍에서의 의존성 주입을 알아보자
Spring 프레임웍에서의 의존성 주입
Spring 프레임웍은 의존성 주입을 쉽게 하기 위한 장치를 제공한다. IOC Container 혹은 Application Context 라고 불리는 컨테이너 속에 객체들을 생성해 놓고, 필요한 경우 주입을 할 수 있도록 한다. 예를 들어 위에서 UserCreator을 초기화 하기 위해 UserRepository에 대한 의존성이 필요했는데, 그런 경우 다음과 같이 UserRepository 객체를 IOC Container에 미리 만들어 놓으면 된다.
이렇게 만들어진 UserRepository 객체는 기본적으로 싱글톤 객체로 만들어지며 Bean이라고 부른다. 즉, IOC Container에 여러 객체들이 Bean으로 등록이 되는 것이다.
그러면 이제 UserCreator를 초기화 할 준비가 완료됐으니, 다음과 같이 UserCreator 객체도 초기화해 Bean으로 등록하면 된다. 그러면 이 UserCreator 객체는 기존에 만들어진 UserRepository 객체에 대한 의존성을 가지도록 초기화 된다.
이제 이렇게 생성된 UserCreator 객체와 UserRepository 객체는 필요한 곳 어디에서나 주입돼 사용될 수 있다.
이것이 바로 Spring 프레임웍에서의 의존성 주입이다. 그러면 이 IOC Container은 어떻게 만들 수 있고, 내부에 Bean은 어떻게 등록할 수 있을까? 그리고 이 Bean을 어떻게 가져와 사용할 수 있을까?
다음 글에서 이 방법에 대해 알아보자