개발 이야기/ORM2012. 4. 15. 12:40

동영상 참고 자료

l  [ORM Framework 동영상 강좌] 01. Entity Framework 들어가기

l  [ORM Framework 동영상 강좌] 02. Entity Framework 4.0 기능 살펴보기

l  [ORM Framework 동영상 강좌] 03. LINQ 알고가자

l  [ORM Framework 동영상 강좌] 04. Database-First VS Model-First

l  [ORM Framework 동영상 강좌] 05. Entity Framework Context

l  [ORM Framework 동영상 강좌] 06. Entity Framework - Entity CRUD

l  [ORM Framework 동영상 강좌] 07. Entity Framework - Entity Stored Procedure 활용(1)

l  [ORM Framework 동영상 강좌] 08. Entity Framework - Entity Stored Procedure 활용(2)

l  [ORM Framework 동영상 강좌] 09. Entity Framework – ASP.NET MVC(1)

l  [ORM Framework 동영상 강좌] 10. Entity Framework – ASP.NET MVC(2)

l  [ORM Framework 동영상 강좌] 11. Entity Framework – ASP.NET MVC(3)

l  [ORM Framework 동영상 강좌] 12. MyBatis.Net 들어가기

l  [ORM Framework 동영상 강좌] 13. MyBatis.NET 기본  환경 설정

l  [ORM Framework 동영상 강좌] 14. MyBatis.NET CRUD(1)

l  [ORM Framework 동영상 강좌] 15. MyBatis.NET CRUD(2)

l  [ORM Framework 동영상 강좌] 16. NHibernate 들어가기

l  [ORM Framework 동영상 강좌] 17. NHibernate xml 파일

l  [ORM Framework 동영상 강좌] 18. NHibernate 실전 - Object Relational Mapping

l  [ORM Framework 동영상 강좌] 19. NHibernate 실전 - CRUD(1)

l  [ORM Framework 동영상 강좌] 20. NHibernate 실전 - CRUD(2)






sqler에 올렸던 동영상을 공유합니다.


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:38

NHibernate 실전 - CRUD(2)

NHibernate CRUD 두번째 시간입니다이번에는 비지니스 로직을 부분을 어떻게 구현하는지 살펴보겠습니다. CRUD 기본만 잡고가면 그 외 확장기능은 충분히 개발 가능할 것을 확신하기에 기본에 중점을 두고 진행합니다.^^

 

조회 화면

조회하는 뷰페이지에 액션링크에 Shippers Id 키값을 설정해줍니다.

 

            @Html.ActionLink("Edit""Edit"new { id = item.ShipperID }) |

            @Html.ActionLink("Details""Details"new { id = item.ShipperID }) |

            @Html.ActionLink("Delete""Delete"new { id = item.ShipperID })

 

 

 

상세 화면

리스트에서 항목 클릭 시 이동되는 상세 화면을 구성해보겠습니다데이터의 키(id)값을 받아서 해당 데이터를 페이지에 출력하면 됩니다. Id를 인자로 받아서 ISession Get메서드를 사용하여 Shippers의 특정데이터를 조회합니다조회된 데이터는 뷰에 반환하여 페이지를 구성하게 됩니다.

 

        public ActionResult Details(int id)

        {

            ISession session = SessionProvider.Instance.GetSession();

            Shippers shipper = session.Get<Shippers>(id);

 

            return View(shipper);

        }

 

 

위의 Details 메서드가 구성되었다면 상세 뷰를 MVC 스캐폴링 옵션을 사용하여 페이지를 생성 해보겠습니다메서드에서 마우스 오른쪽을 클릭하여 뷰 추가를 선택하세요.

20_01.JPG

[그림 20-1] Controller 추가

 

화면에 매칭할 Model을 선택하고 스캐폴링 옵션에 Details로 선택합니다.

20_02.JPG

[그림 20-2] View 추가

 

추가를 하면 Detail이라는 뷰가 자동으로 생기며 뷰 코드를 보면 자동으로 데이터 상세 값이 출력되도록 구성된다실행 해보겠습니다.

20_03.JPG

[그림 20-3] 상세 화면

 

신규생성

뷰 구성은 위에 스캐폴링을 이용해서 생성해주시면 됩니다그 부분은 생략하고 실제 로직을 살펴보겠습니다데이터 추가하는 메서드입니다. Shippers 객체를 받아서 바로 처리합니다.

 

        [HttpPost]

        public ActionResult Create(Shippers shipper)

        {

            ISession session = SessionProvider.Instance.GetSession();

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Save(shipper);

                session.Flush();

                trans.Commit();

                return RedirectToAction("Index");

            }

            catch

            {

                trans.Rollback();

                return View();

            }

        }

 

 

NHibernate는 자체 Transaction 처리가 가능합니다. ITransaction 객체를 사용하시면 됩니다데이터를 수정하거나 추가삭제처럼 데이터 변경이 발생하는 경우는 데이터베이스와 동기화를 위해 ISession.Flush()를 반드시 호출해줘야 합니다.

 

 

수정

다음은 수정입니다신규생성과 마찬가지로 Shippers 객체를 인자로 받아옵니다. ISession의 Merge메서드를 통해서 데이터 수정이 처리됩니다.

 

        [HttpPost]

        public ActionResult Edit(Shippers shipper)

        {

            ISession session = SessionProvider.Instance.GetSession();

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Merge(shipper);

                session.Flush();

                trans.Commit();

            }

            catch

            {

                trans.Rollback();

            }

            return RedirectToAction("Index");

        }

 

 

 

삭제

마지막으로 데이터 삭제입니다. Shippers 테이블은 ShipperID Identity로 가지고 있기때문에 id를 인자로 받아와서 처리합니다.처리 후에 리스트화면으로 이동합니다데이터 삭제 시에는 ISession의 Delete 메서드를 이용합니다.

 

        public ActionResult Delete(int id)

        {

            ISession session = SessionProvider.Instance.GetSession();

            Shippers shipper = session.Get<Shippers>(id);

 

            ITransaction trans = null;

            try

            {

                trans = session.BeginTransaction();

                session.Delete(shipper);

                session.Flush();

                trans.Commit();

                return RedirectToAction("Index");

            }

            catch

            {

                trans.Rollback();

                return View();

            }

        }

 

 

실제로 화면 하나하나 캡처하면 내용이 길어져서 소스코드면 소개를 해드렸습니다소스를 첨부해드릴테니 받아서 한번씩 실행해보면 더 쉽게 이해되시리라 생각합니다. NHibernate는 견고하고 데이터 처리에 필요한 기본적인 기능들을 제공하고 있습니다. (트랜잭션 처리같은… ) Table과 Object의 매핑이라는 점이 핵심이라고 볼 수 있겠네요이렇게 잛게 기본적인 NHibernate 활용편을 살펴보았습니다읽어주셔서 감사합니다.^^

 

소스코드 : NHibernateDemo.zip



sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402666



Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:37

NHibernate 실전 - CRUD(1)

MyBatis.Net 경우 쿼리의 결과를 Object로 가져온다면 NHibernate는 데이터 테이블을 Object로 가져오기때문에 앞에서 살펴봤던Entity Framework처럼 이해하면 쉬울 듯합니다이번은 앞세션에 이어서 Object 매핑 데이터를 조회하는 부분을 살펴보겠습니다.

 

NHibernate's ISession

NHibernate ISession 객체를 사용하여 데이터 저장소로 부터 원하는 데이터를 가져오겠습니다. ISessionFactory로부터ISession을 얻을 수 있다.

다음 2개의 네임스페이스를 추가해주세요.

using NHibernate;

using NHibernate.Cfg;

 

SessionProvider.cs 입니다.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using NHibernate;

using NHibernate.Cfg;

 

namespace NHibernateDemo

{

    public class SessionProvider

    {

        private ISession _session;

        private ISessionFactory _sessionFac;

        private bool _reuseSession;

 

        #region Thread-safe Singleton

 

        public static SessionProvider Instance

        {

            get

            {

                return Nested.TheSingleton;

            }

        }

 

        private SessionProvider()

        {

            // Read the configuration

            Configuration cfg = new Configuration();

            cfg.AddAssembly("NHibernateDemo");

 

            _sessionFac = cfg.BuildSessionFactory();

            _reuseSession = false;

        }

 

        private class Nested

        {

            static Nested() { }

            internal static readonly SessionProvider

                TheSingleton = new SessionProvider();

        }

 

        #endregion

 

 

        /// <summary>

        /// Should the session be reused? If

        /// this property is false (default), a Session-Per-Request

        /// is applied.

        /// </summary>

        public bool ReuseSession

        {

            get

            {

                return _reuseSession;

            }

            set

            {

                _reuseSession = value;

            }

        }

 

        /// <summary>

        /// Get the current session. If the session is null,

        /// Open a new Session

        /// </summary>

        /// <returns>ISession-Object</returns>

        public ISession GetSession()

        {

            if (_session == null)

                _session = _sessionFac.OpenSession();

 

            return _session;

 

        }

 

        /// <summary>

        /// Close a Session, if the flag ReuseSession is false

        /// </summary>

        public void CloseSession()

        {

            if (_session != null)

            {

                if (!_reuseSession)

                {

                    _session.Close();

                    _session = null;

                }

            }

        }

    }

}

 

 

 

빌드 리소스 포함

매핑 Xml 파일은 빌드 시 리소스에 포함되어야 합니다다음과 같이 설정해주세요.

19_01.JPG

[그림 19-1] xml 속성 메뉴

 

Xml 파일 속성에서 Build Action에서 리소스 포함을 선택해주세요그럼 빌드시 매핑 xml파일이 자동으로 포함됩니다.

19_02.JPG

[그림 19-2] xml 속성

 

조회 화면

~~ 기다리고 기다리던 조회화면입니다이것을 하기 위해 우린 위!~~~~ 많은것들을 설정했나봅니다ㅋㅋㅋㅋ MVC 프로젝트임으로 Controller를 하나 추가하겠습니다기본적인 메서드들을 자동 추가하겠습니다.

19_03.JPG

[그림 19-3] Controller 추가

 

ShipperController 클래스에 다음 네임스페이스를 추가해주세요.

using NHibernate;

using NHibernate.Cfg;

using NHibernateDemo.Entities;

 

리스트를 조회하는 코드를 다음과 같이 작성합니다코드를 살펴보면 SessionProvider에서 ISession을 얻어와서 CreateCriteria 메서드를 통해서 기본 Shippers 객체를 반환합니다받아온 객체를 바로 뷰에 반환해줍니다.

 

        public ActionResult Index()

        {

            IList<Shippers> list = null;

            try

            {

                ISession session = SessionProvider.Instance.GetSession();

                NHibernate.ICriteria ctiq = session.CreateCriteria(typeof(Shippers));

                list = ctiq.List<Shippers>();

            }

            catch (Exception ex)

            {

                throw;

            }

 

            return View(list);

        }

 

 

Index 뷰를 생성해보겠습니다모델 클래스를 Shippers로 설정 해주셔야 합니다.

19_04.JPG

[그림 19-4] View 추가

 

뷰에서 자동으로 리스트 코드가 작성됩니다. Shippers 클래스가 리스트에 매칭되었습니다웹 페이지를 실행해보겠습니다.

19_05.JPG

[그림 19-5] 리스트 화면 출력

 

리스트가 주~~욱 출력이 되고 있습니다그 어느때보다 기쁘네요^^ 사실 xml때문에 삽질을 한터라 ㅋㅋㅋ 따라하시느라 정신이 없을 수도 있지만 핵심은 데이터베이스의 테이블과 클래스 매핑을 xml파일에 정의되고 NHibernate Session을 통해서 실제 데이터를 조회하거나 액션을 취하게 됩니다다음 세션에서는 이번에 이어서 수정삭제신규생성 하는 비지니스 로직을 확인해보겠습니다감사합니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402636


Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:37

NHibernate 실전 – Object Relational Mapping

벌써 18번째 세션을 진행하게 되었습니다. Entity Framework 4.0에서 MyBatis.Net 그리고 NHibernate까지 보통 ORM 프레임워크라고 불리는 것들에 대해서 살펴보았는데요이번에 알아볼 내용은 ORM!! NHibernate에서 말하는 Object Relational Mapping에 대해서 알아보겠습니다.

 

실전프로젝트 기본 구성

이번 세션부터 기본적인 사항들을 확인해서 실전으로 CRUD까지 작업을 해보겠습니다. MVC Razor 웹 프로젝트를 하나 생성해주세요. Entity Framework를 되새기면서 해주시면 됩니다.

18_01.JPG

[그림 18-1] 웹 프로젝트 추가

 

MVC 웹 프로젝트를 다음과 같이 구성하려합니다미리 참고해주세요.

18_02.JPG

[그림 18-2] 프로젝트 구성도

 

Web.config에 Database Connection 정보를 입력해주세요.

 

  <configSections>

    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>

  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

    <session-factory name="NHibernateDemo">

      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

      <property name="connection.connection_string">

        Data Source=JISEON-PC\JISEON2;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=P@ssw0rd;

      </property>

      <property name="adonet.batch_size">10</property>

      <property name="show_sql">true</property>

      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>

      <property name="use_outer_join">true</property>

      <property name="command_timeout">60</property>

      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

      <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

    </session-factory>

  </hibernate-configuration>

 

 

NHibernate 관련 DLL을 참조해주세요. NHibernate에서 다운받은 폴더에 있습니다.

l  NHibernate.dll

l  Iesi.Collections.dll

l  NHibernate.ByteCode.LinFu.dll

l LinFu.DynamicProxy.dll 

 

 

DataTable Object

NHibernate는 데이터 테이블을 기준으로 객체를 매핑합니다매핑은 xml파일에서 정의가 되어지며 앞세션에서 말했듯이<table>.hbn.xml으로 생성됩니다백마디 말보다 한번 보여드리는게 더 와닿지요~

Northwind 데이터베이스 Shippers 테이블 스키마입니다.

18_03.JPG

[그림 18-3] Shippers 테이블 구조

 

테이블 구조에 맞게 Shippers 클래스를 구성해보겠습니다.

18_04.JPG

[그림 18-4] Shippers 테이블 구조

 

Shippers 클래스입니다.

 

    public class Shippers

    {

        private int _shipperID;

        private string _companyName;

        private string _phone;

 

        public Shippers()

        {

        }

 

        public virtual int ShipperID

        {

            get { return _shipperID; }

            set { _shipperID = value; }

        }

 

        public virtual string CompanyName

        {

            get { return _companyName; }

            set { _companyName = value; }

        }

 

        public virtual string Phone

        {

            get { return _phone; }

            set { _phone = value; }

        }

    }

 

 

Database의 테이블과 객체 매핑을 해주는 아래 정의된 xml파일입니다파일명은 테이블명을 앞에두고 뒤에 hbn.xml로 설정하면 됩니다“Shippers.hbm.xml”

 

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo"assembly="NHibernateDemo">

 

  <class name="NHibernateDemo.Entities.Shippers" table="Shippers">

    <id name="ShipperID" column="ShipperID" type="Int32" unsaved-value="-1" access="field.camelcase-underscore">

      <generator class="identity" />

    </id>

    <property name="CompanyName" column="CompanyName" type="string" length="40" not-null="true"access="field.camelcase-underscore"/>

    <property name="Phone" column="Phone" type="string" length="24" access="field.camelcase-underscore"/>

 

  </class>

</hibernate-mapping>

 

 

 

Tip!

Visual Studio에 익숙한 여러분은 실제로 위에 xml파일들을 수동으로 설저아는게 결코 쉬운일은 아닐겁니다저 역시도 xml설정하는데 대소문자며 공백등으로 어려움이 있었고요 ㅋㅋㅋ NHibernate에서 다운받은 파일 중에 Required_Bins 폴더에 xsd 스키마 파일이 존재합니다.

 

Visual Studio 2010에서 XML 메뉴를 클릭합니다. Schemas.. 하위 메뉴를 클릭해서 위에서 봤던 스키마 파일을 추가하겠습니다.

18_05.JPG

[그림 18-5] XML 메뉴

 

2개 다 추가해주세요!

18_06.JPG

[그림 18-6] NHibernate에서 제공하는 스키마

 

로드된 xsd 파일을 인텔리센스에 적용합니다.

18_07.JPG 

[그림 18-7] XML Schemas

 

이제 xml 파일에서 문자를 입력하면 아래와 같이 인텔리센스 기능이 바로 사용됩니다. 후훗~

18_08.JPG 

[그림 18-8] XML Intellisense

 

이번 세션에서는 기본 프로젝트를 생성하고 Shippers 객체를 매핑해보았습니다다음 시간은 이 객체를 가져다 쓰는 방법에 대해서 알아보겠습니다끝까지 읽어주셔서 감사합니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402604

Posted by 사나에
개발 이야기/ORM2012. 4. 15. 12:36

NHibernate xml 파일

NHibernate ORM으로 XML에서 설정을 한다오늘은 NHibernate 프로젝트 관련하여 포함된 Config 파일 및 객체 정의하는xml파일들을 살펴보고자한다지난 세션에서 소개한 NHibernate 사이트에서 NH3.1.0 다운로드르 받으면 xml 파일 템플릿이 제공되고 있다.

 

Configuration_Templates

다운받은 파일의 \NHibernate-3.1.0.GA-bin\Configuration_Templates 폴더에 Database 설정 관련 xml이 존재한다.

17_01.jpg

[그림 17-1] Database 정의 xml

 

MSSQL.cfg.xml 파일을 열어보자. MS SQL Server 연결관련 정보가 설정되어 있다우리는 여기 정보를 프로젝트 app.config web.config에 정의하게 될 것이다.

<?xml version="1.0" encoding="utf-8"?>

<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >

             <session-factory name="NHibernate.Test">

                           <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

                           <property name="connection.connection_string">

                                        Server=(local);initial catalog=nhibernate;Integrated Security=SSPI

                           </property>

                           <property name="adonet.batch_size">10</property>

                           <property name="show_sql">false</property>

                           <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

                           <property name="use_outer_join">true</property>

                           <property name="command_timeout">60</property>

                           <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

                           <propertyname="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

             </session-factory>

</hibernate-configuration>   

 

 

<table>.hbm.xml 정의

NHibernate는 테이블 기준으로 매핑을 합니다하여 테이블마다 xml 파일이 존재한다고 보시면 됩니다샘플로 하나 살펴보겠습니다구조만 확인을 해주세요저희가 자주사용하는 Northwind 데이터베이스 Shippers 테이블을 정의해놓은 파일입니다.Shippers.hbm.xml 으로 파일이 생성됩니다클래스와 데이블간의 매핑을 시켜주는 역할입니다.

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo"assembly="NHibernateDemo">

  <class name="NHibernateDemo.Entities.Shippers" table="Shippers">

    <id name="ShipperID" column="ShipperID" type="Int32" unsaved-value="-1" access="field.camelcase-underscore">

      <generator class="identity" />

    </id>

    <property name="CompanyName" column="CompanyName" type="string" length="40" not-null="true"access="field.camelcase-underscore"/>

    <property name="Phone" column="Phone" type="string" length="24" access="field.camelcase-underscore"/>

 

  </class>

</hibernate-mapping>

 

 

Generators 요소

모든 generators는 NHibernate.Id.IIdentifierGenerator에서 구현됩니다.

l Increment : 다른 프로세스에서 데이터가 추가되지 않는 경우 유니크하게 사용되는 식별자로 클러스터에서는 사용을 금지합니다.

l Identity : DB2, MySQL, MS SQL Server 그리고 Sybase 데이터 베이스에서 지원하는 식별자 컬럼입니다.

l Sequence : DB2, PostgreSQL, Oracle 또는 Firebird의 generator에서 사용되는 순서입니다이 식별자는 Convert.ChangeType속성 타입을 사용하여 변환합니다.

l Hilo : hi/lo 알고리즘 사용으로 integral 타입의 식별자를 효과적으로 생성합니다. hi/lo 알고리즘은 특정 데이터베이스에서 고유 식별자를 생성하기도 합니다.

l Seqhilo : hi/lo 알고리즘을 사용하여 효과적인 integral 타입의 식별자를 생성하며 데이터베이스 순서가 명명됩니다.

l uuid.hex : System.Guid와 ToString 메서드로 문자열 타입의 식별자를 생성합니다문자열 길이는 구성 포맷에 따릅니다.

l uuid.string : 새로운 System.Guid가 문자열로 변환되는 byte[]으로 생성합니다.

l Guid : 새로운 System.Guid 식별자입니다.

l guid.comb : Jimmy Nilsson이 설명한(http://www.informit.com/articles/article.asp?p=25862) 새로운 System.Guid을 생성하는 알고리즘을 사용합니다.

l Native : 기본적인 데이터베이스의 기능에 따라 지정됩니다.

l Assigned : 응용프로그램에서 Save()이 호출되기 전에 객체 식별자를 지정합니다.

l Foreign : 다른 연관된 객체의 식별자를 사용합니다일반적으로 <one-to-one> 기본키가 사용됩니다.

 

NHibernate Type

Xml 파일 컬럼에 타입을 정의할 때 NHibernate Type으로 정의해야한다닷넷 타입과 데이터베이스 타입을 정리해놓은 것이다기본적으로 자주 사용되는 항목만 표시합니다더 자세한 항목은 NHibernate 가이드 문서에 제공되고 있습니다.

NHibernate Type

.NET Type

Database Type

AnsiChar

System.Char

Db - Type.AnsiStringFixedL ength - 1 char

Boolean

System.Boolean

DbType.Boolean

Byte

System.Byte

DbType.Byte

Char

System.Char

Db- Type.StringFixedLengt h - 1 char

DateTime

System.DateTime

DbType.DateTime – ignores the milliseconds

Decimal

System.Decimal

DbType.Decimal

Double

System.Double

DbType.Double

Guid

System.Guid

DbType.Guid

Int16

System.Int16

DbType.Int16

Int32

System.Int32

DbType.Int32

Int64

System.Int64

DbType.Int64

PersistentEnum

System.Enum

The DbType for the underlying value.

Single

System.Single

DbType.Single

Ticks

System.DateTime

DbType.Int64

TimeSpan

System.TimeSpan

DbType.Int64

NHibernate 경우 선수지식이 필요한 프레임워크입니다이번 세션에서는 기본적으로 알아둬야하는 사항을 몇가지 정리하였습니다작업을 하시다가 필요할때마다 참고하시면 좋을것 같습니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402212


Posted by 사나에