이 개념은 스프링과 상관없이 다양한 프레임 워크에서 활용되고 있는 개념이다.
간단히 말하자면, 객체사이의 의존관계를 객체 자체에서가 아닌 외부 설정을 이용하여 주입을 함으로써
각 객체간의 의존관계를 맺는다는 것이다.
BeanFactory <-ApplicationContext <- WebApplicationContext
일반적으로 다른 클레스의 Method를 호출 할때는 다음과 같이 Instance Variable 하여 객체를 붕어빵 틀에 넣어 찍어 내듯이 new 를 이용하여 객체를 생성하여 사용한다.(일반적인 객체 의존)
@Service(name="testService")
public class TestService{
private TestDao testDao = new TestDao()
public void testMehtod(){
testDao.method();
}
}
하지만 위와 같이 직접 호출 하게 되면 단위테스트가 어려워 진다고 한다.
TestDao 라는 클레스의 명칭이 바뀌게 되기라도 하면, 소스 전체를 수정하고 컴피일을 해야하는 문제가 있다.
또한 DB가 변경 되기라도 하면 이와 관련된 DB Connection 정의 클레스를 수정해줘야 하는 문제도 생길수 있다.
이러한 연관관계를 정립하고 효과적으로 구성 할 수 있는 처리방법이 몇가지 있으나(JNDI, Factory Pattern)
Spring에서는 이것을 외부화 하고, 외부에서 이러한 연관 관계를 규정하고, 해당 클래스에 주입해 주는 개념을 도입하여 사용하는 것. 이것이 바로 DI(IoC)의 핵심이다.
의존성(Dependency) 주입(Injection) DI의 방법에는 세가지 방법이 있다.
셋터 주입(setter), 생성자 주입(constructor), 메소드 주입(method) 으로 나뉜다.
다음은 셋터 주입과 생성자 주입 예제이다.
*Class
@Controller
public class TestController{
private ITestService testServiceImpl;
private ITestDao testDaoImpl;
//Setter Injection
public setTestService(ITestService testServiceImpl){
this.testServiceImpl = testServiceImpl;
}
//Constructor Injection
public TestController(ITestDao testDaoImpl){
this.testDaoImpl = testDaoImpl;
}
}
<bean id="testController" class="www.dongbu.com.web.test.TestController">
<constructor-arg>
<ref local="testDaoImpl" />
</constructor-arg>
<property name="testServiceImpl" ref="testServiceImpl" />
</bean>
<bean id="testServiceImpl" class="com.dongbu.com.web.test.service.impl.TestServiceImpl">
<bean id="testDaoImpl" class="com.dongbu.com.web.test.dao.impl.TestDaoImpl">
DI개념만... 실행에 필요한 예저 Code는 생략...
AOP 관점지향 프로그래밍.. 이것을 어찌 하리오.
일단 시간이 되면 @Transaction 처리
'Spring' 카테고리의 다른 글
facebook platform login/ 정보 연동 (java/jsp) (0) | 2013.12.10 |
---|---|
Spring Transaction rollback @Annotation 처리 (선언적 트랜잭션 처리) - 작성중.. (0) | 2012.01.17 |
Spring @annotation 사용시 주의점 및 사용 방법 ?? 수정중,.,.. (0) | 2011.11.17 |
spring annotation (0) | 2011.03.30 |
Spring Annotation 사용방법 (0) | 2011.03.14 |