(01) SQL Map XML 설정파일
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<typeAliases>
<typeAlias alias="Bbs" type="bbs.BbsDTO"/>
<typeAlias alias="BbsCode" type="bbs.BbsCodeDTO"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="poolMaximumActiveConnections" value="2"/>
<property name="poolMaximumIdleConnections" value="1"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
<property name="poolPingEnabled" value="true"/>
<property name="poolPingQuery" value="select 1"/>
<property name="poolPingConnectionsNotUsedFor" value="10000"/>
<property name="poolTimeToWait" value="15000"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/bbs.xml"/>
<mapper resource="mybatis/bbscode.xml"/>
</mappers>
</configuration>
---------------------------------------------------------------------------------------------
01) <properties>
이 설정은 외부에 옮길 수 있다.
자바 프로퍼티 파일 인스턴스에 설정할 수도 있고, properties 요소의 하위 요소에 둘수도 있다.
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
속성들은 파일 도처에 둘수도 있다.
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
username과 password는 properties 요소의 설정된 값으로 대체될 수 있다.
driver와 url속성은 config.properties 파일에 포함된 값으로 대체될 수도 있다.
02)settings
런타임시 MyBatis의 행위를 조정하기 위한 중요한 값들이다.
다음표는 셋팅과 그 의미 그리고 디폴트 값을 설명한다.
위 설정을 모두 사용한 setting 요소의 예제이다:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="enhancementEnabled" value="false"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
03) typeAliases
타입 별칭은 자바 타입에 대한 좀더 짧은 이름이다.
오직 XML 설정에서만 사용되며, 타이핑을 줄이기 위해 존재한다.
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
이 설정에서, “Blog” 는 도처에서 “domain.blog.Blog” 대신 사용될 수 있다.
04) environments
- 개발, 테스트, 리얼 환경을 위해 별도의 설정을 가지거나, 같은 스키마를 여러개의 DBMS제품을 사용할
경우들이다.
- 다중 환경을 설정할 수는 있지만, SqlSessionFactory 인스턴스마다 한개만 사용할 수 있다는 것이다.
//선언은 여러개 가능
- 두개의 데이터베이스에 연결하고 싶다면, SqlSessionFactory 인스턴스를 두개 만들 필요가 있다.
- 기억하기 쉽게 데이터베이스별로 하나의 SqlSessionFactory 환경을 명시하기 위해, SqlSessionFactoryBuilder 에
옵션으로 추가 파라미터를 주면 된다.
- 환경을 선택하는 두가지 시그니처는
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
- environment 파라미터가 없으면, 디폴트 환경이 로드된다.
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
- environments 요소는 환경을 설정하는 방법을 정의한다.
---------------------------------------------------------------------------
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
- 디폴트 환경(Environment) ID (예를 들면. default=”development”).
- 각각의 환경을 정의한 환경(Environment) ID (예를 들면. id=”development”).
//이거를 여러 개 만들고 default 값만 바꿔주면 됨 ㅇㅇ
------------------------------------------------------------------------------
05) transactionManager
- MyBatis는 두가지 타입의 TransactionManager 를 제공한다.
. JDBC – 이 설정은 간단하게 JDBC 커밋과 롤백을 처리하기 위해 사용된다.
트랜잭션의 스코프를 관리하기 위해 dataSource로 부터 커넥션을 가져온다.
.MANAGED – 이 설정은 어떤것도 하지 않는다. 결코 커밋이나 롤백을 하지 않는다.
대신 컨테이너가 트랜잭션의 모든 생명주기를 관리한다.
디플트로 커넥션을 닫긴 한다.
하지만 몇몇 컨테이너는 커넥션을 닫는 것 또한 기대하지 않기 때문에, 커넥션 닫는 것으로 멈추고자
한다면, “closeConnection” 프로퍼티를 false로 설정하라.
----------------------------------------------------------------------------
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
---------------------------------------------------------------------------
06) dataSource
- UNPOOLED – 이 구현체는 매번 요청에 대해 커넥션을 열고 닫는 간단한 DataSource이다.
조금 늦긴 하지만 성능을 크게 필요로 하지 않는 간단한 애플리케이션을 위해서는 괜찮은 선택이다.
UNPOOLED DataSource 는 5개의 프로퍼티만으로 설정된다.
. driver – JDBC 드라이버의 패키지 경로를 포함한 결제 자바 클래스명
. url – 데이터베이스 인스턴스에 대한 JDBC URL.
. username – 데이터베이스에 로그인 할 때 사용할 사용자명
. password - 데이터베이스에 로그인 할 때 사용할 패스워드
. defaultTransactionIsolationLevel – 커넥션에 대한 디폴트 트랜잭션 격리 레벨
필수는 아니지만 선택적으로 데이터베이스 드라이버에 프로퍼티를 전달할 수 도 있다.
그러기 위해서는 다음 예제처럼 “driver.” 로 시작하는 접두어로 프로퍼티를 명시하면 된다.
? driver.encoding=UTF8
이 설정은 “encoding” 프로퍼티를 “UTF8”로 설정하게 된다.
- POOLED – DataSource에 풀링이 적용된 JDBC 커넥션을 위한 구현체이다.
이는 새로운 Connection 인스턴스를 생성하기 위해 매번 초기화하는 것을 피하게 해준다.
그래서 빠른 응답을 요구하는 웹 애플리케이션에서는 가장 흔히 사용되고 있다.
UNPOOLED DataSource에 비해, 많은 프로퍼티를 설정할 수 있다.
. poolMaximumActiveConnections – 주어진 시간에 존재할 수 있는 활성화된(사용중인) 커넥션의 수. 디폴트는 10이다.
. poolMaximumIdleConnections – 주어진 시간에 존재할 수 있는 유휴 커넥션의 수
. poolMaximumCheckoutTime – 강제로 리턴되기 전에 풀에서 “체크아웃” 될 수 있는 커넥션의 시간. 디폴트는 20000ms(20초)
. poolTimeToWait – 풀이 로그 상태를 출력하고 비정상적으로 긴 경우 커넥션을 다시 얻을려고 시도하는 로우 레벨 셋팅.
디폴트는 20000ms(20초)
. poolPingQuery – 커넥션이 작업하기 좋은 상태이고 요청을 받아서 처리할 준비가 되었는지 체크하기 위해 데이터베이스에
던지는 핑쿼리(Ping Query).
디폴트는 “핑 쿼리가 없음” 이다.
. poolPingEnabled – 핑쿼리를 사용할지 말지를 결정. 사용한다면, 오류가 없는(그리고 빠른) SQL 을 사용하여 poolPingQuery
프로퍼티를 셋팅해야 한다. 디폴트는 false이다.
. poolPingConnectionsNotUsedFor – poolPingQuery 가 얼마나 자주 사용될지 설정한다. 필요이상의 핑을 피하기 위해
데이터베이스의 타임아웃 값과 같을 수 있다. 디폴트는 0이다.
디폴트 값은 poolPingEnabled 가 true일 경우에만, 모든 커넥션이 매번 핑을 던지는 값이다.
- JNDI – 이 DataSource 구현체는 컨테이너에 따라 설정이 변경되며, JNDI 컨텍스트를 참조한다.
이 DataSource는 오직 두개의 프로퍼티만을 요구한다.
. initial_context – 이 프로퍼티는 InitialContext 에서 컨텍스트를 찾기(예를 들어, initialContext.lookup(initial_context))
위해 사용된다. 이 프로퍼티는 선택적인 값이다. 이 설정을 생략하면, data_source 프로퍼티가
InitialContext 에서 직접 찾을 것이다.
. data_source – DataSource 인스턴스의 참조를 찾을 수 있는 컨텍스트 경로이다. initial_context 룩업을 통해 리턴된
컨텍스트에서 찾을 것이다. initial_context 가 지원되지 않는다면, InitialContext 에서 직접 찾을 것이다.
다른 DataSource 설정과 유사하게, 아래처럼 “env.” 를 접두어로 프로퍼티를 전달할 수 있다.
. env.encoding=UTF8
이 설정은 인스턴스화할 때 InitialContext 생성자에 “encoding” 프로퍼티를 “UTF8” 로 전달한다.
07) mappers★
- 설정을 어디에 둘지 결정해야 한다. 자바는 자동으로 리소스를 찾기 위한 좋은 방법을 제공하지 않는다.
그래서 가장 좋은 건 어디서 찾으라고 지정하는 것이다.
- 클래스패스에 상대적으로 리소스를 지정할 수도 있고, url 을 통해서 지정할 수 도 있다.
// Using classpath relative resources
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// Using url fully qualified paths
<mappers>
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
<mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>