'DI 컨테이너'에 해당되는 글 3건

  1. 2008/03/04 Enterprise Library / Unity 로드맵 (3)
  2. 2008/02/22 Unity DI 컨테이너 2월 CTP 공개
  3. 2008/02/13 닷넷 DI Container 현황

마이크로소프트 본사 patterns & practices (P&P)팀이 Enterprise Library (EntLib)와 Unity Dependency Injection (DI) framework의 로드맵을 발표하였다. 현재 EntLib은 v4.0 개발이 진행중이며, Unity DI 컨테이너는 며칠 내에 정식 버전이 출시될 것으로 보인다.

  • 3월 15일 - Unity 1.0 출시
  • 3월 15일 - EntLib v4.0 CTP 출시, EntLib 기능 업그레이드이며 Unity와의 통합 버전은 아니다. DI 컨테이너로 사용되는 ObjectBuilder가 v1.0에서 v2.0으로 업그레이드되어 EntLib v4.0 CTP와 연동된다.
  • 4월 중순 이후 - EntLib v4.0 정식 출시
     

EntLib v4.0의 새로운 모습은 Codeplex의 EntLib 싸이트를 참고하시길 ...

 

업데이트 1
- Unity 1.0 정식 릴리스가 4월 7일로 연기됨

Posted by 장현춘
 DI (Dependency Injection)는 IoC (Inversion of Control), Hollywodd Principle과 거의 동의어로 사용되기도 하지만, 엄밀히 말하면 IoC 기능 가운데 Dependency를 해소시켜주는 기법을 일컫는 패턴이다. 닷넷에서 ASP.NET MVC 프레임웍을 올 상반기 중에 정식 출시할 예정인데, 이로써 기존 ASP.NET Page 방식이나 이를 기반으로한 Web Client Software Factory (WCSF) 이외에, 개발자가 사용할 수 있는 또 다른 개발 방식을 제공하게 된다. DI 컨테이너라고 칭해지는 것들은 이와 같은 프리젠테이션 구현 기법과 연동하여 비지니스 로직을 구현하는 과정에서 생성되는 객체들의 라이프사이클을 관리해주고 이들 사이의 Dependency를 IoC 방식으로 해결해주는 프레임웍을 의미한다. 이러한 DI 컨테이너들은 프리젠테이션 티어의 구현 방식과 상관없이 선택적으로 적용할 수 있으며 반드시 비지니스 티어에서만 사용되는 것이 아니고 애플리케이션의 전 티어에서 필요시 객체 라이프 사이클 관리를 맡길 수 있다.
 DI 컨테이너로는 이전 포스트에서 밝혔듯이, Windsor Container, StructureMap, Spring.NET, Object Builder가 있으며 오늘 소개할 Unity Container가 있다. Object Builder는 마이크로소프트의 P&P (Patterns & Practices) 팀에서 만든 것으로 현재 Enterprise Library, CAB (Composite Application Block), WCSF 등 마이크로소프트의 각종 Application Block 에 쓰이고 있다. 하지만, 애초 일반 개발자를 위해 만든 것이 아니고 이처럼 각종 Application Block 내부에서 사용하기 위해 만든 것이기 때문에 개발자를 위한 API가 정리되지 않았고 이를 이용하기 위해서는 너무 많은 클래스들을 알아야 하는 어려움이 있었다. 하여 P&P 팀에서는 Enterprise Library v4 개발 계획을 발표하면서 Object Builder 후속으로 새로운 DI Container를 제공하겠다고 밝힌 바 있으며, 이것에 대한 약속으로 약 열흘 전에 Unity Application Block 2월 CTP를 공개하였다. Unity에 대한 자세한 정보는 CodePlex (http://codeplex.com/unity) 에서 찾을 수 있다.
 Unity는 기본적으로 Object Builder를 기반으로 작성된 Lightweight한 DI 컨테이너로써, 사용 편의성 증대를 위해 DI 기능을 쉽게 익힐 수 있는 Attribute 기반으로 제공하고 있다. Injection 기법으로는 일반적으로 사용되는 Contructor Injection, Property Injection, Method call Injection을 모두 제공한다. 또한 복잡한 계층 구조로 된 객체들의 생성도 아주 간편하게 처리할 수 있고, dependency를 런타임시에 제공할 수도 있고 XML 파일을 통해 제공할 수 도 있다. 아울러 Unity 컨테이너 자체를 필요에 따라서는 클라이언트 모듈이 ASP.NET의 Session이나 Application 에 저장하여 재사용할 수도 있다.  자세한 설명이나 샘플 등은 CodePlex 참고하기 바란다.

사용자 삽입 이미지

Patterns & Practices

Posted by 장현춘

ASP.NET MVC 프레임웍의 출시와 더불어 함께 부각되고 있는 것이 IoC (Inversion of Control) 혹은 DI (Dependency Injection) 컨테이너이다. 마틴 파울러는 이 두 용어의 쓰임새를 분명히 하고자 패턴 이름으로 DI를 쓰자고 했으나 여전히 시장에서는 IoC, DI, Hollywood Principle 등을 거의 같은 의미로 사용하고 있다. 
현재 ASP.NET과 연동하여 비지니스 티어에 사용할 수 있는 DI Container로 주로 언급되는 것들로는 StructureMap, Windsor Container, Spring.NET, ObjectBuilder 등이 있다.

StructureMap은 Jeremy D. Miller가 만들고 유지보수호가 있으며, 닷넷 DI 컨테이너 가운데 가장 오래된 것이며 가장 널리 사용되고 있다.

ObjectBuilder는 Enterprise Library (EntLib) 2.0 부터 도입되기 시작하여 EntLib를 구성하는 각종 App Block들의 Factory 역할을 하는 DI 컨테이너이다. 다만, EntLib를 염두해두고 만들어졌기 때문에 외부 개발자가 애플리케이션 개발에 활용하기에 적합한 API 등을 갖추고 있지는 않았고 불편하다. 이점 때문에 많은 개발자들이 이의 개선을 요구하였고 마침내, ObjectBuilder를 대신할 새로운 Lightweight한 DI 컨테이너의 개발 계획이 발표되었다. EntLib v4 개발의 일환으로 발표되었지만, EntLib와는 함께 배포도 하고 혹은 DI 컨테이너 별도로 배포하여 다른 용도로의 활용을 쉽도록 하였으며 아울러 EntLib v4도 다른 DI 컨테이너와 사용될 수 있도록 할 예정이다. 자세한 사항은 아래 싸이트를 참조하길...
Enterprise Library v4 개발

Spring.NET은 자바 진영에서의 성공에 힘입어 닷넷으로 포팅된 DI 컨테이너이다. Spring.NET은 Spring.Java와 마찬가지로 핵심이 되는 DI 기능이외의 모든 모듈은 쉽게 빼고 넣을 수 있어서 개발자가 원하는 부분만을 취할 수 있다. 아울러 대부분의 모듈은 이미 시장에서 그 품질이 인정된 다른 프레임웍이나 기술을 그대로 활용할 수 있도록 일종의 Wrapper와 같은 모듈만을 제공함으로써, 개발자가 갖고 있는 다른 프레임웍이나 기술에 대한 경험을 그대로 활용할 수 있는 융통성을 제공하고 있다.  Spring.NET은 다음과 같은 모듈로 구성되어 있다.
Spring.Core : DI 기능을 구현하는 Factory이자 Registry와 같은 역할을 한다.
Spring.Aop : DI와 더불의 Spring의 핵심 기능으로 불리며 AOP (Aspect-oriencted Programming)을 제공한다.
Spring.Data : ADO.NET에 대한 wrapper 기능을 제공
Spring.Data.NHibernate : NHibernate를 사용할 수 있는 wrapper 기능을 제공
Spring.Web : ASP.NET을 사용할 때 Page에 대한 DI 기능까지 제공한다.
Spring.Web.Extensions : 웹 서비스를 자바스크립트에서 접근할 수 있도록 해주는 기능이나, WCF 3.5에서는 ASMX 웹 서비스나, WCF 서비스에 기본 기능으로 제공해주고 있기 때문에 그다지 사용할 필요가 없을 듯..
Spring.Services : 일반 닷넷 클래스 (PONO - Plain Old NET Object)에 대해 자동으로 proxy 등을 생성해줌으로써 ASMX 웹 서비스, Enterprise Services, .NET Remoting 이 가능해도록 하는 기능이나, WCF가 이미 제공하고 있다. 다른 점은 Spring.Services는 각종 proxy등을 통해 기존 기술을 사용할 수 있게 해주는 것이나, WCF는 새로운 방식으로 더 나은 성능을 제공한다는 점... 예전 기술을 사용하는 경우가 아니면, 별로 효용이 없을 듯.
Spring.Testing.NUnit : 단위 테스트 NUnit 사용하도록 하는 기능
전반적으로 Spring.NET은 .NET Framework 2.0 기반으로 작성되었으며, 자바와 달리 닷넷의 빠른 변화를 따라잡지 못하는 면이 있다.

Posted by 장현춘