MyBatis

Similar documents
MyBatis

Spring Boot/JDBC JdbcTemplate/CRUD 예제

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

MyBatis 3 사용자가이드

Spring Boot

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

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

쉽게 풀어쓴 C 프로그래밊

PowerPoint 프레젠테이션

C# Programming Guide - Types

JUNIT 실습및발표

어댑터뷰

PowerPoint Presentation

PowerPoint Presentation

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

JDBC 소개및설치 Database Laboratory

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

10.ppt

07 자바의 다양한 클래스.key

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

ALTIBASE 사용자가이드 Templete

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

혼자서일을다하는 JSP. 이젠일을 Servlet 과나눠서한다. JSP와서블릿의표현적인차이 - JSP는 <html> 내에서자바를사용할수있는수단을제공한다. - 서블릿은자바내에서 <html> 을작성할수있는수단을제공한다. - JSP나서블릿으로만웹페이지를작성하면자바와다양한코드가

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

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

Microsoft PowerPoint - CSharp-10-예외처리

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

강의 개요

ThisJava ..

PowerPoint Presentation

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

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

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

JAVA PROGRAMMING 실습 08.다형성

PowerPoint 프레젠테이션

교육자료

PowerPoint Presentation

파워포인트 템플릿

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

13주-14주proc.PDF

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

Design Issues

JVM 메모리구조

PowerPoint Template

Windows 8에서 BioStar 1 설치하기

PowerPoint 프레젠테이션

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

예제 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

개발문서 Oracle - Clob

C++ Programming

untitled

슬라이드 1

유니티 변수-함수.key

chap 5: Trees

Cluster management software

게시판 스팸 실시간 차단 시스템

FileMaker 15 ODBC 및 JDBC 설명서

Microsoft PowerPoint - lec12 [호환 모드]

PowerPoint Presentation

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

ALTIBASE HDB Patch Notes

제11장 프로세스와 쓰레드

rmi_박준용_final.PDF

PowerPoint Presentation

Network Programming

Microsoft PowerPoint - 04-UDP Programming.ppt

Secure Programming Lecture1 : Introduction

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint 프레젠테이션

DocsPin_Korean.pages

슬라이드 1

FileMaker ODBC 및 JDBC 가이드

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

신림프로그래머_클린코드.key

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

PowerPoint 프레젠테이션

Interstage5 SOAP서비스 설정 가이드

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

API 매뉴얼

PowerPoint 프레젠테이션

슬라이드 1

Altibase Starting User's Manual

내장서버로사용. spring-boot-starter-data-jpa : Spring Data JPA 사용을위한설정 spring-boot-devtools : 개발자도구를제공, 이도구는응용프로그램개발모드에서유 용한데코드가변경된경우서버를자동으로다시시작하는일들을한다. spri

PowerPoint 프레젠테이션

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

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

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Visual Basic 반복문

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

I. Introduction... 1 II. Jdbc Support 구현배경 사용자요구사항 p6spy Architecture Architecture InjectionPa

Java XPath API (한글)

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

歯Writing_Enterprise_Applications_2_JunoYoon.PDF

02 C h a p t e r Java

09-interface.key

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

(jpetstore \277\271\301\246\267\316 \273\354\306\354\272\270\264\302 Spring MVC\277\315 iBatis \277\254\265\277 - Confluence)

Transcription:

MyBatis

목차 3 1.1 mybatis 웹애플리케이션개발하기 4 1.1.1 설치하기 4 1.1.2 MYBATIS 설정파일 5 1.1.3 매퍼 XML과매퍼애노테이션 13 1.1.4 트랜잭션관리 16 1.1.5 좀더복잡한매핑규칙정의 17

1.MyBatis 시작하기

1.1 mybatis 웹애플리케이션개발하기 이전장에서는간단한 mybatis 애플리케이션을만들었고, Junit 테스트코드를통해실행해봤다. 실행하는과정에출력되는로그를통해 mybatis 가내부에서 JDBC API 를어떻게활용하고있는지도대략짐작가능했다. 간단한애플리케이션코드에서는 XML 에서매핑구문을기술하는것과 mybatis 자바 API 를사용해서실제호출하는코드를본것이다. 이간단해보인코드가사실은실제 mybatis 를활용하는대부분의코드에서사용될수있으며그비율은프로젝트마다다르겠지만 50% 가넘을수도있다는점에서독자는 mybatis 의 50% 이상을이미습득했다고할수있다. 이제부터는본격적으로웹애플리케이션을작성하는방법을볼것이다. mybatis 코드의경우, 앞서본예제와크게다르지않다. 먼저본샘플에서는 Spring MVC + mybatis 단독 형태의예제임을먼저알려드린다. 1.1.1 설치하기 A. 수동설치 mybatis 홈페이지의자바페이지인 http://www.mybatis.org/java.html 에서압축파일을다운로드한다. 압축파일을풀어보면 mybatis-x.x.x.jar 형태의 jar 파일이있는데. 이파일을 WEB-INF/lib 밑에두면사실상설치는끝난다. 이글을작성하는시점에최신버전은 3.1.0 이라 jar 파일명은 mybatis-3.1.0.jar 이다. B. maven 이용 dependency 에서 groupid 는 org.mybatis 이고, artifactid 는 mybatis 로설정하면된다. <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis</artifactid> <version>3.1.0</version> </dependency> C. ivy 이용 maven 과유사하다. org 는 org.mybatis 이고, name 은 mybatis 이다. 4 MyBatis

<dependency org="org.mybatis" name="mybatis" rev="3.1.0"/> 1.1.2 mybatis 설정파일 public Integer deletecomment(long commentno) { SqlSession sqlsession = getsqlsessionfactory().opensession(); try { String statement = "kr.pe.ldg.mybatis.example1.repository.mapper.commentmapper.deletecomment"; int result = sqlsession.delete(statement, commentno); if (result > 0) { sqlsession.commit(); return result; finally { sqlsession.close(); mybatis 설정파일에서설정가능한항목을파악하기위해서가장간단한방법은 DTD 를보는것이다. DTD 의위치는 http://mybatis.org/dtd/mybatis-3-config.dtd 이다. 설정가능한항목은 10 개다. A. properties 많은프로젝트에서는개발장비와실제리얼장비로구분해서개발하는경우가많다. 이러한경우에설정에대해서는외부프로퍼티파일로분리하고서버별로프로퍼티파일을선택해서배포하는형태를주로택한다. mybatis 의 properties 는외부프로퍼티파일을읽어서설정파일내변수처럼사용할수있도록한다. 외부프로퍼티파일의설정을아래와같이하고파일명은 mybatis.properties 로정했다. jdbc.url=jdbc:mysql://localhost:3306/mybatis_example jdbc.driver= com.mysql.jdbc.driver jdbc.username=mybatis jdbc.password=mybatis 대개의경우, properties 의 resource 속성에파일을지정하면된다. resource 속성은클래스패스기준으로프로퍼티를찾는다. <properties resource="mybatis.properties"></properties> 모든설정을외부프로퍼티파일에둔다면상관없지만프로퍼티중에일부는서버별로변경없이사용할수있다. 그러한경우아래처럼설정하면된다. <properties resource="mybatis.properties"> <property name="jdbc.driver" value="com.mysql.jdbc.driver"/> <property name="jdbc.username" value="mybatis"/> <property name="jdbc.password" value="mybatis"/> </properties> 5 MyBatis

만약에프로퍼티파일을클래스패스기준이아닌절대경로로잡아야할경우, url 속성을사용하면된다. <properties url="file:d:\mybatis.properties"></properties> 이렇게설정한후사용할때는 ${key 형태로사용하면된다. 위프로퍼티파일의내용을사용한다면아래와같다. <property name="url" value="${jdbc.url" /> B. settings settings 에서설정되는각종프로퍼티는 mybatis 자바 API 가작동할때의규칙을정의한다. mybatis 가마이너업그레이드를진행하면서추가되는항목도종종있고몇가지항목은 JDBC 드라이버에따라지원되지항목도있다. 1. cacheenabled : 매퍼 XML 또는매퍼애노테이션에서설정하는캐시설정을전체기본설정으로가져갈지에대한옵션이다. mybatis 이기본캐시는분산캐시가아니라로컬캐시라서버가여러대인경우데이터변경에대해캐시에반영하는게문제가될수있다. 물론 Cacheonix 와같은분산캐시가개발중에있긴하지만 mybatis 의기본캐시가아니라서캐시에대해서는신중히결정해야한다. 디폴트는 true 이다. 2. lazyloadingenabled : 늦은로딩사용여부에대한옵션이다. 디폴트는 true 이다. 3. aggressivelazyloading : 점진적인늦은로딩사용여부에대한옵션이다. 디폴트는 true 이다. 4. multipleresultsetsenabled : 한개의구문에서여러개의결과셋허용여부에대한옵션이다. 드라이버에따라지원여부가확인해서사용해야한다. 디폴트는 true 이다. 5. usecolumnlabel : 칼럼명대신칼럼라벨사용여부에대한옵션이다. 디폴트는 true 이다. 6. usegeneratedkeys : 생성키사용여부에대한옵션이다. 디폴트는 false 이다. 7. automappingbehavior : 자동매핑에대한옵션이다. 선택가능한값은 NONE, PARTIAL, FULL 인데디폴트는 PARTIAL 이다. 자동매핑에대해서는뒤에서좀더다뤄보도록한다. 8. defaultexecutortype : 디폴트실행타입옵션이다. 선택가능한값은 Statement 객체를재사용하지않는 SIMPLE, PreparedStatement 객체를재사용하는 REUSE, Statement 를재사용하고작업을배치로일괄처리하는 BATCH 가있다. 디폴트는 SIMPLE 이다. 9. defaultstatementtimeout : 데이터베이스요청에대한타임아웃설정이다. 대부분의 JDBC 드라이버가자체타입아웃설정이있는데, 이값보다짧게가져가야할경우사용하면된다. 양수로셋팅해야하며디폴트는설정하지않는다. 10. saferowboundsenabled 11. mapunderscoretocamelcase : 테이블칼럼명은대개언더바를통해구분하는데, 자바의코딩컨벤션은 CamelCase 형태를취한다. 이경우언더바형태를 CamelCase 형태로자동매핑할지에대한옵션이다. 이옵션을사용하지않으면서테이블명의칼럼명은언더바로구분하고모델은 CamelCase 를사용할경우쿼리문에별칭을사용하거나별도의결과맵을사용해야한다. 디폴트는 false 이다. 12. localcachescope : 캐시의저장범위를정한다. SqlSession 객체를기준으로캐시할때는 SESSION, 구문별로캐시할때는 STATEMENT 를선택하면된다. 디폴트는 SESSION 이다. 13. jdbctypefornull : 14. lazyloadtriggermethods : defaultstatementtimeout 를제외하면대부분디폴트값을가지고있다. defaultstatementtimeout 도사실은 JDBC 별로디폴트값을가지고있는터라사실상대부분의옵션은디폴트값을가지고있어서그대로사용하면되는셈이다. 즉변경이필요한옵션에대해서만설정을하면되는데필자의경우에는 3 개정도수정해서쓰면대부분의애플리케이션의요구사항을만족할것으로생각한다. 6 MyBatis

<settings> <setting name="cacheenabled" value="false"/> <setting name="usegeneratedkeys" value="true"/> <setting name="mapunderscoretocamelcase" value="true"/> </settings> C. typealiases 대부분의모델클래스는패키지경로를함께사용하면굉장히긴문자열이된다. 샘플에서사용한 Comment 모델은패키지경로까지모두표기하면 kr.pe.ldg.mybatis.example1.model.comment 정도이다. 매핑구문의파라미터나결과타입에서작성하려고보면굉장히긴문자열이라종종오타가날수도있고문자열자체가길다보니귀찮은작업임에는충분히짐작하고남을만하다. 이를위해타입별별칭을설정할수있도록한다. <typealiases> <typealias type="kr.pe.ldg.mybatis.example1.model.comment" alias="comment" /> </typealiases> 이렇게설정하고매핑구문에서파라미터나결과타입에 Comment 를사용하면 kr.pe.ldg.mybatis.example1.model.comment 로인식하게된다. ibatis 에서는이렇게 XML 에서만타입별칭을설정할수있었다. 하지만 mybatis 에서는애노테이션을설정하는방법을추가로제공한다. @Alias("Comment") public class Comment { 원시타입이나흔하게사용되는자바타입에대해서는 mybatis 내부적으로처리된별칭또한존재한다. 별칭 매핑된타입 _byte _long _short _int _integer _double _float _boolean string byte long short int integer byte long short int int double float boolean String Byte Long Short Integer Integer 7 MyBatis

double float boolean date decimal bigdecimal object map hashmap list arraylist collection iterator Double Float Boolean Date BigDecimal BigDecimal Object Map HashMap List ArrayList Collection Iterator D. typehandlers PreparedStatement 에서파라미터를셋팅하거나결과셋을가져올때테이블칼럼각각의값을자바의적절한타입으로셋팅해서 가져오기위해사용한다. mybatis 에서이미정의된타입핸들러들이다. 타입핸들러 자바타입 JDBC 타입 BooleanTypeHandler java.lang.boolean, boolean 어떤호환가능한 BOOLEAN ByteTypeHandler java.lang.byte, byte 어떤호환가능한 NUMERIC 또는 BYTE ShortTypeHandler java.lang.short, short 어떤호환가능한 NUMERIC 또는 SHORT INTEGER IntegerTypeHandler java.lang.integer, int 어떤호환가능한 NUMERIC 또는 INTEGER LongTypeHandler java.lang.long, long 어떤호환가능한 NUMERIC 또는 LONG INTEGER FloatTypeHandler java.lang.float, float 어떤호환가능한 NUMERIC 또는 FLOAT DoubleTypeHandler java.lang.double, double 어떤호환가능한 NUMERIC 또는 DOUBLE BigDecimalTypeHandler java.math.bigdecimal 어떤호환가능한 NUMERIC 또는 DECIMAL StringTypeHandler java.lang.string CHAR, VARCHAR ClobTypeHandler java.lang.string CLOB, LONGVARCHAR NStringTypeHandler java.lang.string NVARCHAR, NCHAR NClobTypeHandler java.lang.string NCLOB ByteArrayTypeHandler byte[] 어떤호환가능한 byte 스트림타입 BlobTypeHandler byte[] BLOB, LONGVARBINARY DateTypeHandler java.util.date TIMESTAMP DateOnlyTypeHandler java.util.date DATE 8 MyBatis

TimeOnlyTypeHandler java.util.date TIME SqlTimestampTypeHandler java.sql.timestamp TIMESTAMP SqlDateTypeHandler java.sql.date DATE SqlTimeTypeHandler java.sql.time TIME ObjectTypeHandler Any OTHER, 또는명시하지않는경우 EnumTypeHandler Enumeration Type VARCHAR 문자열호환타입. EnumOrdinalTypeHandler Enumeration Type 위치가저장된것과같은어떤호환가능한 NUMERIC 또는 DOUBLE 대부분의경우이미정의된타입핸들러를사용하면된다. 별도의타입핸들러를만들기위해서는 org.apache.ibatis.type.basetypehandler<t> 를확장하면된다. @MappedJdbcTypes(JdbcType.VARCHAR) public class ExampleTypeHandler extends BaseTypeHandler<String> { @Override public void setnonnullparameter(preparedstatement ps, int i, String parameter, JdbcType jdbctype) throws SQLException { ps.setstring(i, parameter); @Override public String getnullableresult(resultset rs, String columnname) throws SQLException { return rs.getstring(columnname); @Override public String getnullableresult(resultset rs, int columnindex) throws SQLException { return rs.getstring(columnindex); @Override public String getnullableresult(callablestatement cs, int columnindex) throws SQLException { return cs.getstring(columnindex); 구현체를만들어서타입핸들러를명시하는방법은두가지가있다. typehandler 를사용하는방법과 package 를통해해당패키지내타입핸들러를자동검색하게하는방법이다. 단 package 를사용해서자동검색하는방식은애노테이션으로명시한타입핸들러만검색이된다. <typehandlers> <typehandler handler="kr.pe.ldg.mybatis.example.exampletypehandler"/> <package name=" kr.pe.ldg.mybatis.example "/> </typehandlers> 9 MyBatis

앞서언급하긴했지만 mybatis 는 SQL 구문과모델을매핑하는역할을담당한다. 그리고그내부에서는 JDBC api 를사용한다. 이두가지설명에서이해해야하는것이 mybatis 는이두가지외더이상의것을하지않는다. 즉 JDBC 의결과셋의메타데이터 (java.sql.resultsetmetadata 와같은 ) 를추출해서분석해서자동으로처리하는기능은하지않는다. 즉테이블의칼럼타입과자바모델의변수타입이명확한경우에는상관없으나혼란의여지가있다면반드시그에대한정보를셋팅해줘야의도된데로작동하게된다. MyBatis 는제네릭타입을체크해서 TypeHandler 로다루고자하는자바타입을알것이다. 하지만두가지방법으로이행위를재정의할수있다 : typehandler 요소의 javatype 속성추가 ( 예제 : javatype="string") TypeHandler 클래스에관련된자바타입의목록을정의하는 @MappedTypes 애노테이션추가. javatype 속성도함께정의되어있다면 @MappedTypes 는무시된다. 관련된 JDBC 타입은두가지방법으로명시할수있다 : typehandler 요소에 jdbctype 속성추가 ( 예제 : jdbctype=varchar). TypeHandler 클래스에관련된 JDBC 타입의목록을정의하는 @MappedJdbcTypes 애노테이션추가. jdbctype 속성도함께정의되어있다면 @MappedJdbcTypes 는무시된다. E. objectfactory 대개의경우에는결과셋에대응되는모델을만들때는칼럼명 ( 또는칼럼별칭 ) 에대응되는 setter 메서드를호출해서모델을만들어리턴한다. 그리고추가로값을셋팅하고자할때는이모델에서다시셋팅하는과정을거치는게일반적이라고생각한다. 하지만이과정을 mybatis 매핑과정에서한꺼번에처리하고자할때는 ObjectFactory 를사용할수있다. 구현방식은 org.apache.ibatis.reflection.factory.objectfactory 인터페이스를구현하거나간단히 org.apache.ibatis.reflection.factory.defaultobjectfactory 를확장하는방법이있다. public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(class type) { return super.create(type); public Object create(class type, List<Class> constructorargtypes, List<Object> constructorargs) { return super.create(type, constructorargtypes, constructorargs); public void setproperties(properties properties) { super.setproperties(properties); <objectfactory type="kr.pe.ldg.mybatis.example.exampleobjectfactory"> <property name="someproperty" value="100"/> </objectfactory> 10 MyBatis

F. objectwrapperfactory G. plugins mybatis 가매핑구문을실행하는과정에서특정시점의처리를가로채서부가적인작업이가능하도록해준다. 로그를찍어줄수도있고, 파라미터에대해공통적으로타입체크또는결과셋에대한처리를추가할수도있을것이다. 1. Executor (update, query, flushstatements, commit, rollback, gettransaction, close, isclosed) 2. ParameterHandler (getparameterobject, setparameters) 3. ResultSetHandler (handleresultsets, handleoutputparameters) 4. StatementHandler (prepare, parameterize, batch, update, query) @Intercepts({@Signature( type= Executor.class, method = "update", args = {MappedStatement.class,Object.class)) public class ExamplePlugin implements Interceptor { public Object intercept(invocation invocation) throws Throwable { return invocation.proceed(); public Object plugin(object target) { return Plugin.wrap(target, this); public void setproperties(properties properties) { <plugins> <plugin interceptor="org.mybatis.example.exampleplugin"> <property name="someproperty" value="100"/> </plugin> </plugins> H. environments mybatis 의환경설정은트랜잭션관리자와데이터소스설정이다. 이환경설정은 mybatis 단독으로사용할때만필요하며 Spring 연동모듈을사용할경우에는필요없다. Spring 연동모듈에서는트랜잭션과데이터소스설정을 Spring 에서제어하기때문이다. 첫번째로설정가능한항목은 transactionmanager ( 트랜잭션관리자 ) 이다. 트랜잭션관리자에서셋팅해야할값은 type 과각종프로퍼티이다. type 속성으로선택가능한값은 JDBC 와 MANAGED 이다. 1. JDBC : mybatis 자바 API 에서제공하는 commit(), rollback() 메서드등을사용해서트랜잭션을관리하는방식이다. 2. MANAGED : mybatis 자바 API 보다는컨테이너가직접트랜잭션을관리하는방식이다. 11 MyBatis

두번째로선택가능한항목은 datasource( 데이터소스 ) 이다. 데이터소스에서셋팅해야할값은 type 과각종프로퍼티이다. type 속성은선택가능한값은 UNPOOLED, POOLED, JNDI 이다. 1. UNPOOLED : 요청마다데이터베이스연결을새롭게생성하고처리후완전히해제한다. 데이터베이스연결을매번생성하는것이성능적으로영향이있기때문에간단한테스트용애플리케이션을제외하고대부분의서비스용애플리케이션에서는사용하지않는다. 이타입에서선택가능한프로퍼티는 5 가지정도된다. driver - JDBC 드라이버의클래스명 url - 데이터베이스연결을위한 URL 정보 username - 데이터베이스연결을위한계정명 password - 데이터베이스연결을위한계정의패스워드 defaulttransactionisolationlevel - 디폴트트랜잭션격리레벨 2. POOLED : 일정수의데이터베이스연결을풀에넣어두고필요할때마가가져다가사용하고사용하고나면다시풀에넣는다. 매번데이터베이스연결을생성하지않기때문에대부분의웹애플리케이션에서기본적으로사용한다. 앞서본 UNPOOLED 에서설정가능한프로퍼티와그외추가로프로퍼티를지정할수있다. poolmaximumactiveconnections 주어진시간에존재할수있는활성화된 ( 사용중인 ) 커넥션의수. 디폴트는 10 이다. poolmaximumidleconnections 주어진시간에존재할수있는유휴커넥션의수 강제로리턴되기전에풀에서 체크아웃 될수있는커넥션의시간. 디폴트는 20000ms(20 초 ) pooltimetowait 풀이로그상태를출력하고비정상적으로긴경우커넥션을다시얻을려고시도하는로우레벨셋팅. 디폴트는 20000ms(20 초 ) poolpingquery 커넥션이작업하기좋은상태이고요청을받아서처리할준비가되었는지체크하기위해데이터베이스에던지는핑쿼리 (Ping Query). 디폴트는 핑쿼리가없음 이다. 이설정은대부분의데이터베이스로하여금에러메시지를보게할수도있다. poolpingenabled 핑쿼리를사용할지말지를결정. 사용한다면, 오류가없는 ( 그리고빠른 ) SQL 을사용하여 poolpingquery 프로퍼티를셋팅해야한다. 디폴트는 false 이다. poolpingconnectionsnotusedfor poolpingquery 가얼마나자주사용될지설정한다. 필요이상의핑을피하기위해데이터베이스의타임아웃값과같을수있다. 디폴트는 0 이다. 디폴트값은 poolpingenabled 가 true 일경우에만, 모든커넥션이매번핑을던지는값이다. 3. JNDI : 컨테이너의 JNDI 컨텍스트를참조한다. 앞서본두가지타입과는다르며, 설정가능한프로퍼티는 2 개뿐이다. initial_context 이프로퍼티는 InitialContext 에서컨텍스트를찾기 ( 예를들어, initialcontext.lookup(initial_context)) 위해사용된다. 이프로퍼티는선택적인값이다. 이설정을생략하면, data_source 프로퍼티가 InitialContext 에서직접찾을것이다. data_source DataSource 인스턴스의참조를찾을수있는컨텍스트경로이다. initial_context 룩업을통해리턴된컨텍스트에서찾을것이다. initial_context 가지원되지않는다면, InitialContext 에서직접찾을것이다. 이환경설정을 ibatis 에서는한개만설정가능했으나 mybatis 에서는여러개설정하고 SqlSessionFactory 객체를생성하는시점에선택할수있도록했다. 필자의경우서버환경마다대부분동일하고 JDBC url 과계정정보정도만달라서여러개의환경설정을두는방식보다는프로퍼티파일을서버별로두는방식을사용하기때문에그효용성에대해서는크게와닿지않으나사용자는사람들의목적에따라분명 ibatis 때보다는좋은점이있을것이다. 12 MyBatis

I. databaseidprovider J. mappers 매핑구문을지정하는방법이다. ibatis 에서는매핑구문을정의하는방법이 2 가지뿐이었지만 mybatis 에서는 4 가지를제공한다. 1. 클래스패스내 XML 매핑파일지정 (resource 속성 ) 2. url 을사용한 XML 매핑파일지정 (url 속성 ) 3. 매핑애노테이션을사용하는인터페이스위치지정 (class 속성 ) 4. 패키지지정으로패키지내자동으로매핑구문검색 ( name 속성 ) <mappers> <mapper resource="org/mybatis/builder/authormapper.xml"/> <mapper url="file:///var/mappers/authormapper.xml"/> <mapper class="org.mybatis.builder.authormapper"/> <package name="org.mybatis.builder"/> </mappers> K. 정리여기에서대부분의프로젝트를작성할때가장공통적으로사용되는요소는 properties, settings, typealiases, environments, mappers 의 5 가지이다. 이요소들은명칭이나그역할이조금달라지긴했으나이전버전인 ibatis 에도거의동일하게있었다.. 그외추가된요소는 mybatis 의스펙을결정하면서도움이되리라생각되고실제몇몇사용자들이요청해서생긴것들이다. 단공통적으로사용할만한기능이아닌게많아서사용시원하는요구사항에충분히맞는지확인후사용해야한다. 1.1.3 매퍼 XML 과매퍼애노테이션 ibatis 에서는매핑구문정의가 XML 에서만가능했다. 하지만 mybatis 에서는 XML 과애노테이션두가지방식을지원한다. 실제사용하는경우로따져보면 3 가지형태로사용된다. 1. XML 만사용 2. 애노테이션만사용 3. XML 과애노테이션을혼용해서사용 B. XML 만사용하는경우 XML 을사용하는경우는 ibatis 를사용해본사람이라면 XML 요소의명칭과동적 SQL 부분의변경사항정도를제외하면기존과거의동일하기때문에익히는데시간이얼마들지않을것이다. 앞서우리는앞장에서 XML 을사용하는경우에대한간단한에제를봤다. 이미본예제와함께동적 SQL 을사용하는경우의예제를추가해서다시보자 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="kr.pe.ldg.mybatis.example1.repository.mapper.commentmapper"> <select id="selectcommentbyprimarykey" parametertype="long" resulttype=" Comment"> SELECT comment_no AS commentno, 13 MyBatis

user_id AS userid, comment_content AS commentcontent, reg_date AS regdate FROM COMMENT WHERE comment_no = #{commentno </select> <select id="selectcommentbycondition" parametertype="hashmap" resulttype="comment"> SELECT comment_no, user_id, comment_content, reg_date FROM COMMENT <where> <if test="commentno!= null"> comment_no = #{commentno </if> </where> </select> </mapper> 두개의매핑구문이있다. 각각을 mybatis 자바 API 를통해사용할때는명명공간을반드시붙여서매핑구문아이디를사용해야한다. 1. selectcommentbyprimarykey sqlsession.selectone("kr.pe.ldg.mybatis.example1.repository.mapper.commentmapper.selectcommentbyprimarykey", 1L); 2. selectcommentbycondition sqlsession.selectlist("kr.pe.ldg.mybatis.example1.repository.mapper.commentmapper.selectcommentbycondition", new HashMap<String, Object>()); C. 애노테이션만사용하는경우 XML 을사용하는경우에서본 selectcommentbyprimarykey, selectcommentbycondition 모두애노테이션방식으로변경해보자. 애노테이션을사용할경우의단점은, 동적 SQL 을작성하기가어렵다는것이다. 이러한경우를위해 @SelectProvider 애노테이션을제공하고있다. public interface CommentMapper { @Select({ "SELECT ", "comment_no, user_id, comment_content, reg_date ", "FROM COMMENT ", "WHERE comment_no = #{commentno" ) Comment selectcommentbyprimarykey(long commentno); 14 MyBatis

@SelectProvider(type=CommentSqlProvider.class, method="selectcommentbycondition") List<Comment> selectcommentbycondition(map<string, Object> condition); ibatis 와달리 mybatis 에서는동적 SQL 을자바코드로작성할수있도록 API 가추가되었다. 대표적인경우가샘플에서보이는 BEGIN, SELECT, FROM 등이다. 여기서자세히다루고싶지만 @SelectProvider 와 XML 동적 SQL 은그내용이많아뒤에서다시다루도록하겠다. public class CommentSqlProvider { public String selectcommentbycondition(commentexample example) { BEGIN(); SELECT("comment_no"); SELECT("user_id"); SELECT("comment_content"); SELECT("reg_date"); FROM("comment"); applywhere(example, false); return SQL(); D. XML 과애노테이션을혼용해서사용하는경우 XML 을사용하는경우에서 selectcommentbyprimarykey, selectcommentbycondition 두가지를봤다. 애노테이션형태를보여주기위해임의로 selectcommentbyprimarykey 를애노테이션방식을변경을했다. 그렇기때문에 selectcommentbycondition 은여전히 XML 에그대로남는다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="kr.pe.ldg.mybatis.example1.repository.mapper.commentmapper"> <select id="selectcommentbycondition" parametertype="hashmap" resulttype="comment"> SELECT comment_no, user_id, comment_content, reg_date FROM COMMENT <where> <if test="commentno!= null"> comment_no = #{commentno 15 MyBatis

</if> </select> </mapper> </where> 하지만 selectcommentbyprimarykey 는아래처럼애노테이션으로수정하였다. 필자의경우, 쿼리문이지면에서보기편하도록 @Select 애노테이션에배열형태로넣었지만한개의문자열로넣어도된다. 배열형태로넣을경우, 모든문자열을순서대로붙여서한문자열로만들어서처리한다. 애노테이션을사용할경우의단점은, 동적 SQL 을작성하기가어렵다는것이다. 이러한경우를위해 @SelectProvider 애노테이션을제공하고있다. @SelectProvider 와 XML 동적 SQL 은그내용이많아뒤에서다시다루도록하겠다. public interface CommentMapper { @Select({ "SELECT ", "comment_no, user_id, comment_content, reg_date ", "FROM COMMENT ", "WHERE comment_no = #{commentno" ) Comment selectcommentbyprimarykey(long commentno); // @Select("SELECT comment_no, user_id, comment_content, reg_date FROM COMMENT WHERE comment_no = #{commentno") List<Comment> selectcommentbycondition(map<string, Object> condition); 1.1.4 트랜잭션관리 A. SqlSessionFactory mybatis 의전반적인처리는 SqlSession 객체가담당한다. 그렇기때문에 SqlSession 객체가생성되는시점에트랜잭션에관련한속성이셋팅이된다. 그래서트랜잭션을처리하는방법을보기전에 SqlSession 객체가생성될때의형태를봐두는게좋다. 먼저 SqlSession 객체를생성하는 SqlSessionFactory 의메서드를살펴보자. 1. SqlSession opensession() 2. SqlSession opensession(boolean autocommit) 3. SqlSession opensession(connection connection) 4. SqlSession opensession(transactionisolationlevel level) 5. SqlSession opensession(executortype exectype,transactionisolationlevel level) 6. SqlSession opensession(executortype exectype) 7. SqlSession opensession(executortype exectype, boolean autocommit) 8. SqlSession opensession(executortype exectype, Connection connection) 16 MyBatis

B. SqlSession 객체의디폴트속성 SqlSessionFactory 가제공하는메서드가이렇게많긴하지만실제로는대부분 opensession() 으로처리가가능하다. opensession() 메서드를사용할경우, 앞서본 mybatis 설정파일의내용을그대로가져간다. 그외메서드는특별한경우 mybatis 의설정을그대로사용하지않고처리하기위함인데, 실제개발과정에서그러한경우가많지않으리라생각한다. opensession() 메서드를사용하여 SqlSession 객체를생성하게되면생성된객체의성격은디폴트상태가된다. 1. 트랜잭션은시작된다. 2. mybatis 설정파일의설정된형태의데이터소스를가진다. 3. 트랜잭션에관련한격리레벨이나전파설정은설정내용에의해셋팅된다. 4. PreparedStatement 는재사용되지않고처리는배치형태가아니다. C. SqlSession 이제공하는메서드 SqlSession 객체가제공하는메서드는많지만대략적으로보면아래와같다. 1. <T> T selectone(string statement) 2. <E> List<E> selectlist(string statement) 3. <K,V> Map<K,V> selectmap(string statement, String mapkey) 4. int insert(string statement) 5. int update(string statement) 6. int delete(string statement) D. 트랜잭션제어메서드 1. void commit() 2. void commit(boolean force) 3. void rollback() 4. void rollback(boolean force) 여기서독특한것은 boolean 타입의파라미터이다. mybatis api 에서입력 / 수정 / 삭제에대한호출이한번도없었다고하면명시적으로커밋이나롤백을하지않는다. 단 boolean 타입의파라미터를 true 로지정하면입력 / 수정 / 삭제의호출이있었는지에대해체크하지않고무조건커밋이나롤백을하도록처리한다. mybatis 를단독으로사용할때는 mybatis 의 SqlSession 객체의 commit() 이나 rollback() 메서드를사용하면된다. 하지만 Spring 이나 Google Guice 와연동하는경우, 트랜잭션에대한제어는 mybatis 가담당하지않고그역할이 Spring 이나 Google Guice 로위임된다. Spring 연동시트랜잭션처리를뒤에서다시다루도록한다. 1.1.5 좀더복잡한매핑규칙정의 A. constructor B. association C. collection D. discriminator 17 MyBatis