[LG U+ 유레카 3기] MyBatis ch03 실습 | SqlSessionFactory 직접 구성하기

2025. 10. 17. 15:25Java/Mybatis


❶ 상황 설명

ch03에서는 MyBatis의 내부 동작 구조를 직접 구성해보는 실습이었다.
이전 ch02까지는 XML 설정 파일(mybatis-config.xml)을 이용했지만, 이번에는 자바 코드에서 Configuration 객체를 이용해 환경(Environment), 트랜잭션 팩토리(TransactionFactory), 데이터소스(DataSource), 매퍼(Mapper)를 직접 등록하여 SqlSessionFactory를 수동으로 생성했다.


❷ 코드 및 실행 흐름

① SqlSessionFactory 직접 구성 코드


package ch03;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.*;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import java.util.List;

public class BookApp {
    public static void main(String[] args) {
        // 1️⃣ DataSource 설정 (커넥션 풀 방식)
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_basic");
        dataSource.setUsername("root");
        dataSource.setPassword("1234");

        // 2️⃣ Environment 구성 (트랜잭션 관리 포함)
        Environment environment = new Environment(
                "development",
                new JdbcTransactionFactory(),
                dataSource
        );

        // 3️⃣ Configuration 객체 생성 및 매퍼 등록
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(ch03.BookDao.class);

        // 4️⃣ SqlSessionFactory 생성
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

        // 5️⃣ SqlSession 열고 실행
        try (SqlSession session = sqlSessionFactory.openSession()) {
            BookDao dao = session.getMapper(BookDao.class);
            List<Book> list = dao.getBooks();

            for (Book b : list) {
                System.out.println(b.getTitle() + " / " + b.getPrice());
            }
        }
    }
}

② Mapper 인터페이스 (BookDao.java)


package ch03;

import java.util.List;

public interface BookDao {
    List<Book> getBooks();
}

③ Mapper XML (BookDao.xml)


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="ch03.BookDao">
  <select id="getBooks" resultType="ch03.Book">
    SELECT * FROM book;
  </select>
</mapper>

❸ 실행 결과


[출력 예시]
Effective Java / 38000
토비의 스프링 / 42000
Real MySQL / 45000

결과적으로 SqlSessionFactory를 코드로 직접 구성해도 XML 방식과 동일한 동작을 수행했다.
하지만 이 접근은 프레임워크 내부 동작을 이해하는 데 매우 유용하다.


❹ 개념 정리

  • PooledDataSource : 커넥션 풀(Connection Pool)을 이용하는 데이터소스 구현체. 매번 커넥션을 생성하지 않아 효율적
  • Environment : 트랜잭션 팩토리와 데이터소스 설정을 묶는 객체
  • Configuration : MyBatis의 모든 환경 설정을 담는 중심 객체. 매퍼 등록, 설정, 타입 핸들러 등을 관리
  • SqlSessionFactoryBuilder : 설정(Configuration)을 기반으로 SqlSessionFactory 생성
  • addMapper() : 특정 Mapper 인터페이스를 Configuration에 직접 등록

❺ 핵심 요약

✅ ch03은 MyBatis의 동작 구조를 “수동 구성 방식”으로 학습한 단계다.
SqlSessionFactory를 코드로 직접 생성하며, 내부 매커니즘을 이해했다.
✅ MyBatis가 어떻게 환경(Environment) → 설정(Configuration) → 세션(SqlSession)으로 이어지는지 학습했다.
✅ XML 없이도 동일한 결과를 낼 수 있지만, 실무에서는 유지보수성을 위해 XML 기반 구성이 일반적이다.