Spring.NET2009.04.10 16:09

어떤이는 OOP가 발전되어서 AOP가 되었다 라고 하는데 맞을수도 있고 아닐수도 있다. 내 생각엔 오른손이 하는것을 왼손은 거들뿐!! OOP는 오른손, AOP는 왼손. ㅋㅋ 썰렁한가?

암튼.. 험...

Aspect 하기 좋은 기능중 하나가 DI인데 기존 방식이랑 다른점이 무었인지 코드로 직접 실행 해 보자.
어떻게 Coupling을 줄일 수 있는지...

우선 기존에 어떻게 클래스를 호출하는지 왜 Dependency가 강하게 결합이 되는지 기존 방식대로 해 보자.

VS를 열고 새프로젝트를 선택한 다음 이름이 oldClass라는 콘솔 응용 프로그램을 생성 하도록 하자.
아래와 같이 Person.vb 클래스를 하나 만들자


콘솔용이니깐, 모듈에서 시작하므로 Module1.vb 코드를 아래와 같이 입력하자.

코딩끝!

이제 F5를 과감하게 눌러 실행 해 보자. 아래와 같은 화면이 나타날것이다.

이것이 우리하 흔히 알고 사용하는 OOP 방식이다. 하지만, 코드상에서 Moonhyuk = new Person 이라고 부르는 순간 이미 Dependency 가 강하게 결합되어 버린다.

그럼 SPRING.NET으로 결합도를 낮춰 보자. spring.net 이 설치가 안되어 있으면 http://www.springframework.net 에서 받을수 있다.
새 항목 추가를 하여 응용 프로그램 구성 파일(app.config)를 추가 한다. 추가된 app.config의 내용을 아래와 같이 변경하자.



그리고 프로젝트 참조를 추가 해야 한다. SPRING.NET에서 핵심 영역과 DI 부분을 제공해 주는 Spring.Core.dll 을 추가 하자
일반적으로 설치 했다면 경로는 C:\Program Files\Spring.NET 1.2.0\bin\net\2.0\release 이다.

그리고, 종속성을 제거하기 위해 IPerson.vb 인터페이스를 하나 만든다.


Person 클래스가 인터페이스를 구현 하기 때문에 기존 코드를 아래와 같이 수정한다.


마지막으로 Module1.vb 를 수정한다.



실행해 보면 아래와 같은 화면이 잘 나타난다.


훌륭하지 않은가? 종속성을 제거 하면서, Person 클래스를 config 파일에 설정해 두고 주입시킨것이다.
실제로 컴파일 시점에서 컨텍스트가 로드 될때 이미 spring framework 에서는 <object id="person" type="oldClass.Person, oldClass"> 를 인스턴스화 시켜 버린다. 즉, Module1.vb 에서 생성시키는것이 아니라 SPRING.NET 에서 생성 시켜 두었다가 가져다 쓸 뿐이다.

SPRING.NET은 훌륭한 .NET Framework 을 거들뿐... ㅎㅎ
Posted by dotnetpower

댓글을 달아 주세요

  1. JJun

    정말 신기합니다... 연재하고 계시는 iBatis.Net과 Spring.Net에 관한 내용 재밌게 볼게요.

    2009.04.16 23:54 [ ADDR : EDIT/ DEL : REPLY ]

ASP.NET2009.04.08 19:09

ASP.NET MVC 의 하나의 요청에 대한 Life Cycle을 표현하면 아래와 같다.


기존 웹폼의 Page Controller에 비해서 ASP.NET MVC의 Front Controller 패턴은 요청 하나에 대해서 많은 일들을 한다.
Front Controller 패턴의 경우 요청을 중앙 집중식으로 하여 각각의 로직을 분산 시키는데 효과적이다. 이를 Facade Pattern 이라고도 하는데 Spring Framework 을 사용하기에 용이 하다.


다시말해서 Facade Pattern 으로 설계가 되면 DI(Dependency Injection)가 용이해 지기 때문이다.

위 ASP.NET MVC Life Cycle 에서 클라이언트의 ①요청에 대한 진입점을 Global.asax 에서 미리 정의한 라우팅 맵을 통해 요청이 해당 Controller로 처리된다. Controller는 클라이언트가 요청한 작업을 처리 하기 위해 Model 에서 데이터를 가공하여 다시 Controller로 가져온다.(이 부분은 메서드 호출이라고 생각하면 됨)
원하는 데이터를 가져와서(특정 요청을 처리한 후) System.Web.Mvc.ViewDataDictionary 에 실어서 View로 데이터를 전달한다.

자... 여기서 일반적인 ASP.NET MVC 에 대한 하나의 Life Cycle을 살펴봤는데, 실제 프로젝트를 생성 해 보면, 약간 아쉬운점이 보인다. 가장 처음 들르는곳 Global.asax의 RegisterRouters 메서드 이다.


코드를 보면 라우팅 규칙이 하드코딩 되어있다. 약간 안습(?)이다. 물론 Creativity를 겸비한 개발자는 이 부분을 XML로 config 설정을 할텐데... MVC 모델로 개발하는 이유가 유지보수에 용이한 모델이고 확장이 쉽고 등등.. 하지만 하드코딩되어 있다면 과감하게 외부로 빼는게 좋을듯 하다. 라우팅을 외부로 빼게 되면, 그 정의를 Spring에서 할 수 있고, 진입전에 DI를 쉽게 할 수 있다.

이처럼 라우팅 테이블의 단점을 스프링이 보완해 준다. 또하나...
만약에 어떠한 비즈니스 로직이 있다는 가정하에서 그 비즈니스 로직이 실행되기전 다른 작업, 또는 실행 후 다른작업이 추가가 되어야 할때 SPRING.NET 이 가지고 있는 AOP(Aspect Oriented Programming)의 Advice, Pointcut, Advisor를 통해 가능하다. 이게 바로 또하나의 선물이다.

MVC모델에 대해서 부족한 부분을 채워 주는것이 AOP이며 꼭 ASP.NET MVC 모델로 개발을 해야 할때는 SPRING.NET의 탑재를 심각하게 고민해 보아야 할 부분이다.
Posted by dotnetpower

댓글을 달아 주세요

Spring.NET2009.04.07 10:28

 


Spring.NET
엔터프라이즈 닷넷 환경을 위한 포괄적인 기반을 제공하는 프레임웍이다. Spring.NET 베이스 클래스 라이브러리를 테스트 빈번히 발생하는 복잡성을 쉽게 제거 있다.(Test Driven Development) 부분은 최근 발표한 ASP.NET MVC에서도 지원을 한다.

 

Spring.NET 자바 버전의 스프링 프레임웍을 기반으로 디자인 되었다, 실제 스프링 프레임웍을 사용하여 개발되는 엔터프라이즈 어플리케이션이 수천개가 넘는데 스프링 프레임웍을 도입하여 많은 이득을 보도 있다. 또한, Spring.NET 자바버전을 급하게 컨버젼한것은 아니고, 자바버전의 프레임웍을 닷넷 환경에 맞게 부분적으로 조금씩 컨버팅 하여 완성되었다.

 

스프링 프레임웍을 사용하여 세계적으로 많은 엔터프라이즈 솔루션이 많은 이득을 보았다고는 하지만, 단지 프레임웍을 사용하므로써 모든 것을 얻지는 못한다. 부분은 설계자, 혹은 개발자 몫이다.

 

엔터프라이즈 어플리케이션은 통상 여러 개의 물리적 티어로 나뉘어 구성된다, 기능적층(Model, View, Controller) ; 이는 실제로 논리적으로 나뉘는게 아니라 물리적으로 나눌때 효과가 있다.(, 대형 어플리케이션에 한해서 ^^;)

 

비즈니스계층을 담당하는 로직에서는 실제 데이터베이스 연동을 담당하는데, 어플리케이션 설계가 끝난상태에서 여러가지 오브젝트와의 협동, 또는 다른 개발자와의 연동을 해야하는데 이는 Spring.NET에서 제공하는 IoC/AOP 덕분에 문제될것이 없다.

 

닷넷 플랫폼은 아주 기초적인 클래스 조각들로 훌륭한 어플리케이션의 설계와 개발에 관한 많은 기능을 제공한다. 이는 닷넷 프레임웍 자체가 굉장히 훌륭한 프레임웍이라고 할수 있기 때문이다. 디자인 패턴에 분류된 어떠한 패턴도 적용 있고, 각각 서브 라이브러리들이 느슨한 결합도를 유지 하고 있기 때문이다. 이러한 훌륭한 프레임웍에 Spring.NET 사용하는것은 기존 객체지향적으로 설계된 어플리케이션이나 프레임웍에서 필요했지만 사용이 애매했던 부분… 예를 들어 닷넷 프레임웍에서는 사용자가 어플리케이션 제어를 못하고 프레임웍에 제어권을 빼앗겨 버렸다. 닷넷 뿐만 아니라 자바와 같은 객체지향 언어들이 가지고 있는 공통 고민이다. Spring.NET 에서 제공하는 IoC(Inversion of Control) 이나 DI(Dependency Injection) 으로 해결을 할수 있다. 이에 대한 자세한 내용은 마틴 파울러의 Inversion of Control Containers and the Dependency Injection pattern 찾아보기 바란다.

Spring.NET은 수년간 자바 플랫폼 에서 많이 사용되어져 왔고, 수많은 어플리케이션에서 이미 기능이 입증된 프레임웍이다. 반드시 꼭 사용해 보길 바란다.

스프링프레임웍은 아래 다이어그램과 같이 IoC/AOP와 같은 특수 기능이 아닌 다른 많은 기능을 가지고 있다.


Posted by dotnetpower

댓글을 달아 주세요