DI(dependency injection)
- spring framework에서 사용되는 컨테이너 개념이다.
- 지시계열화 순서
1) 스프링에서 객체 사용 메커니즘
만능키트와 같은 컨테이너(dispatcher-servlet.xml)
==> 스프링에서 핵심 객체들을 컨테이너 메모리에 올려서 호출하게 한다.
* process
url로 주소와 요청값 전달 -> 웹서버 호출 -> 웹서버안에 web.xml
-> 컨테이너 호출(dispatcher-servlet.xml) -> 객체 메모리 로딩
-> 특정 호출 mapping controller 호출 및 메서드 호출 -> 모델처리(service, dao처리후) -> view단 호출 -> 화면단을 클라이언트에 전달
2) IOC(Inversion of controller)이해
- 제어권의 역전이란?
- 객체의 생성, 사용, 소멸로 처리되는 생명 주기의 관리까지 기존에 개발자가 각 객체 안에서 호출해서 처리했던 내용을 컨테이너에 의해서 처리되게끔 객체에 대한 제어권을 바꿔준다는 것을 의미한다.
- 컴포넌트 의존 관계 결정, 설정 및 생명 주기를 해결하기 위한 디자인 패턴을 말한다.
- 스프링 프레임워크도 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있고, 이것을 IOC라고 한다
- IOC는 컨테이너에서 객체의 생성을 책임지고, 의존성을 관리한다.
- 의존성관리란 객체간에 Controller ==> service ==> Dao 형태로 상호의존을 하여 처리하는 것을 말하고, 이러한 것을 컨테이너에서 관리하는 것을 말한다.
- 메모리에 컨테이너의 핵심 객체들이 로딩되어 있기 때문에 new XXX()를 활용하여 객체를 생성할 필요없이 바로 객체를 선언된 내용으로 활용이 가능하다.
3) IOC에서 파생하는 개념들
- DL(Dependency Lookup) : 컨테이너에 저장된 객체들을 찾을 떄 사용되는 키워드 또는 개념
- Setter Injection
- Constructor Injection
- Method Injection
==> autowiring으로 객체간의 자동 연관 처리 개념으로 발전
ex) Controller, Service, Dao 컨테이너에서 메모리 로딩
// Setter Injection
public void setService(Service service){
this.service = service
}
이렇게 직접적으로 코드하지 않더라도 IOC에 의해 자동으로 할당되는 개념이 "autowiring"이다
controller.setService(new Service())
4) DI 사용 메서드
@@ IOC container(di11.xml)
# set메서드 이용해서 객체 생성
<bean id="p01" class="a01_diexp.z01_vo.Person">
// Person p01 = new Person();
// p01.setName("홍길동") , p01.setAge(25), p01.setLoc("서울")와 같다
<property name="name" value="홍길동"/>
<property name="age" value="25"/>
<property name="loc" value="서울"/>
</bean>
# 생성자를 통해 객체 생성
<bean id="prod02" class="a01_diexp.z01_vo.Product">
// Product prod02 = new Product("바나나,3000,2) 와 같다.
<constructor-arg value="바나나"/>
<constructor-arg value="3000"/>
<constructor-arg value="2"/>
</bean>
@@ public class DIExp11 {
// 컨테이너 객체 호출 처리
String path="a01_diexp\\di11.xml";
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(path);
// DL(dependency lookup)으로 id명으로 객체를 찾아서 가져온다.
Person p01 = ctx.getBean("p01",Person.class);
System.out.println("컨테이너의 객체 호출:"+p01);
System.out.println("이름: "+p01.getName());
System.out.println("나이: "+p01.getAge());
System.out.println("사는곳: "+p01.getLoc());
Product prod02 = ctx.getBean("prod02",Product.class);
System.out.println(prod02.getPname());
System.out.println(prod02.getPrice());
System.out.println(prod02.getCnt());
ctx.close();
}