본문 바로가기
개발/NHibernate

Active Record 와 NHibernate 를 이용한 Web Project 만들기 기본

by 그저그런보통사람 2010. 11. 1.
Castle 프로젝트에서 관리하는 Active Record 와 NHibernate 는 ORM 프레임워크이다.
Active Recored 는 Active Record Pattern 을 따르는 프레임워크이며, Fluent NHibernate와 더불어 많이(?) 사용되는 ORM Mappding 도구지만 국내에는 아직 활성화되지 않거나 정보에 대한 노출이 적다.

그럼으로 혼자 맨땅에 헤딩하면서 해야한다. -_-;

NHibernate 프레임워크도 ORM 도구지만 약간 다르게 봐야 하는것이 Active Record( 이하 AR) 는 Nhibernate의 Built in 이라고 보면
된다. 즉, NHibernate의 xml mapping 방식을 클래스 기반 Attribute 로 가능하도록 하여 보다 직관적이고 xml 편집으로 인해 발생할 수
있는 오타나 잘못된 코드를 미연에 방지 할 수 있도록 제작된 도구이다.

자세한 역사나 기능은 스스로 구글링을 통해 확인하기로 하고 .... 이 두 도구를 이용하여 Web 프로젝트를 제작하기 위해선 다음의 단계
를 순서대로 이행하여야 한다.

1. AR를 다운받는다. (Hibernate 도 다운받는다.)
   Active Record Download
   NHibernate Download

2. 웹 프로젝트를 개설하고, Castle.ActiveRecord.dll 과 NHibernate.dll 참조 추가한다.
   (실제로 구동하기 위해서 Castle.Core.dll 과 Castle.Components.Validator.dll 도 요구될 수 있다.)
   지연 로딩을 위해서 개인적으로 NHibernate.ByteCode.Castle.dll 을 추가 참조하였다.

3. Web.Config 에 해당 어셈블리를 이용하기 위해 섹션을 등록하고, 해당 노드를 구현한다.

<configSections>
    <section name="activeRecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" />
  </configSections>
  
  <activeRecord isWeb="true">
    <config>
      <add key="connection.driver class" value="NHibernate.Driver.SqlClientDriver"/>
      <add key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/>
      <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
      <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
      <add key="connection.connection_string" value="Data Source=119.205.211.227;initial catalog=LearningManagementSystem;User Id=sa;Password=ilat71###"/>
    </config>
  </activeRecord>
   - web에서 사용하기 위해선 activeRecord 노드의 isWeb="true"를 반드시 설정해야한다.
  
4. Global.ascx 의 Application_Start() 메소드에 다음을 구현한다.
 Castle.ActiveRecord.Framework.IConfigurationSource source
                = System.Configuration.ConfigurationManager.GetSection("activeRecord"
                    as Castle.ActiveRecord.Framework.IConfigurationSource;

            Castle.ActiveRecord.ActiveRecordStarter.Initialize(typeof(LMSEngine.Models.Company).Assembly, source);


5. 비즈니스 오브젝트를 만들고, Active Record에서 제공하는 Mapping Attirubute를 지정한다.

[ActiveRecord("[companies]")]
    public class Company : ActiveRecordBase<Company>
    {
        [PrimaryKey(Column="CompanyId")]
        public string Id { getset; }

        [Property]
        public string CompanyName { getset; }

        [BelongsTo(Column="CompanyId")]
        public string CompanyGroup { getset; }

        [HasMany(typeof(Member),
                 Table = "[companies]"
                 Inverse = true
                 ColumnKey = "CompanyId"
                 Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
        public IList<Member> Members { getset; }
    }

나머진 다음에.....