프레임워크설계및구축 ibatis.net DataMapper Framework 자바개발자들과달리닷넷개발자들에게애플리케이션프레임워크라는단어는그리익숙한단어가아니다. 그만큼애플리케이션프레임워크가가져다주는편리함과각프레임워크들이내재하고있는디자인패턴, 아키텍처등에대한토론과논쟁이활발

Similar documents
2파트-07

Spring Boot/JDBC JdbcTemplate/CRUD 예제

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

DBMS & SQL Server Installation Database Laboratory

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

JUNIT 실습및발표

슬라이드 제목 없음

< 목차 > 1. Data Access Service 개요 (ibatis 활용 ) 3. DBIO 소개

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

[Brochure] KOR_TunA

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

윈도우시스템프로그래밍

쉽게 풀어쓴 C 프로그래밊

Spring Data JPA Many To Many 양방향 관계 예제

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Presentation

제8장 자바 GUI 프로그래밍 II

Microsoft Word - src.doc

MVVM 패턴의 이해

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

JDBC 소개및설치 Database Laboratory

슬라이드 1

gnu-lee-oop-kor-lec06-3-chap7

USER GUIDE

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

Windows 8에서 BioStar 1 설치하기

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

Microsoft PowerPoint - 10Àå.ppt

Microsoft PowerPoint - GUI _DB연동.ppt [호환 모드]

슬라이드 1

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

어댑터뷰

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

PowerPoint Template

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

<4D F736F F F696E74202D20B5A5C0CCC5CDBAA3C0CCBDBA5F3130C1D6C2F75F32C2F7BDC32E >

PowerPoint Template

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

ALTIBASE 사용자가이드 Templete

문서 템플릿

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

10.ppt

thesis

C# Programming Guide - Types

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 09. 예외처리

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Cluster management software

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

PowerPoint Presentation

윈도우시스템프로그래밍


(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

슬라이드 1

PowerPoint Presentation

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Microsoft PowerPoint - web-part03-ch20-XMLHttpRequest기본.pptx

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

arcplan Enterprise 6 Charting Facelifts

슬라이드 1

Microsoft PowerPoint 세션.ppt

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

소프트웨어공학 Tutorial #2: StarUML Eun Man Choi

Design Issues

초보자를 위한 C# 21일 완성

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

TITLE

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

chap 5: Trees

슬라이드 1

UNIST_교원 홈페이지 관리자_Manual_V1.0

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

VS_chapter10

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Æí¶÷4-¼Ö·ç¼Çc03ÖÁ¾š

오버라이딩 (Overriding)

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Intro to Servlet, EJB, JSP, WS

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Dialog Box 실행파일을 Web에 포함시키는 방법

C++ Programming

Microsoft PowerPoint - CSharp-10-예외처리

17장 클래스와 메소드

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

DocsPin_Korean.pages

PowerPoint 프레젠테이션

Microsoft PowerPoint 웹 연동 기술.pptx

빅데이터분산컴퓨팅-5-수정

MySQL-.. 1

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

개발문서 Oracle - Clob

NoSQL

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

교육자료

Transcription:

프레임워크설계및구축 ibatis.net DataMapper Framework 자바개발자들과달리닷넷개발자들에게애플리케이션프레임워크라는단어는그리익숙한단어가아니다. 그만큼애플리케이션프레임워크가가져다주는편리함과각프레임워크들이내재하고있는디자인패턴, 아키텍처등에대한토론과논쟁이활발하지못했으며이는곧닷넷기반애플리케이션에대한불신과선입견을불러오기도했다. 그러나최근국내? 외를막론하고닷넷환경에서도애플리케이션프레임워크도입과관련, 활발한의견이개진되고있으며, 특히오픈소스애플리케이션프레임워크를실제애플리케이션에적용한사례도하나둘씩늘어나고있다. 이번연재는애플리케이션프레임워크중오픈소스기반의 Spring.NET과데이터베이스접근기술인 ibatis.net에대한이야기중, 두번째이야기다. 스텝 4 바이스텝 연재순서 1 회 2009. 1 애플리케이션과프레임워크동시개발 2 회 2009. 2 프레임워크엔지니어링 1 3 회 2009. 3 프레임워크엔지니어링 2 4 회 2009. 4 Spring.NET 애플리케이션프레임워크 5 회 2009. 5 ibatis.net DataMapper Framework 연재가이드운영체제 윈도우 2K/XP 사용도구 VS2005, Spring.NET 1.2.0 기초지식 C# 응용분야 엔터프라이즈프로그래밍 권효중 fog_rain@naver.com, http:// funnygangstar.tistory.com ( 주 ) 중외정보기술솔루션개발팀. 닷넷환경에서도어플리케이션프레임워크, 오픈소스가널리사용되길바라는평범한개발자이다. ibatis.net은닷넷기반애플리케이션개발시데이터베이스를액세스하기위한기술중의하나이며, ibatis 프레임워크는자바환경에서먼저개발되어현재까지널리사용되고있다. ibatis.net은이의닷넷버전이다. 흔히들 ibatis 프레임워크를 ORM 프레임웍의범주에넣어다른 ORM 프레임워크들과비교를하곤하는데필자의생각은물론, ibatis 개발팀또한 ibatis 프레임워크를 ORM으로보기엔적합하지않다고한다. 그리하여이름붙여진것이 Data Mapper Framework이다. 보통의 ORM 프레임워크들이데이터베이스테이블과대응되는객체를맵핑해서직접쿼리를작성하지않아도되게끔하는데반해서 ibatis 프레임워크는개발자가손수쿼리를작성해야한다. 그렇다면, ibatis 프레임워크가제공해주는역할은무엇일까? 결론부터말하면, ibatis 프레임워크는쿼리결과와객체를맵핑해준다. 그럼이제부터 ibatis.net이제공해주는각종기능들과사용법에대해서알아보도록하자. 은아래와같다. - Visual Studio 2008 ASP.NET MVC 1.0 - MS-SQL 2005 (Northwind Database) - ibatis.net DataMapper 1.6.1 ibatis.net은별도의설치과정없이프로젝트에서관련 DLL 파일을참조하기만하면된다. ibatis.net을사용한간단한예제작성이런저런설명보다간단한예제를보게되면 ibatis.net이무엇인지에대해서쉽게감이올것이다. 예제에서사용할환경 < 화면 1> 프로젝트를생성한후 IBatisNet.Common.dll과 IBatisNet.DataMapper.dll을참조한다. 262 m a s o

ibatis.net DataMapper Framework 먼저 ASP.NET MVC 프로젝트를새로생성한후 IBatis Net.Common.dll과 IBatisNet.DataMapper.dll 파일을참조하도록하자. 이는 < 화면 1> 과같이제시된다. 다음엔 providers.config 파일을참조해야하는데이파일은 ibatis.net을사용해서접속할데이터베이스의드라이버를설정해주는역할을한다. 다운받은 ibatis.net 폴더에보면이미 providers.config 파일이있으므로이를프로젝트에추가하고우리가사용할 MS-SQL 서버에대한사용여부를 enabled= true 로변경해주는것만하면된다. providers.config 파일은웹프로젝트의 root에위치시켜놓도록하자. < 리스트 1> providers.config <provider name="sqlserver2.0" enabled="true" description="microsoft SQL Server, provider V2.0.0.0 in framework.net V2.0" assemblyname="system.data,version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionclass="system.data.sqlclient.sqlconnection" commandclass="system.data.sqlclient.sqlcommand" parameterclass="system.data.sqlclient.sqlparameter" parameterdbtypeclass="system.data.sqldbtype" parameterdbtypeproperty="sqldbtype" dataadapterclass="system.data.sqlclient.sqldataadapter" commandbuilderclass=" System.Data.SqlClient. SqlCommandBuilder" usepositionalparameters = "false" useparameterprefixinsql = "true" useparameterprefixinparameter = "true" parameterprefix="@" allowmars="false" /> 다음은접속할데이터베이스의커넥션정보를설정할 Sql Map.config 파일을추가하도록한다. 이파일역시다운받은폴더에보면샘플파일이있으므로이를활용하도록하고우리는 < 리스트 2> 에서처럼 providers.config의위치와데이터베이스접속정보만본인의환경에맞게변경한다. < 리스트 2> SqlMap.config <?xml version="1.0" encoding="utf-8"?> <sqlmapconfig xmlns="http://ibatis.apache.org/datamapper" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <settings> <setting usestatementnamespaces="false"/> </settings> <!-- DB 접속정보기재 --> <!-- provider 엘리먼트의 name 요소에는 providers.config 에서사용하기로한 DB provider 의이름을기재한다. --> <database> <provider name="sqlserver2.0"/> <datasource name="northwind" connectionstring="data Source=(local);Initial Catalog=Northwind;Integrated Security=True"/> </database> <!-- SQL 쿼리를기재할파일을지정한다 --> <sqlmaps> <sqlmap resource="./models/customers.xml"/> </sqlmaps> </sqlmapconfig> 이제간단한쿼리를작성하고쿼리결과와맵핑될클래스파일을작성하도록하자. ibatis.net은데이터베이스쿼리를 XML 파일에작성해야한다. 이방법은코드에쿼리를작성할때보다몇가지장점이있는데, 시스템운영중에도중단없이쿼리를변경할수있다는것과클래스파일에서문자열변수에쿼리를저장할때보다가독력이좋아진다는것, 쿼리문의재사용성이좋아진다는점, 검색조건의다이내믹한추가제거가가능하다는점등이그것이다. 이에대한자세한내용은후반부에자세히알아보도록하겠다. < 리스트 2> 의 SqlMap.config파일하단에지정한것처럼 Models 폴더하위에 Customers.xml 파일을프로젝트에추가하고 < 리스트 3> 과같이구성한다. < 리스트 3> Customers.xml <?xml version="1.0" encoding="utf-8"?> <sqlmap namespace="ibatissample" xmlns= "http://ibatis.apache.org/mapping" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" > <!-- 쿼리결과를리턴할객체의이름을지정 --> <alias> <typealias alias="customers" type= "ibatissample.models.customers" /> </alias> <!-- 쿼리를작성한다 --> <!-- 쿼리결과를 Customers 객체에바인딩한다 --> <statements> <select id="selectcustomers" resultclass="customers" > select top 5 * from customers </select> </statements> </sqlmap> m a s o 263

스텝바이스텝 4 < 리스트 3> 과같은파일을 ibatis.net에서는맵핑파일이라고부르며, 이파일들에필요한각종쿼리를기재하게된다. ibatis.net 기반으로개발할경우사실상가장자주사용할파일이되겠다. 다음으로는 < 리스트 4> 와같이쿼리결과를반환할엔티티클래스를작성한다. < 리스트 4> Customers.cs // Models 폴더하위에생성한다. namespace ibatissample.models public class Customers public string CustomerID get; set; public string CompanyName get; set; public string ContactName get; set; public string ContactTitle get; set; 이제 ibatis.net과관련된부분은모두작성했다. 이제는 XML 파일에작성한쿼리를호출하고 View페이지에바인딩하는기능만삽입하면된다. 이후 < 리스트 5> 와같이 HomeCon troller 컨트롤러클래스의액션메소드에서쿼리를호출한다. < 리스트 5> HomeController.cs namespace ibatissample.controllers [HandleError] public class HomeController : Controller public ActionResult Index() // XML 파일상의쿼리를호출하기위해 ibatis.net은 Mapper 클래스를제공한다. // 쿼리결과는 Customers 타입의 IList 형태로반환된다. ViewData.Model = Mapper.Instance().QueryForList<Customers>("SelectCustomers", null); return View(); public ActionResult About() return View(); 컨트롤러클래스의 Index() 액션메소드에서반환한 View Data를 Index.aspx에바인딩한다. Type화된 View를쉽게만드는방법은 Index() 액션메소드에서마우스오른쪽버튼을클릭 하면제공하는자동View 추가기능을통해손쉽게 View화면을구현할수있다. < 리스트 6> Index.aspx <%@ Page Title="" Language="C#" MasterPageFile= "~/Views/Shared/Site.Master" Inherits= "System.Web.Mvc.ViewPage<IEnumerable<iBatisSample.Models.Cu stomers>>" %> <asp:content ID="Content1" ContentPlaceHolderID= "TitleContent" runat="server"> Index </asp:content> <asp:content ID="Content2" ContentPlaceHolderID= "MainContent" runat="server"> <h2>index</h2> <table> <tr> <th></th> <th>customerid</th> <th>companyname</th> <th>contactname</th> <th>contacttitle</th> </tr> <% foreach (var item in Model) %> <tr> <%= Html.ActionLink("Edit", "Edit", new /* id=item.primarykey */ ) %> <%= Html.ActionLink("Details", "Details", new /* id=item.primarykey */ )%> <%= Html.Encode(item.CustomerID) %> <%= Html.Encode(item.CompanyName) %> <%= Html.Encode(item.ContactName) %> <%= Html.Encode(item.ContactTitle) %> </tr> <% %> </table> <p> <%= Html.ActionLink("Create New", "Create") %> </p> </asp:content> 264 m a s o

ibatis.net DataMapper Framework xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" > 여기까지문제없이작성하고프로젝트를실행하게되면 < 화면 2> 와같이 Customers 테이블의데이터가바인딩되었을것이다. 간단한예제를통해서 ibatis.net을어떻게사용하는지대략이해가되었으리라고본다. 예제를통해본 ibatis.net의기능을간략히요약해보면다음과같다. - 데이터베이스쿼리는클래스파일이아닌 XML 파일에작성하게되며, - 데이터베이스가변경되더라도쿼리를호출하는메소드는변경할필요가없으며, - 쿼리결과를객체에자동맵핑시켜준다. 살펴본바와같이 ibatis.net은기존에우리가사용하던데이터액세스프레임워크들, Enterprise Library, Helper (SqlHelper, OracleHelper 등 ) 이나 ORM (NHibernate, Linq, Entity Framework 등 ) 프레임워크의중간정도에있는프레임워크라고할수있다. 맵핑파일작성하기 ibatis.net을사용하면서가장많이사용되는파일은아무래도쿼리를작성하는 XML 파일일것이다. 그러면이파일을작성하는방법및몇가지편리한기능들에대해서보도록하자. 먼저맵핑파일의구성은크게아래와같이구성된다. - Entity 클래스들에대한별칭선언 - result map 클래스선언 ( 필요할경우 ) - parameter map 클래스선언 ( 필요할경우 ) - 쿼리문작성 < 화면 2> 실행결과화면 < 리스트 7> 은전형적인맵핑파일의모습을보여주고있다. < 리스트 7> SQL 맵핑파일 <?xml version="1.0" encoding="utf-8"?> <sqlmap namespace="ibatissample" xmlns="http://ibatis.apache.org/mapping" // 쿼리결과를반환할엔티티객체의별칭을선언한다. <alias> <typealias alias="customers" type= "ibatissample.models.customers" /> </alias> // 필요할경우엔티티객체의각프로퍼티와테이블의컬럼을맵핑한다. <resultmaps> <resultmap id="customersresultmap" class="customers"> <result column="customerid" property="customerid"/> <result column="companyname" property="companyname /> <result column="contactname" property="contactname"/> <result column="contacttitle" property= "ContactTitle"/> </resultmap> </resultmaps> // 필요할경우쿼리의파라미터로사용될객체와테이블의컬럼명을맵핑한다. <parametermaps> <parametermap id="customersparametermap" class= "customers"> <parameter column="customerid" property= "CustomerID"/> <parameter column="companyname" property= "CompanyName"/> <parameter column="contactname" property= "ContactName"/> <parameter column="contacttitle" property= "ContactTitle"/> </parametermap> </parametermaps> // <statements> 엘리먼트내부에쿼리문을기재한다. <statements> <select id="selectcustomers" resultmap= "customersresultmap" > select top 5 * from customers </select> <insert id="insertcustomers" parametermap= "customersparametermap" > insert into customers(customerid, CompanyName, ContactName, ContactTitle) values (#CustomerID#, #CompanyName#, #ContactName#, #ContactTitle#) </insert> <update id="updatecustomers" parametermap= "customersparametermap"> update customers set CompanyName=#CompanyName#, ContactName=#ContactName#, ContactTitle=#ContactTitle# where CustomerID = #CustomerID# </update> <delete id="deletecustomers" parametermap= "customersparametermap"> delete from customers where CustomerID = #CustomerID# m a s o 265

스텝바이스텝 4 </delete> </statements> </sqlmap> <resultmaps> 이나 <parametermaps> 같은경우는데이터베이스테이블의컬럼이름이 C# 의명명관례와다를경우에유용하다. 예를들면, 컬럼이름을 CUSTOMER_ID 라고정한경우에이이름을 C# 의클래스에서도프로퍼티이름으로그대로쓰는것은바람직하지않다. 이런경우에 <result column= CUS TOMER_ID property= CustomerID /> 와같이맵핑시켜주면각각의시스템에충실한명명규칙을사용할수있을것이다. SQL 맵핑파일은주로테이블당 1개씩작성하거나, 비즈니스로직별로구분지어사용할수있다. 어떤것이더바람직한지는애플리케이션마다다를수있겠지만, 쿼리의재활용관점에서는테이블별로작성하는것을권장하고싶다. 쿼리를호출하기위해서인자값을넘겨야할경우에는 # 표시를사용해서프로퍼티이름의앞뒤를감싸주면되며, 인자값의형태는객체형참조형태나기본형모두가능하다. 또한 < 리스트 8> 처럼 HashTable 과같은키-값형태의컬렉션형태도가능하다. < 리스트 8> HashTable 형태로인자값을넘기는경우 <insert id="insertcustomers" parameterclass= "System.Collections.Hashtable" > insert into customers(customerid, CompanyName, ContactName, ContactTitle) values (#CustomerID#, #CompanyName#, #ContactName#, #ContactTitle#) </insert> 다이나믹 SQL 작성하기 SQL 맵핑파일에서는 XML을사용해다양한형태의조건을추가할수있다. 예를들어, Where 조건식에서특정조건을추가또는삭제해야하는경우다. < 리스트 9> 에작성된쿼리를보면쉽 < 리스트 9> 다이나믹 SQL 을사용하는쿼리 <select id="selectcustomers" resultmap="customersresultmap" > SELECT TOP 5 * FROM CUSTOMERS <dynamic prepend="where"> <isnotnull prepend="and" property="customerid"> CustomerID = #CustomerID# </isnotnull> </dynamic> </select> 게이해할수있다. 쉽게눈치챌수있겠지만, 파라미터로넘어온값중에 Cus tomerid 변수가 Null이아니라면검색조건이추가되는것이다. 필자의경우에는클래스파일에서 if~ else~ 를남발할때보다이러한방식이더욱가독력이있어보였다. ibatis.net이제공하는다이나믹 SQL 기능은 isnotnull 이외에도다음과같은조건을사용할수있다. - <isequal> : 특정 property의값이지정한값과동일할경우 - <isnotequal> : 특정 property의값이지정한값과상이한경우 - <isgreaterthan> : 특정 property의값이지정한값보다큰경우 - <islessequal> : 특정 property의값이지정한값보다작은경우 - <isempty> : 특정 property의값이 null이거나빈값인경우 프로그래밍지원 SQL을기재한 XML 파일에서원하는 SQL을호출하기위해서는 Mapper 클래스를사용한다. 이클래스를사용하여 Mapp er.instance() 메소드를호출하면 SqlMap.config에지정한데이터베이스를디폴트로연결하게된다. 만일파일이름이 SqlMap. config가아니고개발자가임의로지정한파일이름이라면 < 리스트 10> 과같이파일명을지정해야한다. < 리스트 10> 임의로지정한 config 파일을지정하는코드 DomSqlMapBuilder dom = new DomSqlMapBuilder(); ISqlMapper sqlmapper = dom.configure(@".\oraclemap.config"); Mapper.Instance() 메소드를사용하면쿼리결과를리턴받을수있는몇가지메소드를제공해준다. - QueryForList() : 결과를 IList 형태로반환 - QueryForList<>() : 결과를타입화된 IList<> 형태로반환 - QueryForObject() : 결과를 Object 형태로반환 - QueryForObject<>() : 결과를타입화된 Object 형태로반환 또한데이타조작성쿼리는 Insert(), Delete(), Update() 메소드를통해지원해준다. < 리스트 11> ibatis.net 에서제공하는트랜잭션 try Mapper.Instance().BeginTransaction(); 266 m a s o

ibatis.net DataMapper Framework Mapper.Instance().Insert("insert", paramobject); Mapper.Instance().Update("update", paramobject); Mapper.Instance().CommitTransaction(); catch Mapper.Instance().RollBackTransaction(); ibatis.net을사용할경우트랜잭션은 Mapper.Instance() 에서제공하는트랜잭션지원기능을사용한다. 사용법은 < 리스트 11> 과같다. 팁 & 테크 ibatis.net을통해서개발하다보면 XML 파일을자주사용하게된다. 이때비쥬얼스튜디오에서인텔리전스기능을사용하려면, 다운받은 ibatis.net 폴더에서 SqlMap.xsd, SqlMap Config.xsd, providers.xsd 세가지파일을여러분들의비쥬얼스튜디오설치폴더에복사해놓으면된다. 설치시특별히경로를변경하지않았다면 C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas 폴더에위의세가지파일을옮겨놓으면된다. 이외에도쿼리로깅시쿼리를원래모양대로편하게보는방법, MyGeneration을사용한 Entity 클래스자동생성법, ibatis.net 관련설정시의몇가지주의사항등에관해서는필자의블로그 (http://funnygangstar.tistory.com) 를참조하자. 어쨌든, 이번컬럼을통해서도 ibatis.net의주요기능을대부분살펴볼수있고, 쉽게사용할수있을정도로 ibatis. NET은사용하기에쉽다. 즉, ibatis.net 프레임워크를사용하기위한학습곡선이높지않다는것인데, 이는다수의개발자로팀을이루고있을경우복잡하고어려운프레임워크를사용할때드는시간적비용을줄일수있는장점이기도하다. ORM을제외한데이터액세스기술중에는마이크로소프트에서오픈소스로제공해주는 Enterprise Library의 DAAB (Data Access Application Block) 가자주사용된다. DAAB는닷넷 1.0의 SqlHelper 클래스에서부터계속해서발전해왔으며, 현재까지마이크로소프트에서도적극적으로지원을하고있으며, 닷넷기반여러프로젝트에서도잘사용되고있다. 그러나 DAAB는 ibatis.net처럼쿼리결과를객체에자동맵핑해주지않으므로개발자가직접바인딩하는코드들을일일이구현해야한다. 또한프로시져를사용하지않고인라인코드에쿼리를직접작성할때에는스트링변수에쿼리를담아넣는지저분한코드가양산이되기도한다. 결론적으로여타 Data Access 기술들이나 ORM 프레임워크들에비교해서 ibatis.net의장점을다음과같이정리했다. - 여타 ORM 프레임워크들보다배우기쉽다. - 쿼리결과와객체간맵핑작업이필요없다. - 데이터베이스쿼리의장점을그대로사용할수있다. - 쿼리문만따로관리하므로유지보수가용이하다. - WHERE 조건의다이나믹한추가제거, 일부쿼리문의재사용성이증가한다. - ibatis.net이제공하는몇가지쿼리캐쉬메커니즘을사용할수있다. < 화면 3> 맵핑파일에인텔리전스가적용된화면 Data Access 기술비교 ibatis.net은그사용목적에따라서단순한쿼리호출및객체바인딩용으로사용해도좋으며, ORM의대용으로사용하더라도충분한기능을발휘할수있다. 다만이경우엔 N+1문제를비롯한몇가지해결해야할문제들이존재한다. 개인적으로필자는 ibatis.net을주로단순쿼리호출및객체바인딩용으로사용한다. ibatis.net이어차피 ORM 영역이아닌이상 ORM 툴과같은효과를보려면차라리여타 ORM 전문툴을사용하는것이더낫다는관점에서인데, 이는개인마다생각이다를수있다고본다. 프로젝트에서 ORM 프레임워크가아닌직접수작업으로데이터베이스쿼리를작성해야하는경우라면, 여타 Data Access 프레임워크들보다 ibatis.net을사용할경우훨씬깔끔한코드를유지시켜주며개발자가코딩해야할양도대폭줄어들수있다는것이필자의의견이다. 지난 4월호에소개했던 Spring.NET 프레임워크와더불어 ibatis.net 프레임워크는현재닷넷기반에서사용할수있는오픈소스기술중단연추천할만한기술들로이미그안정성과효과를자바환경에서입증했고닷넷환경에서도충분히실전에사용될만한기술들이라고할수있다. 참고자료 1. ibatis.net 공식매뉴얼 - http://ibatis.apache.org/dotnetdownloads.cgi m a s o 267