Spring - IoC, DI

Panda·2022년 1월 26일
0

Spring

목록 보기
2/44

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가지인데

  1. 직접 Bean을 등록하는 법
@SpringBootApplication
class SpringStudyApplication {

	// Bean 객체인 restTemplate 추가
	@Bean
	fun restTemplate(builder : RestTemplateBuilder) : RestTemplate = builder.build()
}
  1. Component Scan 방법
    • @Component
      - @Controller
      - @Service
      - @Repository

위의 어노테이션을 활용한 객체들이 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만 선언해줘도 된다.

profile
실력있는 개발자가 되보자!

0개의 댓글