IoC 와 DI는 한묶음이라고 생각을 하였다.
IoC란? 제어의 역전
기존의 제어는 객체 내부에서 직접 선언
class BankController {
private val bankController = BankController()
}
하지만 Spring의 특징인 IoC로 인해
class BankController {
@Autowired
private val bankController
}
@Autowired
로 인해 Bean 객체를 주입을 시켜준다.
즉 따로 선언을 안해줘도 외부에서 의존성을 주입해준다.
이것이 가능한 이유는
IoC 컨테이너 (ApplicationContext)에 등록되있는
Bean객체들을 자동으로 찾아 주입을 시켜주기 때문입니다.
여기서 중요한것은 IoC컨테이너에 Bean객체로 등록이 되있어야 한다는점입니다.
Bean 객체로 등록하는 방법은 총 2가지인데
@SpringBootApplication
class SpringStudyApplication {
// Bean 객체인 restTemplate 추가
@Bean
fun restTemplate(builder : RestTemplateBuilder) : RestTemplate = builder.build()
}
위의 어노테이션을 활용한 객체들이 Bean 객체로 등록이 됩니다.
만약 동일한 타입을 가진 Bean 객체가 2개 이상 존재하는 경우 @Qualifier
정의해줘야만
의존성 주입이 일어납니다.
EX)
@Repository("mock")
class MockBankDataSource : BankDataSource {
val banks = mutableListOf(
Bank("123456", 3.14, 1),
Bank("1010", 17.0, 0),
Bank("5678", 0.0, 100)
)
TODO()
...
// @Qualifier 사용하기 위해 이름 정의함.
@Repository("network")
class NetworkDataSource(@Autowired private val restTemplate: RestTemplate) : BankDataSource {
TODO()
...
}
@Service
class BankService(@Qualifier("network") private val dataSource : BankDataSource) {
TODO()
...
}
위의 코드들을 살펴보면
BankDataSource
타입의 @Repository
Bean 객체가 2개가 존재한다.
그렇기때문에 구분을 할수 있게끔 @Repsitory
Bean 객체의 이름을 각각 정의하였고
@Qualifier
로 원하는 Bean 객체를 주입 할 수 있다.
단순히 같은 타입의 Bean 객체가 한개만 존재한다면
@Autowired
만 선언해줘도 된다.