2013년 10월 15일 화요일

[스프링DL,DI]룩업이냐 주입이냐?

[스프링DL,DI]룩업이냐 주입이냐?DL(Dependecy Lookup), DI(Dependency Injection)
 
1. DL(Dependecy Lookup) 
 
JNDI 같은 저장소에 의하여 관리되고 있는 bean을 개발자들이 직접 container에서 제공하는 API를 이용하여 lookup하는 것(컨테이너가 callback을 통해 lookup context를 제공, 공된 context를 이용해서 필요한 resouce나 object를 얻는 방식)을 말한다. 따라서 container와의 종속성이 생긴다.

오브젝트간에 Decoupling을 해주는 면에서 장점이 있기는 하다. 하지만 이렇게 만들어진 오브젝트는 컨테이너 밖에서 실행 할 수 없고 JNDI외의 방법을 사용할 경우 JNDI관련 코드를 오브젝트내에 일일히 변경해 줘야 하며 테스트하기 매우 어렵고 코드양이 매우 증가하고 매번 Casting해야 하고  NamingException같은 checked exception을 처리하기 위해서 exception처리구조가 매우 복잡해지는 단점이 있다.

EJB container, Spring container 에서 지원한다.  대부분의 환경에서 DI를 사용해서 모든 객체를 연결할 수는 없으며 초기 컴포넌트에 접근시 DL을 사용하야 하는 경우가 많다.
 
 
 
2. DI (Dependecy Injection)
 
각 class/객체 사이의 의존관계를 빈 설정 정보를 바탕으로 container가 자동적으로 연결해 주는 것을 말한다. 따라서 lookup과 관련된 코드들이 오브젝트 내에서 완전히 사라지고 컨테이너에 의존적이지 않은 코드를 작성할 수 있다. 단지 빈 설정 파일에서 의존관계가 필요하다는 정보를 추가하면 된다.

Spring container 에서 지원한다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성이 항상 Injection형태의 IoC를 사용하게 된다.
 
결론

어떤 IoC 방식을 사용할지는 별로 어렵지 않다.  예를 들어 일반 자바APP에서는 main에서 스프링 컨테이너를 부트스트랩하고 ApplicationContext인터페이스를 통해 의존객체를 가져와야 한다. 즉 스프링에서는 DI를 사용할 수 있으면 사용하고 그렇지 못한 경우라면 DL을 사용하면 된다.
의존성 풀 방식의 코드는 레지스트리에 대한 참조를 가지고 있어야 하고 레지스트리와 연동해서 의존성 객체를 가지고 와야 한다. 또한 CDL을 사용시 특정 인터페이스를 구현해야 하고 모든 의존성을 직접 가지고 와야 한다. 하지만 의존성 주입(Dependency Injection)을 사용하면 적절한 생성자, 메소드, 세터등을 통해 의존성을 주입 받기만 하면 된다.
오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  

댓글 없음:

댓글 쓰기