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

NHibernate 들어가기

오픈소스 ORM 프레임워크에서 손에 꼽히는 Hibernate 프레임워크에 대해서 알아보려 합니다. NHibernate는 Hibernate 닷넷 버전으로 NHibernate 경우 다양한 DBMS를 지원함으로 많은 프로젝트에서 ORM 프레임워크로 활용 되고 있습니다.

 

NHibernate 소개

NHibernate 공식 사이트 http://nhforge.org

메인 화면에서 관련 파일을 다운로드 받을 수 있습니다. NHibernate 3.1.0까지 릴리즈 되었네요!

16_01.JPG

[그림 16-1] NHibernate 공식 사이트

 

NHibernate Overview

NHibernate는 매우 높은 수준의 아키텍처입니다응용프로그램과 NHibernate사이에 영속 객체(Persistent Objects) Entity Framework 4.0에서 추가된 영속성을 지원하기 위한 객체입니다객체와 데이터베이스 테이블 간의 매핑을 XML로 관리합니다.

16_02.jpg

[그림 16-2] NHibernate 아키텍처

 

좀 더 구체적으로 살펴보겠습니다.

16_03.jpg

[그림 16-3] NHibernate Layer

 

ISessionFactory (NHibernate.ISessionFactory)

threadsafe 캐시로 단일 데이터베이스를 사용하는 경우 컴파일된 매핑을 캐시하여 사용가능하면 ISessionIConnectionProvider의 클라이언트를 위한 factory입니다.

 

ISession (NHibernate.ISession)

ISession을 통해서 단일 스레드는 응용프로그램과 영속 저장소 사이에서 존재하게 됩니다. ADO.NET Connecttion을 랩핑하고ITransaction을 위한 factory로 보시면 됩니다.

 

Persistent Objects and Collections

영속성 상태나 비지니스 함수를 포함하는 단일 스레드 객체로 짧게 살아있는 객체를 담고 있다이는 세션이 닫히면 응용프로그램 레이어에서 분리되어 자유롭게 가능합니다.

 

Transient Objects and Collections

ISession과 관련되지않는 영속 클래스의 인스턴스를 말한다.

 

ITransaction (NHibernate.ITransaction)

선택사항이며 ADO.NET transaction 밑에서 사용됩니다. ISession는 몇몇 상황에서 ITransactions을 걸치게 됩니다.

 

IConnectionProvider (NHibernate.Connection.IConnectionProvider)

이 또한 선택사항이며 ADO.NET의 connection과 command를 위한 factory입니다응용프로그램에 노출되지않지만 개발자에 의해 확장 구현 가능합니다.

 

IDriver (NHibernate.Driver.IDriver)

선택사항이며 ADO.NET provider 사이에서 캡슐화 인터페이스를 제공합니다.

 

ITransactionFactory (NHibernate.Transaction.ITransactionFactory)

선택사항이며 ITransaction 인스턴스를 위한 factory입니다. IConnectionProvider와 마찬가지로 응용프로그램에 노출되지않지만 개발자에 의해 확장 구현 가능합니다.

 


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

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

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

MyBatis.NET CRUD(2)

MyBatis.NET Mapper를 이용한 조회를 앞세션에서 진행했습니다추가로 신규생성수정삭제를 진행해보겠습니다.

 

데이터 수정

Shippers.xml statement를 다음과 같이 정의해주세요. Shippers 테이블 업데이트 구문입니다.

 

<update id="UpdateShippers" parameterClass="Shippers">

        UPDATE [Shippers]

        SET CompanyName = #CompanyName#, Phone = #Phone#

        WHERE ShipperID = #ShipperID#

</update>

              

 

수정 버튼을 클릭했을때 Mapper클래스를 이용해서 Update메서드에 위에서 정의한 UpdateShippers ststement명을 작성해줍니다이렇게 되면 Mapper클래스는 ststement명을 찾아 해당 쿼리를 DB에 던지게 되죠~

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.ShipperID = 4;

                shipper.CompanyName = "SM Company";

                shipper.Phone = "(02)0000-4444";

                Mapper.Instance().Update("UpdateShippers", shipper);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

15_01.JPG

[그림 15-1] 수정 결과 화면

 

데이터 신규생성

데이터 신규생성 작업입니다. Shippers.xml insert statement를 작성해주시고요.

 

<insert id="InsertShippers" parameterClass="Shippers">

        INSERT INTO [Shippers](CompanyName, Phone)

        VALUES (#CompanyName#, #Phone#)

        <selectKey type="post" resultClass="int" property="ShipperID">

               select @@IDENTITY as value

        </selectKey>

</insert>

 

 

코드에서 다음과 같이 호출해주세요.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.CompanyName = "JS Company";

                shipper.Phone = "(02)1212-4444";

                object obj = Mapper.Instance().Insert("InsertShippers", shipper);

                MessageBox.Show(obj.ToString());

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

  15_02.JPG

[그림 15-2] 추가 후 결과 화면

 

데이터 삭제

마지막으로 데이터 삭제입니다. Shippers.xml에 delete statement가 필요하겠죠다음과 같이 작성해주세요.

 

<delete id="DeleteShippers" parameterClass="Shippers">

        DELETE FROM [Shippers]

        WHERE ShipperID = #ShipperID#

</delete>

 

 

코드는 다음과 같이 삭제메서드를 호출해주시면 됩니다유후~훗 그럼 실행해서 확인해볼까요?

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            try

            {

                Shippers shipper = new Shippers();

                shipper.ShipperID = 4;

                Mapper.Instance().Delete("DeleteShippers", shipper);

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

              

 

요청한 4번 항목이 사라졌네요^^ 끝까지 따라해주시느라 수고많으셨습니다.!!!!

15_03.JPG

[그림 15-3] 삭제 후 결과 화면

 

MyBatis.NET의 장점은?

ORM하면 대표적을 생각하는 프레임워크 중에 하나인 MyBatis.NET 실제로 작업을 해보니 xml파일을 핸들링하는 것과 중간에Mapper를 통해서 데이터 결과를 받아오는 등의 작업이 귀찮지않다고 한다면 거짓말 일 것이다그럼에도 불구하고 사랑을 받고 있는 MyBatis.NET의 장점은 무엇이 있을까요레거시 시스템 경우 기존 데이터베이스 연동을 해야하는 경우에 중간 매퍼를 통해서 처리함으로 관리 측면의 용이성이 있습니다또한 파일로 관리되기때문에 실제 로직 실행시에 파일을 읽어와서 처리하게 됩니다 그러기에 파일을 얼마든지 수정가능하겠죠?! 결국은 코드에 쿼리문이 작성되지않고 별도로 관리된다는 측면에서 많은 이점을 가질 수 있을듯합니다더 많은 장점은 여러분이 사용해보면서 느끼는 점을 같이 이야기 해볼 수 있으면 좋겠습니다.^^ 감사합니다.

소스코드 : EF4.14.zip 



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

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

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

MyBatis.NET CRUD(1)

MyBatis.NET의 아주 기본적인 작업에 대해서 살펴보려합니다.^^ 프로젝트를 생성하고 데이터를 조회하는데 객체 매핑을 어떻게 하는지 확인 하실 수 있습니다실전으로 고고!!!

 

프로젝트 생성

우선 간단한 CRUD를 확인하는 작업이기에 응용프로그램을 다음과 같이 디자인 해보겠습니다.

14_01.jpg

[그림 14-1] UI 구성

 

초기 작업

Data Mapper작업을 위해서 초기에 설정해줘야하는 작업들이 있습니다앞세션에서 관련된 파일들을 언급했었는데요해당 파일들이 어떤 역할들을 하는지 살펴보겠습니다. MyBatis.Net 사이트에서 다운 받은 파일 중에 IBatisNet.Common.dllIBatisNet.DataMapper.dll을 해당 프로젝트에 참조해주세요.

14_02.jpg

[그림 14-2] dll 참조

 

\IBatis.DataMapper.1.6.2.bin\Ibatis.DataMapper.1.6.2.bin 폴더에 아래  config 파일이 존재합니다프로젝트에 추가해주세요새로 만들어도 되지만 xml로 작성되기때문에 오류률을 줄이기위해 가져다 편집을 하는 방법을 선택하겠습니다.

14_03.JPG

[그림 14-3] config 파일 참조

 

여기까지 진행하셨다면 다음과 같이 프로젝트가 구성됩니다.

14_04.jpg

[그림 14-4] 프로젝트 구성

 

Config 파일 설정

providers.config 파일 내용을 확인하면 많은 DBMS Provider가 정의되어 있습니다저희가 사용하는 Provider는 “sqlServer2.0”입니다다른 Provider는 enabled="false해주시고  “sqlServer2.0”는 는 enabled="true" 설정해주세요.

<provider name="OleDb1.1"

          description="OleDb, provider V1.0.5000.0 in framework .NET V1.1"

          enabled="true"

          assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

    connectionClass="System.Data.OleDb.OleDbConnection"

          commandClass="System.Data.OleDb.OleDbCommand"

          parameterClass="System.Data.OleDb.OleDbParameter"

          parameterDbTypeClass="System.Data.OleDb.OleDbType"

          parameterDbTypeProperty="OleDbType"

          dataAdapterClass="System.Data.OleDb.OleDbDataAdapter"

          commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder"

          usePositionalParameters="true"

          useParameterPrefixInSql="false"

          useParameterPrefixInParameter="false"

          parameterPrefix=""

    allowMARS="false"   

    />

 

 

다음은 SqlMap.config 파일입니다데이터베이스 연결 영역에 다음과 같이 DB 연결설정을 해주세요수동으로 작업하고있자니 기존에 자동생성했던 기억에 서글퍼지네요 ㅠㅠ.

        <!-- Database connection information -->

        <database>

               <provider name="sqlServer2.0"/>

               <dataSource name="Northwind" connectionString="Data Source=JISEON;Initial Catalog=Northwind;Integrated Security=True;"/>

        </database>

 

 

데이터 조회

기본 설정이 마무리 되었으니 이제부터 데이터를 한번 조회해보겠습니다. MyBatis는 쿼리와 결과 데이터의 매퍼 역할을 하는 프레임워크입니다그래서 단순히 매퍼 역할만하게되는데요그 부분을 xml로 정의합니다. Northwind 데이터베이스에서 Shippers테이블을 조회할건데요프로젝트에 매퍼 역할을 하는 Shippers.xml 파일을 생성해주세요또한 응용프로그램에서 용이하게 사용하는 Shippers의 엔티티를 Shippers.cs로 구성해보겠습니다.

Shippers.cs는 다음과 같이 작성해주세요.

 

    public class Shippers

    {

        public int ShipperID { getset; }

        public string CompanyName { getset; }

        public string Phone { getset; }

    }

 

 

다음은 Shippers.xml 내용을 확인해보죠!! Select statement를 다음과 같이 작성해주면 됩니다.

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

 

<sqlMap namespace="EF4._14" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://ibatis.apache.org/mapping">

 

        <alias>

               <typeAlias alias="Shippers"  type="EF4._14.Shippers" />

        </alias>

 

       <statements>

             <select id="SelectShippers"  resultClass="Shippers">

                    select * from Shippers

             </select>

       </statements>

 

</sqlMap>

 

 

UI에 다음 네임스페이스를 추가해주시고요.

 

using IBatisNet.Common;

using IBatisNet.DataMapper;

 

 

조회 버튼을 클릭해서 데이터를 조회해보겠습니다. Mapper 객체를 통해서 데이터를 조회하여 결과값을 리턴합니다.

 

        private void btnSelect_Click(object sender, EventArgs e)

        {

            try

            {

                IList<Shippers> list = Mapper.Instance().QueryForList<Shippers>("SelectShippers"null);

                dataGridView1.DataSource = list;

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

 

 

조회된 화면입니다조회를 한번하기위해 긴여정을 걸쳤습니다그래도 MyBatis를 사용하는 장점이 뭔가 있겠죠?! 다음편에서 그 진실을 파헤져보겠습니다.

14_05.jpg

[그림 14-5] 조회 결과 화면

 

Tip!

-       배포시 Bin 폴더에 config 파일과 xml파일이 같이 반영되어야 합니다.



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

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



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

MyBatis.NET 기본 및 환경 설정

지난 세션에서 MyBatis.NET에 대해서 기본 그림을 확인 보았습니다아직 MyBatis라는 단어가 입에 붙지는 않네요ㅋㅋㅋiBatis라는 단어가 익숙해서 그런가봐요~ MyBatis.NET은 Data Mapper Framework로 실제 결과 데이터를 매핑해줍니다이번 세션은 기본 환경 설정하는 부분을 알아보겠습니다고고씽~~

 

MyBatis.NET

1.     프로그래밍 코드로부터 SQL 코드를 분리합니다.

2.     입력 파라메터를 라이브러리 클래스로 전달하고 출력을 합니다.

3.     비지니스 로직 클래스로부터 데이터 액세스 클래스를 분리합니다.

4.     자주 사용되는 데이터를 캐싱합니다.

5.     트랜잭션과 스레딩 관리가 가능합니다.

 

MyBatis.NET 관련 소스

MyBatis.NET 프로젝트 관련 DLL은 다음 링크에서 다운 받을 수 있습니다.

mybatis.net data mapper 다운로드

l Download the Data Mapper for .NET

mybatis.net data access framework 다운로드

l Download the Data Access Framework

 

 

프로젝트 참조 파일

1.      IBatisNet.Common.dll
DataAccess와 DataMapper 클래스에서 공유되는 공용 클래스들입니다.

 

2.      IBatisNet.DataMapper.dll
DataMapper 프레임워크로 실제 객체 매핑과 결과값 반환시 사용되는 객체들입니다.

 

3.      IBatisNet. DataAccess.dll
DataAccess 객체 프레임워크로 DAO 작업시 사용됩니다.

 

4.      providers.config

MyBatis에서 지원하는 Database Provider들을 정의 해놓은 파일입니다저희는 .NET에서 자주 사용되는 MS SQL Server를 사용하기에 sqlServer2.0” Provider를 사용하게 됩니다..

Provider

Provider Description

sqlServer1.0

Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0

sqlServer1.1

Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1

OleDb1.1

OleDb provider available with .NET Framework 1.1

Odbc1.1

Odbc provider available with .NET Framework 1.1

sqlServer2.0

Microsoft SQL Server 7.0/2000/2005 provider available with .NET Framework 2.0

OleDb2.0

OleDb provider available with .NET Framework 2.0

Odbc2.0

Odbc provider available with .NET Framework 2.0

oracle9.2

Oracle provider V9.2.0.401

oracle10.1

Oracle provider V10.1.0.301

oracleClient1.0

MS Oracle provider V1.0.5 available with .NET Framework 1.1

ByteFx

ByteFx MySQL provider V0.7.6.15073

MySql

MySQL provider V1.0.4.20163

SQLite3

SQLite.NET provider V0.21.1869.3794

Firebird1.7

Firebird SQL .NET provider V1.7.0.33200

PostgreSql0.7

Npgsql provider V0.7.0.0

iDb2.10

IBM DB2 iSeries provider V10.0.0.0

 

5.      SqlMap.config

DataMapper 설정 파일입니다해당 파일에는 연결 대상인 Database 기본 정보나 객체 매핑이 정의된 xml파일 링크 정보를 정의해주는 파일입니다. <sqlMaps> 요소 영역을 저희가 자주 편집하게 될겁니다.! 이것만 기억해주세요.
13_01.jpg

[그림13-1] sqlMap.confog sqlMaps 요소

 

MyBatis.NET DLL형태로 제공되기 때문에 환경 설정하는데 어려움이 없습니다프로젝트 실전을 통해서 작업을 해보시면 생각보다 진입하기가 쉽다는 것을 느낄 수 있습니다다음 세션에 작업할 때 위에서 언급된 항목들이 사용 될 겁니다. XML에서 작업이 이뤄지기때문에 헷갈릴수도 있지만 오늘 언급한 항목들에 대한 인지만 가지고 있으면 쉽게 따라 올 수 있다는거~~~ 잊지마세요!


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

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

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

MyBatis.Net 들어가기

이번 세션은 주제는 오픈소스에 대표주자 iBatis입니다자바진영에서는 이미 많은 프로젝트에서 iBatis를 사용하고 있습니다닷넷진영에서도 오픈소스를 프로젝트에 사용하려는 노력이 많이 보입니다
오픈 소스인 iBatis가 최근에 구글 코드(http://code.google.com)로 옮기면서 MyBatis로 명칭을 변경하였네요. MyBatis.Net은 저희가 알고 있는 iBatis입니다.

 

MyBatis.NET 소개

MyBatis.NET은 저희가 알고 있는 ibatis .NET버전으로 Data Mapper 프레임워크입니다최근에 구글 코드로 소스를 옮기면서mybatis로 명칭을 변경하였네요
Mybatis 
사이트 http://www.mybatis.org 입니다.

 

MyBatis.NET은 객체 지향 응용프로그램과 관계형 데이터베이스에서 데이터 매퍼를 쉽게 제공함으로 응용프로그램에서 코드량을 줄이고 xml을 쿼리를 작성함으로 관리 측면에서 용이성을 제공하고 있습니다. MyBatis.NET은 흔히 ORM이라고 생각하지만 결코ORM은 아니라고 합니다테이블 하나하나 객체화하는게 아닌 쿼리(SQL)를 매핑하여 데이터 결과를 반환하게 되기때문에 Data Mapper Framework라고 불립니다객체지향언어의 대표적인 JAVA .NET을 지원하고 있습니다
MyBatis.NET
의 구성도는 다음과 같습니다.

flow.png

[그림 12-1] MyBatis.NET

 

myBatis는 쿼리(SQL)을 매핑함으로 데이터베이스와 객체 사이에 제약이 따르지않는다는 점에서도 굉장한 메리트를 가지고 있다고 볼 수 있습니다.

 

MyBatis.NET 관련 소스

myBatis.net 관련된 소스링크입니다다음 세션부터 실전에 들어가기 전에 다운받아 주세염^^

.NET Google Code Project: http://code.google.com/p/mybatisnet/

mybatis.net data mapper 다운로드

l  Download the Data Mapper for .NET

l  Download the Data Mapper User Guide (English)

 

mybatis.net data access framework 다운로드

l  Download the Data Access Framework

l  Download the Data Access Framework User Guide (English)


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

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


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

Entity Framework – ASP.NET MVC(3)

ASP.NET MVC 세번째 이야기앞에서 목록만 출력하는것을 살펴보았습니다어떤가요굉장히 뭔가 간단하고 재미있지않나요이렇게 엔티티가 바로 바인딩되는 것을 보고 Enterprise 환경에서는 어떨지몰라도 개인적으로 사이트를 만들때 많은 작업들이 간소화되면서 빨리 그리고 가볍게 사이트를 구성할 수 있을듯한 느낌을 받았습니다앞 세션에 이어 이번에는 비지니스 로직 영역과 프로세스를 구체적으로 살펴보겠습니다.

 

List 화면

Shippers 데이터가 목록에 바인딩된 것을 확인 할 수 있습니다코드를 한번 살펴보죠~

11_01.JPG

[그림 11-1] 리스트 화면

 

“NorthwindEntities” 컨텍스트의 Shippers 엔티티를 View에 반환하는 것을 확인 할 수 있습니다화면에서는 뷰 객체를 받아서 처리하여 목록을 출력하고 있습니다구문이 많이 익숙하지 않나요앞에서 저희가 엔티티 작업에 대해서 다뤘던 구문과 거의 비슷합니다.

 

        private NorthwindEntities db = new NorthwindEntities();

 

        public ViewResult Index()

        {

            return View(db.Shippers.ToList());

        }

   

 

 

상세 화면

리스트에서 항목을 클릭하면 상세 화면이 다음과 같이 구성됩니다.

11_02.JPG

[그림 11-2] 상세 화면

 

코드를 보면 인자로 id값을 받고 있습니다유니크한 ShipperID의 값인데요컨트롤러에서는 id값에 해당하는 데이터를 뷰에 반환하고 있습니다뷰에서는 반환된 데이터를 위 화면처럼 뿌려주고 있습니다.

 

        public ViewResult Details(int id)

        {

            Shippers shippers = db.Shippers.Single(s => s.ShipperID == id);

            return View(shippers);

        }

 

 

 

수정 화면

다음은 수정 화면입니다실제로 데이터 변경이 발생하게 되는데요잊지않으셨죠?????

11_03.JPG

[그림 11-3] 수정 화면

데이터가 변경되거나 삭제 등 비지니스 로직이 추가 될 경우에는 SaveChanges 메서드를 꼭 호출해야 데이터베이스에 반영된다는 사실을~~~~ 수정하는 코드도 많이 익숙하군요^^

 

        [HttpPost]

        public ActionResult Edit(Shippers shippers)

        {

            if (ModelState.IsValid)

            {

                db.Shippers.Attach(shippers);

                db.ObjectStateManager.ChangeObjectState(shippers,EntityState.Modified);

                db.SaveChanges();

                return RedirectToAction("Index");

            }

            return View(shippers);

        }

 

 

 

신규생성 화면

다음은 데이터를 생성하는 화면입니다. ShipperID는 자동생성이기에 입력이 안되고 CompanyName Phone값만 입력을 하면됩니다.

11_04.JPG

[그림 11-4] 신규생성 화면

 

코드를 보면 좀 다른것을 확인 할 수 있습니다항목들을 인자로 받는게 아니라 Shippers 객체 자체를 인자로 받고 있습니다그게 가능한 이유는 뷰의 코드를 확인하면 궁금증이 풀립니다.

 

        [HttpPost]

        public ActionResult Create(Shippers shippers)

        {

            if (ModelState.IsValid)

            {

                db.Shippers.AddObject(shippers);

                db.SaveChanges();

                return RedirectToAction("Index"); 

            }

 

            return View(shippers);

        }

       

 

뷰를 구성할때 모델의 객체를 설정해줬습니다하여 바로 뷰에서 Shippers 객체를 인자로 넘겨 줄 수 있었던 것입니다만약 뷰에 모델을 할당하지않는다면 항목을들 하나하나 넘겨서 컨트롤러에서 다시 Shippers 객체에 할당해주는 코드를 작성해야겠지요하지만 그렇게 작업할 이유가 없겠죠??!!! 바로 모델 객체를 뷰와 컨트롤러 사이의 매개변수로 사용이 가능하니깐요!!!

 

        <div class="editor-label">

            @Html.LabelFor(model => model.CompanyName)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.CompanyName)

            @Html.ValidationMessageFor(model => model.CompanyName)

        </div>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Phone)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Phone)

            @Html.ValidationMessageFor(model => model.Phone)

        </div>

       

 

 

삭제 화면

마지막으로 삭제화면입니다리스트에서 삭제 링크를 클릭하면 확인을 한번 더 진행합니다이는 프로세스를 어떻게 구성하느냐에 따라 달라집니다우선 스캐폴링 옵션을 이용한 CRUD 화면을 구성하면 기본으로 구성되는 프로세스입니다.

11_05.JPG

[그림 11-5] 삭제 확인 화면

 코드는 다음과 같습니다이또한 SaveChanges를 최종적으로 호출하고 있습니다.

 

        [HttpPostActionName("Delete")]

        public ActionResult DeleteConfirmed(int id)

        {           

            Shippers shippers = db.Shippers.Single(s => s.ShipperID == id);

            db.Shippers.DeleteObject(shippers);

            db.SaveChanges();

            return RedirectToAction("Index");

        }

 

 

어떤가요웹에서 필요한 기본적인 작업을 확인해보았습니다쉽죠?! MVC JQuery를 활용한다면 더 세련되고 화려한 웹페이지 구성을 할 수 있습니다. ASP.NET MVC JQuery는 각자 파트에서 더 상세히 공부하실 수 있습니다이렇게 해서 대작~ Entity Framework – ASP.NET MVC 세션 막을 내립니다감사합니다.



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

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

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

Entity Framework – ASP.NET MVC(2)

ASP.NET MVC 두번째 이야기저희가 가져온 엔티티를 화면에 구성하는 작업을 진행하겠습니다. MVC를 다뤄보신 분도 계시겠지만 처음 접하는 분을 위해 최대한 쉽게 설명드리겠습니다.

 

ASP.NET MVC Razor

첫 화면을 기억하시나요?

10_01.JPG

[그림 10-1] Razor 기본 구성 화면

 

첫화면 설정은 Global.asax 페이지에서 설정하게 됩니다.

controller명과 action명을 지정하면 “http://localhost:49999/Home/Index”처럼 URL이 구성됩니다.

 

        public static void RegisterRoutes(RouteCollection routes)

        {

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

            routes.MapRoute(

                "Default"// 경로 이름

                "{controller}/{action}/{id}"// 매개 변수가 있는 URL

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 매개 변수 기본값

            );

        }

   

 

Controllers 폴더에서 컨트롤러를 추가해보겠습니다다음 화면처럼 메뉴를 클릭해주세요.

10_02.JPG

[그림 10-2] 컨트롤러 추가 메뉴

 

컨트롤러명을 작성하고 스캐폴링 옵션에 다음과 같이 설정해주세요모델 클래스는 저희가 추가한 “Shippers”를 지정하면 됩니다.데이터 컨텍스트 클래스는 역시 저희가 생성한 “NorthwindEntitys”를 지정합니다.

10_03.JPG

[그림 10-3] 컨트롤러 추가

 

고급 옵션에서 레이아웃을 설정해주시면 메인화면 레이아웃을 그대로 구성된 페이지를 만날 수 있습니다^^

10_04.JPG

[그림 10-4] 고급 옵션 설정

 

생성하면 ShipperController 클래스에 많은 메서드들이 자동으로 생성된것을 보실 수 있습니다또한 스캐폴링 옵션으로/Views/Shipper 폴더에 View 페이지가 자동으로 생성된것을 확인 할 수 있습니다.

10_05.JPG

[그림 10-5] 뷰 구성

 

참고로!!! 자동생성하지 않고 뷰를 추가하고 싶다면 컨트롤러에서 생성하려는 메서드에 마우스를 클릭해서 View(화면)을 생성해주면 됩니다.

10_06.JPG

[그림 10-6] 뷰 추가 메뉴

 

여기까지 잘 따라오셨죠공통 레이아웃에서 “Shipper”의 뷰로 가는 링크를 추가해보겠습니다.

10_07.JPG

[그림 10-7] 레이아웃 페이지

 

메뉴 영역에 샘플 링크를 다음과 같이 추가해주세요.

 

            <div id="menucontainer">

                <ul id="menu">

                    <li>@Html.ActionLink("""Index""Home")</li>

                    <li>@Html.ActionLink("정보""About""Home")</li>

                    <li>@Html.ActionLink("샘플""Index""Shipper")</li>

                </ul>

            </div>

            

 

F5를 클릭해서 실행해보겠습니다저희가 추가한 샘플 링크를 클릭하면 다음과 같이 “Shippers” 데이터가 목록을 출력되는 것을 확인 할 수 있습니다완전 간단하고 신기하네요^^

10_08.JPG

[그림 10-8] 샘플 리스트 화면

 

작성하다보니 내용은 그렇게 많지않는데 그림때문에 내용이 길어지네요이번 세션에서는 모델-컨트롤러-뷰에 대해서 생성하여 실행하는 것을 간단히 확인해보았습니다그렇다면 비지니스 로직(데이터 처리)들은 어떻게 작업을 하게 되는지 다음 세션에서 확인 해보겠습니다감사합니다.^^



sqler에 아티클 작성 했던것을 공유합니다.
출처 : http://www.sqler.com/401125


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

Entity Framework – ASP.NET MVC(1)

아키텍처 레이어를 나눠보면 Entity Framework Data Access Logic Business Logic 영역에서 역할을 해주고 있는데요소프트웨어 개발 시 어떻게 기준을 잡는가에 따라서 달라질 수 있을듯합니다오늘 알아 볼 내용은 ASP.NET MVC3를 이용해서 User Presentation영역과 Entity Framework 상호 관계에 대해서 알아보려 합니다

 

09_01.jpg

[그림 9-1] 레이어 구성

 

ASP.NET MVC3

올해 초 ASP.NET MVC3가 정식으로 릴리즈되었습니다. MVC는 익히 아시다시피 Model-View-Controller 패턴으로 각각의 영역이 나눠서 독립적으로 작업이 수행되며 서로간의 관계를 통해서 상호보완적으로 구성되는 설계 방법론이라고 볼 수 있습니다. MVC에 대해서는 ASP.NET 파트에서 상세히 설명이 되고 있기에 간략히 언급만 하겠습니다. ^^

09_02.jpg

[그림 9-2] MVC 패턴

 

ASP.NET MVC 3 RTM 다운로드 URL

http://www.microsoft.com/download/en/details.aspx?id=4211

ASP.NET MVC 3 RTM Tools Update

http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=82cbd599-d29a-43e3-b78b-0f863d22811a&displaylang=ko

 

 

프로젝트 생성 및 구성

ASP.NET MVC With Razor로 웹 프로젝트를 생성합니다새 프로젝트에서 다음 항목을 선택해주세요.

09_03.jpg

[그림 9-3] ASP.NET MVC 웹 프로젝트 추가

 

MVC3 Razor 엔진을 제공하고 있습니다. Razor로 작업을 할 경우 보다 빠른 생산성을 보여줍니다개인적인 생각으론 웹페이지가 가벼워지는 느낌도 있습니다ㅋㅋ

09_04.jpg

[그림 9-4] Razor 선택

 

웹 프로젝트를 생성하였다면 F5를 눌러서 실행을 해보겠습니다기본적으로 구성된 레이아웃에 필수 기능들을 탑제(?)된 화면을 보실 수 있습니다저희가 여기에 추가 기능을 구현하게 됩니다요~

09_05.jpg

[그림 9-5] MVC 기본 레이아웃 화면

 

첫번째 작업은 Entity를 추가해줘야겠죠?! 여기는 Entity Framework에 대한 세션이니깐요~

09_06.jpg

[그림 9-6] ADO.NET 엔티티 데이터 모델 항목 추가

 

계속적으로 반복되는 “Northwind” 데이터베이스를 연결해주세요참고로 Northsind pubs 기본 데이터베이스는 다음URL에서 다운 가능합니다.

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23654

09_07.jpg

[그림 9-7] DBMS 연결

 

개체는 “Shippers”테이블만 선택해주세요.

09_08.jpg

[그림 9-8] 엔티티 선택

 

추가를 다하셨다면 프로젝트는 다음과 같이 구성이 될거예요맞게 나오셨나요??

09_09.jpg

[그림 9-9] 프로젝트 구성

 

이제 프로젝트 구성이 완료되었습니다환경이 셋팅이 안되신 분들은 설정하느라 시간을 좀 투자하셨을듯 합니다이번 세션은 환경설정 및 프로젝트 구성하는것으로 마무리하겠습니다이어서 다음 세션으로 고고고~

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

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



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

Entity Framework - Entity Stored Procedure 활용(2)

Entity Framework에서 Stored Procedure를 다루는 방법에 대해서 앞 세션에서 다뤘는데 또 다른 방법이 있어 추가로 소개하고자 합니다. Visual Studio의 막강한 기능으로 대부분이 자동생성됩니다이번 시간도 아주 간단한 작업만으로 Entity Stored Procedure 다룰 수 있습니다떠나보자구용~~

 

Stored Procedure

앞 세션에서 사용한 프로시져를 그대로 사용하겠습니다.

08_01.jpg

[그림 8-1] 프로시져 목록

 

Stored Procedure Entity 업데이트

EDM 프로시져를 가져오겠습니다. “update Model from Database…”메뉴를 클릭해주세요.

08_02.jpg

[그림 8-2] 모델 업데이트

 

추가할 해당 프로시져를 선택해주세요.

08_03.jpg

[그림 8-3] Stored Procedure 추가

 

기본적으로 엔티티 매핑 개체 추가 후 모델 브라우저를 보면 다음과 같이 트리가 구성됩니다.

08_04.jpg

[그림 8-4] 모델 브라우저 트리

 

가지고 온 프로시져를 엔티티의 함수로 가져오는 작업을 추가 해줘야합니다프로시져에서 다음과 같이 “Add Function Import…”메뉴를 선택합니다.

08_05.jpg

[그림 8-5] 모델 브라우저 트리 메뉴

 

함수 가져오는것은 스로시져에 함수명만 지정해주면 해당 함수명으로 자동으로 매핑이 됩니다..

08_06.jpg

[그림 8-6] 함수 가져오기 설정

 

3개 모두 함수 가져오기하면 엔티티의 함수 목록에 다음과 같이 출력됩니다이제 프로시져 가져오는 작업이 완료되었습니다.

08_07.jpg

[그림 8-7] 모델 브라우저 트리 – 함수 가져오기

 

Entity 생성(Insert)

추가했던 함수명이 컨텍스트에서 메서드로 제공된다제공된 메서드에 맞춰 파라메터를 넣어주면 됩니다.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_INSERT("SM Company""(031)123-1234");

                MessageBox.Show("record inserted");

            }

        }

 

 

SQL Profiler에서 확인하면 Shippers_INSERT” 프로시져가 호출되어 데이터가 추가된 것을 확인 할 수 있습니다.

08_08.jpg

[그림 8-8] SQL Profiler 데이터 추가


Entity 수정(Update)

수정하는 “Shippers_UPDATE” 메서드를 호출하여 엔티티 수정을 합니다.

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_UPDATE(2, "United Package_Modify""(503) 555-3190");

                MessageBox.Show("record updated");

            }

        }

 

 

SQL Profiler에서 확인하면 Shippers_UPDATE” 프로시져가 호출되고 있는것을 확인 할 수 있습니다.

08_09.jpg

[그림 8-9] SQL Profiler 데이터 수정

 

Entity 삭제(Delete)

“Shippers_DELETE” 메서드를 호출하여 데이터 삭제를 합니다.

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                context.Shippers_DELETE(10);

                MessageBox.Show("record deleted");

            }

        }

 

 

10으로 파라메터를 할당한 Shippers_DELETE” 프로시져가 호출되고 있습니다.

08_10.jpg

[그림 8-10] SQL Profiler 데이터 삭제

 

프로시져를 함수로 가져와서 메서드형태로 사용하는 것을 확인해보았습니다앞 세션에서 다룬것은 테이블 기준으로 프로시져를 활용하는 것이 었습니다테이블 기준이 아닌 프로시져를 사용할 경우는 이렇게 함수로 가져와서 작업을 하는게 편할 수도 있을것 같네요감사합니다.

소스 코드 : EF4.08.zip


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

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


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

Entity Framework - Entity Stored Procedure 활용(1)

앞 세션에서 Entity Framework의 Entity CRUD 작업에 대해서 알아보았습니다앞 세션에서 엔티티 작업은 실제로 Ad-Hoc Query를 사용합니다이번에는 Stored Procedure를 사용하여 데이터 작업하는 것을 확인해보겠습니다.

 

기본 Stored Procedure 생성

이번 내용을 확인해보기 위해 필요한 프로시져 스크립트입니다Northwind 데이터베이스에 생성해주세요~

USE Northwind

 

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Description:     신규생성

-- =============================================

CREATE PROCEDURE Shippers_INSERT

       @CompanyName nvarchar(40),

       @Phone nvarchar(24)

AS

BEGIN

       SET NOCOUNT ON;

      

       INSERT INTO [Northwind].[dbo].[Shippers]

           ([CompanyName],[Phone])

     VALUES

           (@CompanyName, @Phone)

 

END

GO

 

 

-- =============================================

-- Description:     수정

-- =============================================

CREATE PROCEDURE Shippers_UPDATE

       @ShipperID INT,

       @CompanyName nvarchar(40),

       @Phone nvarchar(24)

AS

BEGIN

       SET NOCOUNT ON;

      

       UPDATE [Northwind].[dbo].[Shippers]

       SET [CompanyName] = @CompanyName, [Phone] = @Phone

       WHERE ShipperID = @ShipperID

      

END

GO

 

 

-- =============================================

-- Description:     삭제

-- =============================================

CREATE PROCEDURE Shippers_DELETE

       @ShipperID INT

AS

BEGIN

       SET NOCOUNT ON;

      

       DELETE FROM [Northwind].[dbo].[Shippers]

       WHERE ShipperID = @ShipperID

      

END

GO

 

 

 

Stored Procedure Entity 업데이트

EDM 프로시져를 가져오겠습니다. “update Model from Database…”메뉴를 클릭해주세요.

07_01.jpg

[그림 7-1] 모델 업데이트

 

앞에서 생성한 프로시져를 선택해주세요.

07_02.jpg

[그림 7-2] Stored Procedure 추가

 

프로시져를 가져왔다면 엔티티 매핑 작업을 진행해주세요. EDM에서 매핑 상세에서 “Shippers” 엔티티의 프로시져 항목을 클릭하면 다음과 같은 화면이 나옵니다. Insert, Update, Delete에 맞는 프로시져를 맞춰서 설정해주면 자동으로 매핑이 됩니다.

 07_03.jpg

[그림 7-3] 엔티티 매핑

 

믿기지않겠지만,,, 다 끝났습니다.^^

 

Entity 생성(Insert)

소스 코드를 보면 아시겠지만 앞 세션에서 다룬 엔티티 생성 코드와 동일합니다.

 

        private void btnInsert_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                Shippers shipper = new Shippers();

                shipper.CompanyName = "test 11";

                shipper.Phone = "(02)123-1234";

                context.Shippers.AddObject(shipper);

                context.SaveChanges();

                MessageBox.Show("record inserted");

            }

        }

   

 

SQL Profiler에서 확인하면 Shippers_INSERT” 프로시져가 호출되어 데이터가 추가된 것을 확인 할 수 있습니다.

07_04.jpg

[그림 7-4] SQL Profiler 데이터 추가


Entity 수정(Update)

엔티티 데이터 수정도 마찬가지입니다특정 항목에 대해서 데이터를 수정하고 SaveChange메서드를 호출하여 최종적으로 데이터베이스에 반영하는 액션을 취합니다.

 

        private void btnUpdate_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            { 

                var per = context.Shippers.Where(p => p.ShipperID == 7).First();

                per.CompanyName = "JYP Company 77";

                per.Phone = "(02)123-1234";

                context.SaveChanges();

                MessageBox.Show("record updated");

            }

        }

   

 

SQL Profiler에서 확인해보죠. “Shippers_UPDATE” 프로시져가 호출되고 있네요.

07_05.jpg

[그림 7-5] SQL Profiler 데이터 수정

 

Entity 삭제(Delete)

데이터 삭제하는 부분도 확인해보겠습니다.

 

        private void btnDelete_Click(object sender, EventArgs e)

        {

            using (var context = new NorthwindEntities())

            {

                var shipper = context.Shippers.Where(p => p.ShipperID == 9).First();

                context.DeleteObject(shipper);

                context.SaveChanges();

 

                MessageBox.Show("record deleted");

            }

        }

   

 

역시 Shippers_DELETE” 프로시져가 호출되고 있습니다.^^

07_06.jpg

[그림 7-6] SQL Profiler 데이터 삭제

 

이번에 알아본것은 간단히 요약하자만 특정 엔티티 기준에서 데이터 작업을 할 경우 Stored Procedure를 사용하는 것을 확인해봤습니다현업에서는 Stored Procedure를 활용을 많이 하기때문에 알아두시면 유용하게 사용될거라 생각됩니다 ㅋㅋ 이번 세션은 여기까지읽어주셔서 감사합니다. (_._)꾸벅

소스 코드 : EF4.07.zip

 

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

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


Posted by 사나에