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

    Copyright ${license.git.copyrightYears} the original author or authors.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

-->
<document xmlns="http://maven.apache.org/XDOC/2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">

  <properties>
    <title>마이바티스 스프링 연동모듈 | 마이바티스 API 사용</title>
    <author email="hpresnall@gmail.com">Hunter Presnall</author>
    <author email="eduardo.macarron@gmail.com">Eduardo Macarron</author>
    <author email="fromm0@gmail.com">이동국(한국어 번역)</author>
  </properties>
     
  <body>
    <section name="MyBatis API 사용하기">
      <p>MyBatis-Spring 연동 모듈을 사용해도 계속해서 MyBatis API를 직접 사용할 수 있다. 
      <code>SqlSessionFactoryBean</code>을 사용해서 스프링에서 <code>SqlSessionFactory</code>를 생성하고 팩토리를 사용하면 된다. </p>
      <source><![CDATA[public class UserDaoImpl implements UserDao {
  // SqlSessionFactory would normally be set by SqlSessionDaoSupport
  private final SqlSessionFactory sqlSessionFactory;

  public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
  }

  public User getUser(String userId) {
    // note standard MyBatis API usage - opening and closing the session manually
    try (SqlSession session = sqlSessionFactory.openSession()) {
      return session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
  }
}]]></source>

      <p>이 방법은 <strong>신중히</strong> 사용하자. 왜냐하면 잘못사용하면 런타임 에러나 데이터 문제등을 야기할수 있기 때문이다. 
      API를 직접 사용할때는 다음의 규칙들에 유의해야 한다. </p>
      <ul>
        <li>
          <p>스프링 트랜잭션에 <strong>속하지 않고</strong> 별도의 트랜잭션에서 동작한다.</p>
        </li>
        <li>
          <p><code>SqlSession</code>이 스프링 트랜잭션 관리자가 사용하는 <code>DataSource</code>를 사용하고 
          이미 트랜잭션이 동작하고 있다면 이 코드는 예외를 <strong>발생시킬 것이다</strong>. </p>
        </li>
        <li>
          <p>마이바티스의 <code>DefaultSqlSession</code>은 쓰레드에 안전하지 않다. 
           빈에 이 객체를 주입하면 아마도 에러를 <strong>발생시킬 수 있다</strong>. </p>
        </li>
        <li>
          <p><code>DefaultSqlSession</code>을 사용해서 생성한 매퍼 또한 쓰레드에 안전하지 않다. 
          이렇게 만든 매퍼를 빈에 주입하면 에러를 <strong>발생시킬 수 있다</strong>. </p>
        </li>
        <li>
          <p><code>SqlSession</code>은 <strong>항상</strong> 마지막에 close() 메서드를 호출해야 한다. </p>
        </li>
      </ul>
    </section>
  </body>
</document>
