스프링 컨테이너와 의존관계 주입(Dependency Injection)
ObjectFactory → BeanFactory
- BeanFactory는 스프링이 제공하는 것을 사용
- 우리가 만든 것이 아니기 때문에 PaymentService, ExRateProvider를 사용하는 정보를 알지 못함
![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/a7e1e85e-d6f9-43d3-8475-0933babeaf4a/c7bd32ae-4925-45f2-9de8-f5cc60faf122/image.png)
BeanFactory가 ObjectFactory를 참고할 수 있도록 해줘야 됨
![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/a7e1e85e-d6f9-43d3-8475-0933babeaf4a/1f703251-d111-44dc-b6fa-3a7f80484d25/image.png)
- Bean :
PaymentService
, WebApiExRateProvider
PaymentService
는 런타임에 WebApiExRateProvider
를 사용
- 여기에는 2가지 정보가 존재
- 어떤 클래스가 런타임에 동작하는 클래스가 될 것인가?(Bean 이 될 것인가?)
- 어떤 Bean이 어떤 Bean을 의존해서 런타임에 사용할 지 의존관계를 맺을 것인가?
- 위의 정보는 기존의
ObjectFactory
안에 들어있었음
- 2가지의 정보를 합쳐서 전체 Application이 어떻게 구성되어 질 것인가라는 정보.
즉, **구성정보(Configuration)**이라고 함
최종적으로 프로그램이 실행되면 아래와 같은 구조로 만들어지게 됨
![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/a7e1e85e-d6f9-43d3-8475-0933babeaf4a/934a3304-56ec-418f-a5fe-2f98736b1dec/image.png)
BeanFactory
![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/a7e1e85e-d6f9-43d3-8475-0933babeaf4a/22bdd317-b5f0-460f-8785-a878607dd8de/image.png)
- BeanFactory = Spring
- IoC(Inversion of Control) : 어떤 오브젝트를 사용할 것인지를 밖으로 이전 시킴(제어권 이전)
- DI(Dependency Injection) : 외부에서 제 3의 오브젝트가 2개의 실제 Application이 동작하는데 사용할 의존관계를 생성하고 관계를 맺어주는 것(BeanFactory + ObjectFactory)
- 생성자를 통해서 이용할 오브젝트를 외부에서 전달
- Container : BeanFactory가 만들어질 때 이미 PaymentService, WebApiExRateProvider를 만들어서 가지고 있음
- 미리 만들어두고 가지고 있기 때문에 요청할 때마다 생성하지 않아도 됨
- 여러 쓰레드에서 동시에 사용해도 괜찮음
- 단순히 만들어서 가지고 있는 것만이 아닌 만들어진 오브젝트들 사이의 관계설정 까지 함(DI Contaioner)