티스토리 뷰

반응형
1. iBATIS.NET의 인스톨과 환경 설정

야마다 요시히로 (http://www.wings.msn.to/) | 2005/10/10 


  지난 1 회에서는 O/R매핑 및 O/R매핑 툴의 개요에 대해 설명하고, .NET전용의 대표적인 O/R매핑 툴인「NHibernate」를 소개했다.

 O/R 매핑 툴을 사용하면, (C# 이나 VB.NET의) 오브젝트와 데이터베이스 상의 테이블을 매핑할 수 있다. 이것에 의해, 어플리케이션에서는 오브젝트의 속성에 액세스하기만 하면, 직감적으로 테이블상의 각 필드에 액세스할 수 있게 된다는 것이다.

 지난 회의 서두에서 나타낸 것처럼, .NET 환경에서 이용 가능한 O/R 매핑 툴은 이미 얼마든지 제공되고 있다. 이번에는 NHibernate와 나란히 .NET 전용의 대표적인 O/R매핑 툴인「iBATIS.NET」에 대해 해설하면서, 실제로 그것을 이용한 ASP.NET의 웹 어플리케이션을 작성해 나간다.

iBATIS.NET

 지난회에서 삺펴 본 것처럼, NHibernate는 SQL 퀘리를 자동 생성하기 때문에, 어플리케이션이 연구 최종 단계의 데이터베이스에 의존하기 어렵고, 원래 개발자가 SQL를 의식하지 않아도 되는 장점이 있다.

 그러나 한편으로, SQL 퀘리에 의한 개발에 정통한 개발자에게 있어서는, 코드가 장황해져 버리기 쉽고, 섬세한 퍼포먼스 튜닝을 실시하기 어렵다는 단점이 있는 것도 사실이다. 만약 그러한 단점을 장점 이상으로 강하게 느끼고 있다면, iBATIS.NET이라고 하는 선택 사항을 검토해도 좋을 것이다.

 iBATIS.NET는 Apache Foundation 에서 제공되고 있는 오픈 소스의 O/R매핑 체제이다 *. 이 iBATIS.NET이 NHibernate와 크게 다른 것은 SQL 퀘리를 개발자 자신이 기술하는 타입의 O/R매핑 툴이라는 점이다.

 iBATIS.NET에서는 SQL 퀘리를 외부 파일화 할 뿐이라서, NHibernate 등에 비해 간편하게 이용할 수 있고, 섬세한 퍼포먼스 튜닝도 실시하기 쉽고, 코드에서 SQL 퀘리를 분리하므로 코드를 보기 쉽다는 등의 장점이 있다. 물론, SQL을 의식해야 하고, 사용하고 있는 SQL문에 따라서는 연구 최종 단계의 데이터베이스 제품에 의존할 가능성이 있는 등의 단점도 있긴 하지만, 양자의 장점/단점을 이해하고, 잘 구분하여 사용하길 바란다.

 그러면 즉시, iBATIS.NET을 이용한 데이터베이스 액세스의 순서를 살펴 보자.

* iBATIS.NET 는 정확하게는 O/R매핑 기능을 주관하는「SQL Maps」과 DI(Dependency Injection) 기능을 주관하는「DAO Framework」라고 하는 2가지의 기능으로 구성되는 체제(라이브러리)이다. 본문에서는 이 iBATIS.NET의 SQL Maps 기능에 대해서만 언급하기로 하고, 이후에도 iBATIS.NET라고 했을 경우 SQL Maps를 가리킨다.

iBATIS.NET의 인스톨과 환경 설정

 지난 회의 NHibernate와 같이 iBATIS.NET를 이용하려면, 미리 필요한 파일의 배치와 설정 파일의 정의를 끝마쳐 둘 필요가 있다. 구체적인 샘플 웹 어플리케이션을 살펴 보기 전에, 우선은 iBATIS.NET의 동작에 필요한 환경 설정을 완료해 두자.

[1]iBATIS.NET의 이용에 필요한 파일을 배치한다

 iBATIS.NET를 이용하는데 있어서, 우선 이하의 사이트에서 필요한 파일을 다운로드해야 한다. 본문에서는 집필 시점에서의 최신 버젼인 1.2.1을 예로 채택하지만, iBATIS.NET는 매일매일 업데이트하고 있다. 그때그때의 최신판을 이용하길 바란다.

 다운로드한 파일(본문의 예에서는 DataMapper-bin-1.2.1. zip)의 압축을 풀면, 몇 개의 파일이 전개될 것이다. 여기에서는 다운로드 파일에 포함되는 모든「.dll」파일을 어플리케이션 루트 아래의「bin」폴더에 카피한다.

 또, providers.config를 어플리케이션 루트의 아래에 복사해 두자. providers.config는 iBATIS.NET가 이용하는 접속 프로바이더(각각의 데이터베이스 제품에 액세스하기 위한 기본적인 라이브러리 집단)의 설정을 정의하는 설정 파일이다.


[2]iBATIS.NET의 데이터베이스 접속 정보를 정의한다

 iBATIS.NET에서는 우선 데이터베이스 접속 정보를 전용 설정 파일인 sqlMap.config로 선언해 두어야 한다. 이하는 본문의 샘플에서 이용하는 sqlMap.config의 기술 예이다.

 또, sqlMap.config는 처음부터 스스로 기술해도 상관없지만, 다운로드 파일 안에도 템플릿으로서 SqlMap-sample.config가 포함되어 있다. 여기에는 최저 필요한 기술이 포함되어 있으므로, 이것을 편집하면 타입 미스도 적고, 효율적으로 작업을 진행할 수 있을 것이다.

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

<sqlMapConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd">

  <providers resource="providers.config" />

  <database>
    <provider name="sqlServer1.1"/>
    <dataSource name="sample" connectionString="Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=sample" />
  </database>

  <sqlMaps>
    <sqlMap resource="./Book.xml" />
  </sqlMaps>

</sqlMapConfig>
iBATIS.NET가 사용하는 데이터베이스 접속 정보의 설정 예(sqlMap.config)


  작성한 sqlMap.config는 다른「.aspx」파일과 같은 폴더(본문의 경우에는 어플리케이션 루트의 아래)에 저장할 것.

 <providers>요소에는 접속 프로바이더의 정보를 정의한 설정 파일(providers.config)에의 패스를 지정한다. 앞에서 서술한 것처럼 providers.config는 iBATIS.NET가 대응하고 있는 접속 프로바이더를 기술한 설정 파일이다. providers.config는 미리 다운로드 파일에 포함되어 있으므로, 이것을 복사하기만 하면 되고, 스스로 편집할 필요는 없다.

 이하에 providers.config로 정의되고 있는 주된 접속 프로바이더를 들어 보자.

접속 프로바이더명 데이터베이스
sqlServer1.0 SQL Server 7.0/2000(.NET Framework 1.0용)
sqlServer1.1 SQL Server 7.0/2000(.NET Framework 1.1용)
OleDb1.1 OLE DB(.NET Framework 1.1용)
Odbc1.1 ODBC(.NET Framework 1.1용)
oracle9.2 Oracle 9.2
oracle10.1 Oracle 10.1
oracleClient1.0 Oracle(Microsoft로부터 제공되고 있는 것)
MySql MySQL
SQLite3 SQLite 3.0
Firebird1.7 FireBird
PostgreSql0.7 PostgreSQL
iDb2.10 IBM DB2
 
iBATIS.NET가 대응하는 접속 프로바이더


  다만, SQL Server, OLE DB, ODBC 이외의 데이터베이스를 이용하는 경우에는 별도의 데이터베이스 전용 접속 프로바이더(.NET 데이터 프로바이더)가 필요하게 되므로 주의하자.

 실제의 접속 설정을 하는 것은 <database>요소의 역할이다. 사용하는 접속 프로바이더를 <provider>요소로, 접속 문자열을 <dataSource>요소로 각각 정의한다.

 <sqlMaps>요소는 iBATIS.NET로 사용하는 매핑 파일에의 패스를 지정한다. 매핑 파일이란, NHibernate의 해설에서도 소개했던 것처럼, 테이블상의 필드(열)와 클래스의 속성을 관련짓기 위한 정의 파일이다. 여기에서는 매핑 파일로서 Book.xml을 지정한다.

[3]매핑 파일을 정의한다


  다음으로, sqlMap.config로 지정한 매핑 파일 Book.xml을 정의하고, books 테이블과 Book 클래스를 연관짓는다. 또, books 테이블, Book 클래스는 모두 지난회 NHibernate편에서 사용한 것을 그대로 이용하자.

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

<sqlMap namespace="Book"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMap.xsd">

  <alias>
    <typeAlias alias="Book" type="Com.Msn.Wings.Book, Book" />
  </alias>

  <resultMaps>
    <resultMap id="booksResult" class="Book">
      <result property="Isbn" column="isbn" />
      <result property="Title" column="title" />
      <result property="Price" column="price" />
      <result property="Publish" column="publish" />
      <result property="Published" column="published" />
    </resultMap>
  </resultMaps>

  <statements>

    <select id="getBooksInfo" resultMap="booksResult">
      SELECT isbn,title,price,publish,published FROM books WHERE publish=#value#
    </select>

      ……중략……

    <insert id="setBookInfo" parameterClass="Book">
      INSERT INTO books(isbn,title,price,publish,published) VALUES(#Isbn#,#Title#,#Price#,#Publish#,#Published#)
    </insert>

  </statements>

</sqlMap>
iBATIS.NET에 의한 매핑 파일의 기술 예(Book.xml)


  클래스와 테이블을 관련짓는 것은 <resultMap>요소의 역할이다. id속성에 매핑명을, class 속성에 관련짓는 클래스명을 지정한다. 또한, 클래스명은 미리 <typeAlias>요소로 선언한 앨리어스(alias)(별칭)와 대응하고 있어야 한다.<typeAlias>요소의 구문은 이하와 같다.

<typeAlias alias="앨리어스(alias)명" type="클래스의 완전 수식명, 어셈블리명" />

 <resultMap>요소 아래의 <result>요소는, 각각의 필드명과 속성을 관련 짓는다. property 속성에는 클래스의 속성명을, column 속성에는 대응하는 필드명을 각각 지정한다.

 다음의 <statements>요소는 iBATIS.NET에서 발행하는 SQL 퀘리를 관리한다. <statements>요소의 아래에는 이하의 표에서 나타내 보이는 요소와 속성을 기술할 수 있다.

요소 속성 개요
<insert>
<update>
<delete>
id SQL 퀘리명
parameterClass SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 클래스명
parameterMap SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 맵명
<select> id SQL 퀘리명
parameterClass SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 클래스명
parameterMap SQL 퀘리 내의 플레이스 홀더에 값을 설정하기 위한 맵명
resultClass 취득한 결과 세트를 세트하는 클래스명
resultMap 취득한 결과 세트를 세트하는 맵명
 
요소 아래에서 지정 가능한 주된 부하 요소와 속성


  우선<select>요소는 그 이름에서도 쉽게 추측할 수 있듯이, SELECT 명령을 발행할 때 이용된다. INSERT/UPDATE/DELETE의 각 명령을 발행하는 경우에는 각각 대응하는 요소로 지정하면 된다.

 id속성은 SQL 퀘리를 한꺼번에 특정하기 위한 논리명이다. 코드중에서 매핑 파일을 검색할 때의 키가 되는 정보이므로, 매핑 파일 내에서 반드시 한꺼번에 지정해야 한다.

 resultMap 속성은 데이터베이스에서 취득한 결과 세트를 영속화 클래스(영속화 클래스에 대해서는 지난 1회의「[4]영속화 클래스를 정의한다」의 항목 을 참조)에 매핑하기 위한 맵명을 지정한다. 방금 전 <resultMap>요소로 지정한 id속성의 값을 세트할 것.

 발행하는 SQL 퀘리 본체는 <select> (또는 <insert>/<update>/<delete>) 요소의 본체에 기술한다. 본문의 서두에서도 기술한 것처럼, iBATIS.NET에서는 NHibernate와 같은 O/R매핑 툴과는 달리, SQL 퀘리를 개발자가 명시적으로 기술해야 한다.

 예를 들면 이하의 <select>요소는 프로그램 코드에서「getBooksInfo」라고 하는 ID로 식별되어 2행째에 있는 SELECT 명령을 데이터베이스에 대해 실행한다.

<select id="getBooksInfo" resultMap="booksResult">
  SELECT isbn,title,price,publish,published FROM books WHERE publish=#value#
</select>

 그리고 매핑 파일 내의 이하와 같은 <resultMap>요소의 기술에 따라서, 검색 결과의 각 필드 값이 Book 오브젝트의 각 속성에 대입된다는 것이다.

<resultMap id="booksResult" class="Book">
  <result property="Isbn" column="isbn" />
  <result property="Title" column="title" />
  <result property="Price" column="price" />
  <result property="Publish" column="publish" />
  <result property="Published" column="published" />
</resultMap>

 SQL 퀘리에는 「#value#」(무명 파라미터) 또는「#파라미터명#」(이름 파라미터)의 형식으로 플레이스 홀더를 설치하는 것이 가능하다.

 무명 파라미터는 코드 안에서도 이름 등을 의식하지 않고, 직접 값을 세트 할 수 있는 것이 포인트이다. 퀘리 내에 플레이스 홀더가 1개밖에 없는 경우에는 무명 파라미터를 이용하는 것으로 코드를 간단하게 기술할 수 있다.

 한편, 퀘리 내에 플레이스 홀더가 여러 개 존재하는 경우에는 이름 파라미터를 이용하면 된다. 자세한 것은 나중에 서술하겠지만, 이름 파라미터를 이용하는 것으로 parameterClass 속성으로 지정된 클래스와 같은 이름의 속성 값이 자동으로 세트된다. 즉, 위의 매핑 파일의 예(INSERT 명령)라면, Book.Isbn 속성의 값이 # Isbn#파라미터에, Book.Title 속성의 값이 #Title#파라미터에 각각 자동으로 SQL 퀘리로 할당된다는 것이다.








2. iBATIS.NET 경유로 데이터베이스를 검색한다







야마다 요시히로 (http://www.wings.msn.to/) | 2005/10/10 















 이상으로 iBATIS.NET를 이용하기 위한 준비는 완료되었다. 그러면, 드디어 iBATIS.NET를 경유하여 데이터베이스에 액세스해 보자.

 이하의 웹 폼은 지난 회에서와 같이,[출판사]란에 입력된 키워드로 books 테이블을 검색하여 취득한 결과를 DataGrid 컨트롤 상에 일람 표시하는 샘플이다. 우선은 구체적인 코드를 살펴보자.

<%@ Page ContentType="text/html" Language="C#" debug="true" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

IList books=null;

// [검색]버튼을 클릭하면 실행
public void btnSrch_Click(Object sender, EventArgs e){

  // 매핑 파일에서 해당하는 SQL퀘리를 취득하여 발행.
  // 취득한 Book 클래스의 리스트(IList 오브젝트)를 DataGrid
  // 컨트롤에 바인드한다
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text);
  grid.DataBind();
}

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 액세스</title>
</head>
<body>
<form runat="Server">
  출판사:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="검색" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBN코드"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="서명" />
      <asp:BoundColumn DataField="Price" HeaderText="가격"
        DataFormatString="{0:#,###엔}" />
      <asp:BoundColumn DataField="Publish" HeaderText="출판사" />
      <asp:BoundColumn DataField="Published" HeaderText="발행일"
        DataFormatString="{0:yyyy년 MM월 dd일(ddd)}" />
    </Columns>

  </asp:DataGrid>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

Dim books As IList

' [검색]버튼을 클릭하면 실행
Public Sub btnSrch_Click(sender As Object, e As EventArgs)

  '매핑 파일에서 해당하는 SQL 퀘리를 취득하여 발행.
  '취득한 Book 클래스의 리스트(IList 오브젝트)를 DataGrid
  '컨트롤에 바인드한다
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text)
  grid.DataBind()
End Sub

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 액세스</title>
</head>
<body>
<form runat="Server">
  출판사:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="검색" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBN코드"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="서명" />
      <asp:BoundColumn DataField="Price" HeaderText="가격"
        DataFormatString="{0:#,###엔}" />
      <asp:BoundColumn DataField="Publish" HeaderText="출판사" />
      <asp:BoundColumn DataField="Published" HeaderText="발행일"
        DataFormatString="{0:yyyy년 MM월 dd일(ddd)}" />
    </Columns>

  </asp:DataGrid>

</form>
</body>
</html>
iBATIS.NET를 이용하여 데이터베이스 검색을 하는 샘플 프로그램
(위:C#판 「ibatis_cs.aspx」, 아래:VB.NET판 「ibatis_vb.aspx」)


  iBATIS.NET에서 데이터베이스 액세스의 핵심을 담당하는 것은 SqlMapper 클래스(IBatisNet.DataMapper 이름 공간)의 역할이다. SqlMapper 클래스는 정적 메소드인 Mapper.Instance 메소드를 개입시켜 취득할 수 있다. 또, Mapper 클래스는 sqlMap.config에 의해서 정의된 매핑 정보로 액세스하기 위한 클래스이다.

 SqlMapper 클래스의 인스턴스를 취득하면, 다음은 간단하다. SqlMapper. QueryForList 메소드를 이용하여 매핑 파일 상에서 정의된 SQL 퀘리를 호출하면 된다. QueryForList 메소드의 일반적인 구문은 이하와 같다.

public IList QueryForList(string statementName, object parameterObject)
public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults)
SqlMapper 클래스의 QueryForList 메소드의 구문(C#)


  파라미터 statementName에는 방금 전 <select>요소의 id속성으로 정의한 SQL 퀘리명을, 파라미터 parameterObject에는 플레이스 홀더에 세트하는 파라미터 값을 각각 세트한다. 취득하는 시작행이나 최대 취득행을 지정하고 싶은 경우에는 제3, 제4 파라미터에 각각 명시하는 것도 가능하다.

 이와 같이 iBATIS.NET를 이용하여, 데이터베이스에의 접속 정보나 SQL 퀘리를 외부화 하는 한편, 취득한 결과를 특별한 매핑 코드를 기술하지 않고도 오브젝트에 매핑할 수 있다는 것이다.

 이상을 이해했으면, 즉시 샘플을 동작시켜 보자. 지난 NHibernate편에서 소개한 샘플과 같은 결과를 얻을 수 있을 것이다.


■ iBATIS.NET가 제공하는 「다이나믹 SQL」

 이와 같이, iBATIS.NET를 이용하는 것으로, 데이터베이스 제휴의 코드를 간단하게 기술할 수 있다. 그러나, iBATIS.NET의 매력은 이것 뿐만 아니다. iBATIS .NET에는 동적으로 SQL 퀘리를 생성하는「다이나믹 SQL」이라고 불리는 매우 편리한 기능이 준비되어 있다.

 다이나믹 SQL이란, 예를 들면 조건식으로 부여되는 파라미터 상태에 의해, 동적으로 조건식을 교체하는 기능이다. 우선은 이하의 예를 살펴 보자.

<select id="getBooksInfo2" resultMap="booksResult">
  SELECT isbn,title,price,publish,published FROM books
  <dynamic prepend="WHERE">
    <isNotEmpty prepend="AND" property="Publish">
      publish=#Publish#
    </isNotEmpty>
  </dynamic>
</select>
다이나믹 SQL를 이용하기 위한 매핑 파일의 설정(Book.xml(발췌))

IList books = null;

public void btnSrch_Click(Object sender, EventArgs e) {
  Book book = new Book();
  book.Publish = txtSrch.Text;
  books = Mapper.Instance().QueryForList("getBooksInfo2", book);
  grid.DataBind();
}
다이나믹 SQL에 의한 데이터베이스 검색(C#의 예:ibatis_cs2.aspx(발췌))


  이것은, 방금 전의 ibatis_cs.aspx를 다이나믹 SQL로 옮겨놓은 것이다. ibatis_cs.aspx의 경우, 검색 조건으로서[출판사]란을 지정하지 않았을 때에는 빈 데이터 그리드가 표시될 것이다. 이것은 publish 필드가 빈 문자열의 레코드를 검색하려고 했기 때문이다.

 그러나, 위의 설정과 코드로[출판사]란을 공백으로 하고 검색을 실시했을 경우, 모든 서적 정보가 표시된다. 이것이 다이나믹 SQL의 기능이다. 다이나믹 SQL은 <dynamic>요소의 부하에 기술된 조건이 true일지에 의해서, 동적으로 조건구를 추가하는 기능이다.

 이 설정에서는 Book.Publish 속성의 값이 비어 있지(Empty) 않은 경우에만「WHERE publish='*****'」라는 조건구를 SQL 퀘리에 추가한다. prepend 속성은 추가하는 조건구 전에 추가하는 키워드를 지정하는 것으로, 여기에서는「WHERE」를 추가한다.

 유저의 입력값에 의해서, 동적으로 SQL 퀘리를 변경하고 싶은 경우에도 다이나믹 SQL의 기능을 이용하면, 보다 심플하게 SQL 퀘리를 구성할 수 있다.

 참고로, <dynamic>요소의 아래에서 이용할 수 있는 주된 조건 요소로는 이하의 표와 같은 것이 준비되어 있다.


요소 SQL 퀘리가 추가되는 조건
isEqual property 속성의 값이 compareValue 속성의 값과 동일한 경우
isNotEqual property 속성의 값이 compareValue 속성의 값과 동일하지 않은 경우
isGreaterThan property 속성의 값이 compareValue 속성의 값보다 큰 경우
isGreaterEqual property 속성의 값이 compareValue 속성의 값 이상인 경우
isLessThan property 속성의 값이 compareValue 속성의 값보다 작은 경우
isLessEqual property 속성의 값이 compareValue 속성의 값 미만인 경우
isNull property 속성의 값이 null인 경우
isNotNull property 속성의 값이 null이 아닌 경우
isEmpty property 속성의 값이 비어 있는 경우
isNotEmpty property 속성의 값이 비어있지 않은 경우
 
요소 아래에서 기술 가능한 주된 조건 요소

 





eLancer는 세계적인 전문가 그룹입니다.


3. iBATIS.NET에 의한 데이터 등록

야마다 요시히로 (http://www.wings.msn.to/) | 2005/10/10 


 다음으로, iBATIS.NET를 사용한 데이터의 등록을 살펴 보자. 전 항목의 내용을 이해했으면, 데이터의 등록은 매우 간단하게 실현될 수 있다.

 이하의 샘플 코드는 유저로부터 입력된 값을 books 테이블에 새로 등록하기 위한 웹 폼의 예이다.

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

// [등록]버튼을 클릭하면 실행
public void btnSubmit_Click(Object sender, EventArgs e) {

  // Book 오브젝트의 각 속성에 입력된 값을 세트
  Book book = new Book();
  book.Isbn = txtIsbn.Text;
  book.Title = txtTitle.Text;
  book.Price = Int32.Parse(txtPrice.Text);
  book.Publish = txtPublish.Text;
  book.Published = DateTime.Parse(txtPublished.Text);

  // 매핑 파일로부터 해당하는 퀘리를 취득하여,

  // Book 오브젝트의 내용을 할당하고 나서 발행
  Mapper.Instance().Insert("setBookInfo", book);
}

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 등록</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBN 코드:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">서명:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">가격:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />엔</td>
    </tr>
    <tr>
      <th align="right">출판사:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">발행일:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="등록" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

' [등록]버튼을 클릭하면 실행
Public Sub btnSubmit_Click(sender As Object, e As EventArgs)

  ' Book 오브젝트의 각 속성에 입력된 값을 세트
  Dim book As New Book()
  book.Isbn = txtIsbn.Text
  book.Title = txtTitle.Text
  book.Price = Int32.Parse(txtPrice.Text)
  book.Publish = txtPublish.Text
  book.Published = DateTime.Parse(txtPublished.Text)

  '매핑 파일로부터 해당하는 퀘리를 취득하여,
  ' Book 오브젝트의 내용을 할당하고 나서 발행
  Mapper.Instance().Insert("setBookInfo", book)
End Sub

</script>
<html>
<head>
<title>iBATIS.NET에 의한 데이터 등록</title>
</head>
<body>
<form runat="Server">
  <table border="0">
    <tr>
      <th align="right">ISBN 코드:</th>
      <td><asp:TextBox id="txtIsbn"
            runat="Server" Columns="20" /></td>
    </tr>
    <tr>
      <th align="right">서명:</th>
      <td><asp:TextBox id="txtTitle"
            runat="Server" Columns="40" /></td>
    </tr>
    <tr>
      <th align="right">가격:</th>
      <td><asp:TextBox id="txtPrice"
            runat="Server" Columns="5" />엔</td>
    </tr>
    <tr>
      <th align="right">출판사:</th>
      <td><asp:TextBox id="txtPublish"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <th align="right">발행일:</th>
      <td><asp:TextBox id="txtPublished"
            runat="Server" Columns="15" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:Button id="btnSubmit" runat="Server"
          Text="등록" OnClick="btnSubmit_Click" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
iBATIS.NET를 이용하여 데이터 등록을 실시하는 샘플 프로그램
(위:C#판 「ibatis_input_cs.aspx」,
아래:VB.NET판 「ibatis_input_vb.aspx」)


  데이터의 등록을 실시하려면, 미리 영속화 클래스 Book의 대응하는 각 속성에 입력값을 세트해 두고, 이것을 SqlMapper 오브젝트의 Insert 메소드로 세트하기만 하면 된다. 앞에서 서술한 것처럼, 이것에 의해 Book 오브젝트의 각 속성 값이 자동으로 대응하는 플레이스 홀더에 세트된다.

 검색 처리의 경우와 같이, 코드측에서는 SQL을 전혀 의식하지 않고 오브젝트의 조작만으로 데이터의 조작이 가능해지는 것을 알 수 있을 것이다.

 이상을 이해했다면, 즉시 샘플을 실행해 보자. 지난 NHibernate편의 데이터 등록 프로그램의 예와 같이, 입력된 서적 정보가 데이터베이스에 반영되어 있으면 성공이다.

 참고로, 갱신이나 삭제 처리를 실시하는 경우도 Insert 메소드를 Update/Delete 메소드에 옮겨놓기만 하면, 그 다음은 거의 같은 요령으로 실시할 수 있다. 특별히 주의해야 할 점은 없기 때문에 본문에서는 생략하지만, 여유가 된다면 꼭 자신의 환경에서 테스트 해보자.

 이상, 2회에 걸쳐 .NET Framework 환경에서 이용할 수 있는 O/R 매핑 툴로서 대표적인 NHibernate와 iBATIS.NET이라고 하는 2개의 오픈 소스 제품에 대해 해설해 왔다.

 본 특집은 도입 기사이고, 물론 각각의 툴은 모두 많은 기능을 제공하고 있다. 관심이 있다면 꼭 이하의 문서를 읽어볼 것을 추천한다.

제품명 문서
NHibernate NHibernate Documentation
HIBERNATE - Relational Persistence for Idiomatic Java(일본어)
iBASIS.NET iBATIS Downloads
iBASIS.NET 레퍼런스 매뉴얼
 
NHibernate, iBATIS.NET의 온라인 참고 자료


  NHibernate의 개요를 이해하는데 있어서 충분히 참고가 될 것이다. 본문과 병행하여 활용하길 바란다.

반응형
공지사항