<?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>MyBatis-Spring | Sample Code</title>
		<author email="eduardo.macarron@gmail.com">Eduardo Macarron</author>
	</properties>

	<body>
		<section name="샘플 코드">

			<p>
				<span class="label important">중요</span>
				전체 웹 애플리케이션 서버에서 Spring을 사용하는 방법을 알고 싶다면 <a href="https://github.com/mybatis/jpetstore-6">JPetstore 6 demo</a> 를 참조하십시오.
			</p>

			<p>
			  MyBatis-Spring <a href="https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample">repository</a> 에서 샘플 코드를 확인할 수 있다.
			</p>
			<p>
			  모든 샘플은 JUnit5 에서 실행할 수 있다.
			</p>
			<p>
			  샘플 코드는 트랜잭션 서비스가 data access layer 에서 도메인 개체를 가져 오는 일반적인 디자인을 보여준다.
			</p>
			<p>
				다음 <code>FooService.java</code> 는 서비스처럼 작동한다.
			</p>
			<source><![CDATA[
@Transactional
public class FooService {

  private final UserMapper userMapper;

  public FooService(UserMapper userMapper) {
    this.userMapper = userMapper;
  }

  public User doSomeBusinessStuff(String userId) {
    return this.userMapper.getUser(userId);
  }

}
]]></source>
			<p>
			  이것은 트랜잭션 빈이다. 따라서 어떤 메서드든 실행이 되면 트랜잭션이 시작되고 예외가 발생하지 않았을 때 커밋된다.
				트랜잭션은 <code>@Transactional</code> annotation 을 통해 설정할 수 있다.
				이것은 필수가 아니다. Spring이 제공하는 다른 방법을 사용하여 트랜잭션을 구분할 수 있다.
			</p>
			<p>
			  이 서비스는 MyBatis로 이루어진 DAO layer 를 호출한다.
				이 layer는 런타임시 MyBatis에 의해 작성되고 Spring에 의해 서비스에 주입되는 동적 프록시와 함께 사용되는 <code>UserMapper.java</code> 인터페이스로 구성된다.
			</p>
			<source><![CDATA[
public interface UserMapper {

  User getUser(String userId);

}
]]></source>			
			<p> 
			    단순함을 위해서 DAO가 인터페이스와 그 구현체로 만들어진 DAO 시나리오를 위해 <code>UserMapper.java</code> 인터페이스를 사용했지만,
					이 경우 대신 <code>UserDao.java</code>라는 인터페이스를 사용하는 것이 더 적절하다.
			</p>
			<p>
			  매퍼 인터페이스를 찾고 Spring에 등록하고 서비스 빈에 주입하는 여러 가지 방법을 살펴본다.
			</p>
			<table>
				<caption>시나리오</caption>
				<thead>
					<tr>
						<th>샘플 테스트</th>
						<th>설명</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>
							<code>SampleMapperTest.java</code>
						</td>
						<td>
						  <code>UserMapper</code> 구현체를 동적으로 빌드 할 <code>MapperFactoryBean</code>에 기반한 기본 구성을 보여준다.
						</td>
					</tr>
					<tr>
						<td>
							<code>SampleScannerTest.java</code>
						</td>
						<td>
						  <code>MapperScannerConfigurer</code> 를 사용하여 어떻게 프로젝트의 모든 매퍼들을 자동으로 검색되도록 하는 방법을 보여준다.
						</td>
					</tr>
					<tr>
						<td>
							<code>SampleSqlSessionTest.java</code>
						</td>
						<td>
						  Spring에서 관리하는 <code>SqlSession</code>을 사용하여 DAO를 코딩하고 자체적인 구현체인 <code>UserDaoImpl.java</code> 를 제공하는 방법을 보여준다.
						</td>
					</tr>
					<tr>
						<td>
							<code>SampleEnableTest</code>
						</td>
						<td>
						  스프링의 <code>@Configuration</code>과 <code>@MapperScann</code> annotation을 함께 사용하여 매퍼를 자동으로 검색하는 방법을 보여준다.
						</td>
					</tr>
					<tr>
						<td>
							<code>SampleNamespaceTest</code>
						</td>
						<td>
						  커스텀 MyBatis XML 네임스페이스를 사용하는 방법을 보여준다.
						</td>
					</tr>
          <tr>
            <td>
              <code>SampleJavaConfigTest.java</code>
            </td>
            <td>
						  스프링의 <code>@Configuration</code>을 사용하여 MyBatis 빈들을 수동적으로 생성하는 방법을 보여준다.
            </td>
          </tr>
          <tr>
            <td>
              <code>SampleJobJavaConfigTest.java</code>
            </td>
            <td>
						  Java Configuration을 이용하여 Spring Batch에서 어떻게 <code>ItemReader</code>과 <code>ItemWriter</code>를 사용하는지 보여준다.
            </td>
          </tr>
          <tr>
            <td>
              <code>SampleJobXmlConfigTest.java</code>
            </td>
            <td>
						  XML Configuration을 이용하여 Spring Batch에서 어떻게 <code>ItemReader</code>과 <code>ItemWriter</code>를 사용하는지 보여준다.
            </td>
          </tr>
        </tbody>
			</table>
			<p>
			  MyBatis-Spring이 실제로 어떻게 다르게 작동하는지 보려면 <code>applicationContext.xml</code> 파일을 살펴보십시오.
			</p>

		</section>
	</body>
</document>

