[Spring] DI와 IoC Container
Spring
Spring이 가지고 있는 가장 기본적인 능력
원하는 부품(Dependency)이 무엇인지, 어떻게 결합(Injection)되었으면 하는지 설정해주면 Spring이 DI해준다
DI(Dependency Injection)
(=부품 조립)
프로그램을 객체지향으로 만들게 될 경우, 객체들의 조립관계로 만들어지게 된다.
A라는 클래스가 B라는 클래스를 객체화 해서 사용하고 있다고 할 때 두가지 방법으로 사용할 수 있다.
- 1.Composition has a (일체형)
class A{ private B b; public A(){ b = new B(); //A가 B를 직접 생성 } }
A가 생성될때 B의 객체를 생성해서 가진다.
이 경우 A가 B를 일체형으로 가졌다고 해서 Composition(일체형) has a 관계라고 한다.이때 B를 A의 부품이라고 할 수 있는데, 이 B를 Dependency(부품)라고 한다.
- 2.Association has a (조립형)
class A{ private B b; public A(){ // b = new B(); } public void setB(B b){ this.b = b; } }
A가 B를 직접 생성하지 않는다.
외부에서 생성해서 그 생성을 setB로 setting하여 사용한다.
이 경우 조립형 관계라고 한다.
일체형보다 조립형이 결합력이 훨씬 더 낮고 다른 부품으로 바꿔 끼울 수 있다
- 1번 일체형의 경우
A a = new A();
사용자 입장에서 A의 객체를 만들면 그 안에 부품이 뭐가 있는지 잘 모르게 되고 부품을 바꿔 끼울 수 없다.
- 2번 조립형의 경우
B b = new B();
A a = new A();
a.setB(b);
A의 객체를 만들고 A가 가지고 있는 부품 B(Dependency)를 만들어서 꽂아준다.(Injection)(=Dependency Injection)
장점 : 부품을 바꿔 끼울 수 있다.
단점 : 부품을 조립해야 하는 불편함이 있다.
Injection의 두가지 방법
- Setter Injection
B b = new B();
A a = new A();
a.setB(b);
- Construction Injection
B b = new B();
A a = new A(b);
IoC Container
여러가지 부품들을 주문서에 작성해서 Spring에게 제공하면 부품을 생성하고 조립해 준다.
주문서 작성 방법 두 가지
- xml파일
- Annotation
객체를 생성해서 그것들을 담을 수 있는 그릇이 필요한데 이를 Spring에서 Container 라고 한다.
- IoC Container라고 하는 이유
위 사진과 같이 일체형으로 제품을 만들게 되면 A클래스가 B클래스를 만들고, B클래스가 C클래스를, C클래스가 D클래스를 만들게 된다.
즉 순차적으로 객체가 만들어진다.
반면 위 사진과 같이 조립형은 D클래스, C클래스, B클래스, A클래스 순으로 만들어 진다.
즉 역순(Inversion)으로 만들어진다.
위와 같은 이유로 IoC(Inversion of Control) Container라고 한다.
단순히 부품만 담고 있다면 Dependency Container라고 할텐데 IoC Container 라고 하는 이유는 결합까지 되서 담겨진다는 의미를 좀 더 강하게 나타내기 위해서 이다.
댓글남기기