프레임웍 기반 개발을 위해 시장에서 입증된 프레임웍을 근간으로 프로젝트에서 사용할 수 있는 틀을 제공하는 Sharp Architecture가 최신 버전 v1.9.5를 공개했다. 이번 버전에서는 다음과 같은 점이 눈에 띈다.
1. ASP.NET MVC 3 RTM 기반으로 업그레이드 되었으며,
2.
.NET Framework 4 기반으로 구성되었고,
3. System.Web.Mvc.IDependencyResolver 구현하고 있다.

1.9.5 버전에서는 ASP.NET MVC + Nhibernate 기반으로 솔루션이 구성되어 있으며, DI 컨테이너로 Castle Windsor 제공하고 있다. 또한 IDependencyResolver 구현 클래스로 WindsorDependencyResolver 제공하고 있으나 IDependencyResolver 결함때문에 IDependencyResolver 통해 Windsor 컨테이너를 사용하는 것이 바람직하지 않아서 패키지에 함께 제공은 하되 솔루션으로 엮지는 않은 하다. 압축을 풀면 아래와 같은 디렉토리 구조를 있다.
 

Sharp Architecture 홈페이지 바로가기
Sharp Architecture 관련 문서 (wiki 싸이트인데, 얼마전 OSS Install Fair에서 진행한 ScrewTurn Wiki근간으로 운영되고 있다.)

Posted by 장현춘

지난 시간에는 프레임웍 기반 개발이란 어떤 의미가 있으며 이때 사용할 수 있는 범용 개발 프레임웍은 어떤 것들이 시장에 나와 있는지에 대해 살펴보았다.

Framework-based Development – 개념
Framework-based Development – 적용
Framework-based Development – 종류
Framework-based Development - 오픈 소스 적용 사례

이번 시간에는 주제를 좁혀서 범용 개발 프레임웍 중에서 닷넷 개발자 생태계 내에서 성장하고 발전해가는 오픈 소스 프레임웍의 적용 사례를 살펴보고자 한다. 오픈 소스 프레임웍들을 실제 적용하여 비지니스를 하고 있는 사례들을 살펴봄으로해서 닷넷 개발자 생태계의 건강성을 확인하고 닷넷 오픈 소스 프레임웍의 현재와 미래를 가늠해보는 시간이 되었으면 한다.

대부분의 SI 업체들은 SI 프로젝트에서 공통적으로 사용할 표준 개발 프레임웍이라는 것을 가지고 있는데, 대부분 오픈 소스 기반의 범용 프레임웍들을 조합하여 기본적인 기능을 제공하고 이를 기반으로 자사가 가지고 있는 도메인 특화된 노하우를 올리거나 일반 범용 프로임웍이 제공하지 못하는 모니터링이나 툴 최적화 기능 등을 묶어 제공하는 경우가 일반적이다. 아래 그림에서 보듯이 범용 프레임웍들의 조합을 통해 시장에서 입증된 QoS (품질요소)를 제공하고 그 기반위에 고객에게 전달할 가치를 부가적으로 제공하게 된다. 고객에게 전달할 가치가 범용 프레임웍만으로 끝난다면, 이것만 가지고 고객에게 어필(별도의 비용 청구 등)할 수 없을 것이다. 혹은 특정 회사가 개발하여 제공하는 프레임웍이라는 것이 시장의 범용 프레임웍들의 조합만으로도 제공할 수 있는 가치를 전달한다면 고객에게 외면 받을 것은 자명하다.

국내외를 막론하고 기업이 오픈 소스 기반의 프레임웍을 사용한 경우 일반적으로 그 사실을 외부에 알리는 것을 꺼려하는 경우가 있다. 이런 이유로 Spring.NET의 해외 적용 사례를 보더라도 유럽의 굴지의 온라인 여행사라든가, 어떤 도메인의 유명한 기업 정도만 밝히는 경우가 허다하다. 국내에도 마찬가지여서 외부로 드러나는 적용사례는 극히 드물다. 오늘 소개할 사례를 이전 DevDays 2008과 Open & Interop Day에서 적용 사례 발표를 했던 기업들이다.

아래는 이랜드 시스템의 표준 개발 프레임웍에 적용되어 있는 오픈 소스 프레임웍에 대한 내용이며, 황용호 팀장께서 발표하신 슬라이드에서 가져왔다. 이랜드 시스템의 Formular#은 Spring.NET + NHibernate의 조합을 통해 기본 기능을 제공하고 비지니스 특성상 북경 개발 센터와의 원활한 협업을 위해 사용되는 툴들에 대한 add-on 모듈이라든지, 테스팅 자동화와 같은 기능을 제공하고 있다.

예스24에서는 iBATIS.net을 현재 운영 중인 쇼핑몰에 적용한 사례를 최만석 팀장께서 발표하였으며 아래는 그 일부이다.

SK C&C에서는 개발 프레임웍인 NEXCORE.NET에 적용된 오픈 소스 프레임웍에 대해 설명을 하셨으며 아래는 이진우 대리께서 발표한 자료에서 발췌했다. NEXCORE.NET은 ASP.NET MVC + Spring.NET + iBATIS.NET 혹은 Entity Framework 등으로 구성되어 있으며 Visual Studio에 통합된 자동화가 인상 깊은 프레임웍이다.

위에서 언급된 세가지 사례는 발표 자료와 함께 동영상 자료가 DevDays 2008에 게시되어 있으므로 좀 더 상세한 내용을 원하시는 분은 DevDays 2008 싸이트를 참고하시길...

그 밖에도 국내 또 다른 SI 업체의 개발 프레임웍에 ASP.NET MVC가 사용되고 있으며, 닷넷 솔루션 파트너사의 일부 솔루션에도 NHibernate가 사용되고 있음을 확인할 수 있었다.

마지막으로, 오픈 소스 프레임웍들을 적용하여 사업을 할 경우에 이들에 강제하고 있는 라이선스 정책에 대해서도 관심을 가질 필요가 있다. 오픈 소스는 곧 무료이기에 내 맘대로 가져다 고쳐 쓰면 되지..라는 잘못된 생각에 빠져 마냥 가져다 쓰다가 저작권 위반으로 소송으로 가는 경우가 심심찮게 보고되고 있다. 위에서 언급된 것들 중 가장 많이 사용되는 프레임웍의 라이선스 정책을 보면, Spring.NET과 iBATIS.NET이 Apache License 2.0을 채택하고 있으며, NHibernate가 LGPL을 채택하고 있다. 즉, 이것들 모두 상용 제품 만드는데 사용할 수 있으나 NHibernate가 채택한 LGPL의 경우에는 좀  더 엄격하여, 가져다가 소스를 수정했으면 NHibernate 관련 부분의 소스를 공개하여야 하는 제약이 있다. 물론 이 보다 더 엄격하여 GPL의 경우, 오픈 소스 소프트웨어를 가져다 쓰면, 이와 링크 형태로 엮일 지라도 메모리 상의 영역을 함께 쓰는 모든 소프트웨어의 소스 코드 전부를 공개해야하며 상용 소프트웨어와의 결합을 금지하고 있다. 다만, 이 경우에도 배포만 하지 않고 웹 싸이트에서 서비스 형태로 제공된다면 설령 GPL일 지라도 공개할 의무는 없다.

각종 오픈 소스 소프트웨어의 라이선스 정책에 대한 간단한 설명과 비교자료를 원하시는 분은 예전 정통부와 컴퓨터프로그램보호위원회가 함께 펴 낸 오픈 소스 SW 라이선스 가이드를 참고하시길...

아울러 알려지지 않았지만, 시장에서 오픈 소스 프레임웍을 적용하여 프로젝트가 진행되었거나 진행되고 있는 곳이 있다면 가능한 선에서 그 정보를 댓글이나 메일을 통해 공유하여, 오픈 소스를 적용하고자하나 용기가 없어 주저하고 계신 분들께 힘을 실어주시길....

Posted by 장현춘

Sharp Architecture는 ASP.NET MVC와 NHibernate를 이용하여 유지보수가 용이하고 견고한 웹 애플리케이션을 위한 뼈대를 제공해주는 일종의 reference architecture라 할 수 있다. Sharp Architecture가 어떠한 구조로 ASP.NET MVC와 NHibernate를 엮고 있는지 살펴보면서, 만든 이 Billy McCafferty가 어떤 아이디어로 이를 제안했는지, 혹은 내가 만약 향후에 다른 프레임웍의 조합을 통해 프로젝트를 진행할 경우 활용할 수 있는 프랙티스는 없는지 알아보기로 하자.

1. Sharp Architecture

그림에서 보듯이 Sharp Architecture (#arch)는 두 개의 애플리케이션 한 개의 워드 문서로 구성되어 있다.

- ProjectBase Project : #arch의 기본이 되는 기능 제공하는 기반 구조
- NorthWindMvc Project : ProjectBase 기반의 일종의 샘플 애플리케이션
- Base_Architecture_and_Development_Guidelines.doc : 설치 및 개발을 위한 가이드 문서로 구성되어 있다.

NorthwindMvc에서 ProjectBase를 referece 참조해서 개발된 것이며, 여기에 새로운 기능을 어떻게 TDD (Test-driven Development) 기반하에 개발할 수 있는지 차근차근 설명한 문서가 위에 언급한 워드 문서이다.
 

2. ProjectBase

ProjectBase는 크게 세 개의 서브 프로젝트로 구성된다.

2.1 ProjectBase.Core : 엔티티 객체 및 프레임웍 기본 기능 구현
   * ConcreteTypeAttribute.cs : IoC (Inversion of Control) 기능을 제공하며 #arch 0.6.x 버전까지 있었던 Spring.NET이 #arch 0.7.x 버전부터 빠지면서 IoC를 #arch 내에서 자체 구현하기 위해 제공하는 Attribute이다. 실제 사용법은 ProjectBase.Web의 ControllerFactory.cs에서 설명하기로 한다.
   * DesignByContract.cs : design by contract 방법론에 근거하여 코드를 작성하도록 이를 강제하기위해 조건 체크하는 로직을 제공한다.
   * IDao.cs : DAO 패턴을 따라서 data access 로직을 작성할 경우 공통적인 로직을 추상화시켜 담고 있는 최상위 인터페이스이며, Load(), Save(), Delete() 등 기본적인 CRUD에 관련된 메소드를 선언하고 있다. DAO 패턴의 인터페이스 역할을 하는 IDao를 왜 ProjectBase.Core에 넣은 이유는 마틴 파울러가 정리해 놓은 Separated Interface 패턴을 참조하면 좋을 듯 하다. 이유는 DAO 패턴을 구현한 ProjectBase.Data와 엔티티들에 관여하는 ProjectBase.Core 사이의 의존성을 해소하기 위해서 ProjectBase.Data의 DAO에 대한 인터페이스를 따로 분리하여 ProjectBase.Core에 넣음으로 인해 ProjectBase.Data에 대한 직접적인 의존성을 해소하고 있다. (의존성 해소가 목적이라면 분리한 인터페이스를 꼭 ProjectBase.Core에 넣어야 했을까... ) IDao 인터페이스는 ProjectBase.Data에 있는 GenericDao 클래스가 구현하고 있다. 내가 작성할 DAO를 MyCustomerDao라고 가정했을 때 이들 사이의 관계는 아래와 같습니다. 점선은 인터페이스 구현을, 실선은 클래스간 상속을 의미합니다. 
    * PersistentObject.cs : 엔티티 객체들은 모두 PersistentObject를 상속받아 작성한다. PersistentObject에는 모든 엔티티들이 대부분 사용하게되는 ID, Equals(), GetHashCode() 등이 구현되어 있다.

2.2 ProjectBase.Data : DAO 패턴과 NHibernate 세션 관리
   * GenericDao.cs : IDao 인터페이스를 구현하고 있는 base class로서 내부적으로는 NHibernate의 Session을 이용하여 데이터베이스 작업을 진행한다. 그림에서 보듯이 개발자가 작성하는 모든 Dao 클래스 구현의 기본 뼈대를 제공한다.
   * NHibernateSession.cs : NHibernate를 쉽게 사용할 수 있도록 하는 일종의 Utility 클래스로서 내부적으로 NHibernate SessionFactory와 Session 사용한다. 
  * DaoTests.cs : Dao 클래스의 단위 테스트를 위한 Helper 클래스로서 모든 Dao 클래스의 단위 테스트 클래스들은 DaoTests 클래스를 상속 받아 작성한다. DaoTests 클래스는 내부적으로 위에서 언급한 NHibernateSession 클래스를 이용하여 NHibernate Session이 제공하는 Transaction 기능을 사용한다. NUnit 단위 테스트의 [Setup] 과 [TearDown] 속성을 제공하여 Dao의 단위 테스트 시 초기 세팅과 테스트 후 리소스 정리 등을 제공하며 NHibernate의 트랜잭션 롤백 기능과 맞물려 단위 테스트 끝난 후에 데이터베이스를 롤백 시켜 테스트 이전 상태로 되돌리는 기능을 제공한다. 또한 NUnit의 Category Attribute에 "DB Test"를 추가하여 NUnit이 일괄적으로 테스트 케이스를 실행할 때 이 부류의 테스트는 DB 테스트임을 알려주어 단위 테스트시 제외하도록 하여 데이터베이스 관련 부가 작업으로 인한 전체적인 단위 테스트 소요 시간을 절약할 수 있다.

2.3 ProjectBase.Web : 웹 일반적인 기능 확장 및 ASP.NET MVC Controller Factory 제공
   * WebSessionStorage.cs : HttpContext에 NHibernate Session을 저장하여 이를 통해 세션 관리해주는 기능을 제공한다.
   * TransactionAttribute.cs : ASP.NET MVC의 Controller action method에서 사용할 수 있는 Action Filter로 작성하여 NHibernate 트랜잭션을 선언만으로 적용할 수 있도록 제공되는 Attribute
   * ControllerFactory.cs : ASP.NET MVC가 기본적으로 제공한는 DafaultControllerFactory를 상속받아 작성된 커스텀 Controller Factory로써, 예전에 Spring.NET이 제공했던 IoC 기능을 ProjectBase.Core의 ConcreteTypeAttribute의 도움을 받아 직접 구현하고 있다. 방식은 원시적일 정도로 심플하다. 모든 Controller 구현시 생성자에 IDao 타입의 파라메터를 받도록 하여 전달되어 지는 IDao 타입의 인터페이스를 검사하여 여기에 Attribute으로 명시되어 있는 ConcreteType을 조사한다. 이 같은 방식으로 생성하여야 할 구체적인 Dao 클래스를 알아낸다. 또한 생성해야할 Controller 클래스는 전달되어지는 controllerType을 통해 알 수 있다. 아래는 ControllerFactory 소스 코드의 일부로써 IoC가 행해지는 부분이다.

Sharp Architecture의 근간이 되는 세 개 서브 프로젝트의 구성 요소와 이들의 역할을 간단히 살펴보았다. 시장에 나와 있는 ASP.NET MVC와 NHibernate라는 잘 만들어진 프레임웍들의 조합이기에 구조 자체는 간단하며 이 두 프레임웍을 효과적으로 엮는 부분이 코드의 주된 내용이다.

다음 시간에는 ProjectBase를 이용하여 구현된 샘플 애플리케이션인 NorthwindMvc의 구조에 대해 간단히 살펴보기로 하자.

Posted by 장현춘

Sharp Architecture

프레임웍 2008.06.05 14:57

마이크로소프트가 운영하는 오픈 소스 프로젝트를 위한 호스팅 싸이트인 CodePlex(http://www.codeplex.com)에 지난 5월 16일자로 S#arp Architecture라는 프로젝트가 올라왔다. CodePlex에서 호스팅되는 프로젝트들은 오픈 프로젝트 형태로 개발자들간의 자유로운 의사소통을 통해 가장 바람직한 소프트웨어를 만들어내는 방향으로 진행되고 있으며, S#arp Architecture도 현재 다양한 사람들로부터 피드백을 받으며 나아가고 있다.

S#arp Architecture는 시장에서 가장 많이 선호되는 오픈 소스 프레임웍들을 조합하여 빠르고 견고하게 웹 애플리케이션을 만들 수 있는 프레임웍들의 조합이다. 여기에 포함되는 프레임웍들로는 ASP.NET MVC Preview 2 + Spring.NET 1.1.1 + NHibernate 1.2 등이다. 국내 닷넷 환경에서도 프레임웍 기반 개발 방식에 대한 관심이 고조되고 있으며, 특히 오픈 소스 프레임웍의 활용에 대한 문의가 부쩍 늘고 있는 상황에서 이에 부응이라도 하듯이 S#arp Architecture가 나타났다. S#arp Architecture는 가장 현실성있는 프레임웍의 조합을 나타내는 하나의 예일 뿐이며, 시장의 다양한 요구에 맞는 다양한 조합은 얼마든지 가능하다. 국내 개발자들을 만나본 결과 오픈 소스에 대해 관심을 넘어 실제 프로젝트에 적용하고자 자문 및 테스트를 진행하는 경우가 점차 늘고 있다.

한국마이크로소프트에서도 프레임웍 기반 개발을 활성화시키기 위해 각종 세미나를 진행해왔으며, 개발자들 사이에 이러한 논의가 활성화될 수 있도록, 또한 필요한 개발자들이 쉽게 접하고 학습할 수 있도록 컨텐츠 개발을 위해 노력중이며 조만간 온/오프라인을 통해 함께 할 수 있는 방안을 제시할 예정이다.

codeplex_logo

Posted by 장현춘