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
Spring.NET2009.04.09 10:09
OOP(Object Oriented Programming)의 우수함과 유연성 덕분에 프로그래밍 언어는 대부분이 이와 같은 성격을 띄고 있다.
객체지향이 완벽할것이라 생각을 했지만, 어플리케이션의 덩치가 커질수록 어쩔수 없는 결합도(Coupling)가 생겨 버린다.
결합도 라는 말은 모듈들 사이의 관계를 말한다. 모듈이 독립적일수록 결합도가 낮다고 말할수 있고, 결합도가 낮을수록 좋은 프로그램 이라고 말한다. 느슨하게 결합된 디자인은 변경사항이 생겨도 큰 무리 없이 수정이 가능 해 진다.

하지만, 결합도 라는것은 아무리 느슨한 결합도(Loose Coupling)를 유지해도, 런타임시에 요청 -> 응답 까지는 연결될수 밖에 없다. 결합도를 조금이라도 낮추기 위해서 인터페이스를 사용하는데 이걸로도 해결되지 않는 문제가 있다.

DI는 보통 역제어(inversion of control) 이라는 이름으로 2004년 Martin Fowler에 한 논설에서 제어의 어떤 측면이 역전(invert)되는지 의문을 가지고 구체적으로는 종속객체를 획득하는 부분이 역전된다는 결론을 내리고 "종속객체 주입" 이라는 용어를 고안해 내었다고 한다. -Spring in Action 참고-


보통 위 그림처럼 ClassA는 ServiceA, ServiceB와 결합도를 유지 하게 된다.

이렇게 설계가 되었을때 다음과 같은 상황이 발생되어진다.
  • 관계가 변경되거나 수정되어야 할때 반드시 소스코드를 수정해야한다.
  • 컴파일 될때 관계가 겹합되어 버린다.
  • 단위 모듈별 테스트를 하기 어렵다.
  • 클래스 들이 반복적으로 생성되고, 재 배치된다.


그렇다면 DI를 사용하면 어떻게 결합도를 낮출수 있을까?
이에 대해 해결할수 있는 방법은 객체를 주입 시켜 버리면 된다. 아래 그림 참고.


우선 Builder라는것은 컴파일 되는 시점이라 생각하면 될것 같다.
컴파일 될때 ClassA를 생성시키고, ClassA는 ServiceA, ServiceB 의 인스턴스를 생성하는 것이 아니라  생성시점에서 Builder로 부터 주입되어진다. 그리고 나서 사용 할때는 Service들의 인터페이스를 통새 주입되어진 Service들을 사용 할 수 있다. 이것이 바로 역제어(inversion of control) 라 한다.

보통 Dependency Injection 를 위해서는 다음과 같은 방법이 존재 한다.

  • 생성자를 이용한 의존성 삽입(Constructor Injection)
  • Setter() 메소드를 이용한 의존성 삽입(Setter Injection)
  • 초기화 인터페이스를 이용한 의존성 삽입(Interface Injection)



참고

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by dotnetpower
TAG DI
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

티스토리 툴바