Spring의 Ioc에 대하여 설명 한다.
본 글에 들어가기에 앞서 http://www.springsource.org/download/community 에서 Spring 3.x.x 이상을 다운 받고 라이브러리에 추가 하도록 한다.
Java라는 언어를 이용하면서 new 라는 키워드를 자주 이용 한다. 이와 같은 행위는 Instance 를 생성 하는 것 이다.
public class Wcontroller{
Wservice service = new Wservice();
....
}
public class Wservice {
Wdao dao = new Wdao();
....
}
public class Wdao {
....
}
위 Sample을 보도록 하자. Wcontroller Class는 Wservice Instance를 가지고 있고, Wservice Class는 Wdao Instance를 가지고 있다. 이런 경우는 서로 강하게 의존을 하고 있는 Code라고 볼 수 있다.
Instance는 서로 의존(Dependency) 하는 모습을 보여주고 있다. 이런 상황의 경우에는 "의존 관계의 제어권은 개발자가 가지고 있다." 라고 말할 수 있다. Instance에 대한 LifeCycle을 개발자가 직접 관리하게 된다. 제어권을 Container에게 넘겨주는 행위를 제어권의 역전 Ioc(Inversion Of Control) 이라고 한다. 여기서 말하는 Container는 SpringFramework의 ApplicationContext 라고 봐도 된다.
위 그림을 보도록 하자. Ioc(Inversion Of Control) 은 두 종류로 분리가 된다. 개발자가 Container 에게 제어권을 위임하게 되면 new 를 Container가 대신 한다. 첫 번째의 경우 DI(Denpendency Injection)은 Container가 직접 주입해주는 경우 이다. 개발자는 Object 선언만 하고 Container가 Instance를 주입하게 되는데, 첫번째 방법에서 많이 이용한다. 하지만 멀티 쓰레드 환경에서 Instance를 이용할 경우는 서로의 간섭이 없어야 하기 때문에, 두 번째 방법 DL(Denpendency Lookup)을 이용한다. Contaciner가 Instance를 가지고 있고, 개발자는 Instance를 직접 참조하여 이용 하는 방법 이다.
@Controller
public class Wcontroller {
@Autowired
Wservice service;
public void showMsg() {
System.out.println("Wcontroller.showMsg....");
service.showMsg();
}
}
@Service
public class Wservice {
@Autowired
Wdao dao = new Wdao();
public void showMsg() {
System.out.println("Wservice.showMsg....");
dao.showMsg();
}
}
@Repository
public class Wdao {
public void showMsg() {
System.out.println("Wdao.showMsg....");
}
}
위 Sample를 보도록 하자. Annotation으로 작성 되었고, Spring Web 환경에서 사용한다. 제일 위에 있던 Sample 과 달리 new 라는 키워드가 사라진 점을 발견할 수 있다. 개발자가 직접 Instance를 관리하지 않는다. @Autowired는 DI(Denpendency Injection)을 해주는 기준이라고 보면 된다. 여기서 끝이 아니다. 위와 같이 작성만 했다고 해서 동작하지는 않는다. Container에 대한 작업을 해야 한다.
public class WapplicationContext {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext
= new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(Wdao.class);
annotationConfigApplicationContext.register(Wservice.class);
annotationConfigApplicationContext.register(Wcontroller.class);
annotationConfigApplicationContext.refresh();
Wcontroller wcontroller = annotationConfigApplicationContext.getBean(Wcontroller.class);
wcontroller.showMsg();
}
}
위 Sample를 보도록 하자. 쉽게 이해를 돕기 위하여 코드 기준으로 작성 하였다. Container는 Wdao, Wservice, Wcontroller Class를 등록함 으로써, 각각 Instance 들을 가지고 있다. getBean(Wcontroller.class)는 DL(Denpendency Lookup)을 해주는 기준이라고 보면 된다.
Wcontroller.showMsg....
Wservice.showMsg....
Wdao.showMsg....
실행 할 경우 위와 같은 메시지가 출력 된다. 정상적으로 DI(Denpendency Injection), DL(Denpendency Lookup)이 된 것을 확인 할 수 있다.
실제로 사용할 경우에는 SpringFramework의 AppcationContext Instance가 위의 역활을 대신해 줄 것이다. XML로 설정을 하게 된다.
Spring을 사용하여 개발을 할 경우, Ioc에 대해서는 꼭 기억 하고 있도록 하자. DI(Denpendency Injection)에 대한 자세한 내용은 다음 글을 참고 하도록 한다.