WEB

SQL Session Factory

NellKiM 2024. 12. 2. 10:35

SqlSessionFactory는 MyBatis에서 SQL 작업을 수행하기 위해 SqlSession 객체를 생성하는 역할을 하는 팩토리 클래스입니다.
MyBatis 애플리케이션에서 데이터베이스와 상호작용하려면 SqlSession 객체가 필요하며, 이 객체는 반드시 SqlSessionFactory를 통해 생성됩니다.

SqlSessionFactory의 주요 역할

  1. SqlSession 생성
    • MyBatis에서 SQL을 실행하기 위해 필요한 SqlSession 객체를 생성합니다.
    • 데이터베이스 작업이 끝난 후 SqlSession은 반드시 닫아야 합니다.
    • SqlSession은 Thread-Safe하지 않으므로 요청마다 새로운 세션을 생성해야 합니다.
  2. MyBatis 환경 설정 관리
    • MyBatis 설정 파일(mybatis-config.xml)에서 정의된 환경 설정(데이터베이스 연결 정보, 매퍼 파일 경로 등)을 로드하여 관리합니다.
  3. 캐싱 및 성능 관리
    • MyBatis는 SqlSessionFactory를 통해 1차 캐싱(로컬 캐시) 및 2차 캐싱(전역 캐시) 메커니즘을 관리할 수 있습니다.
  4. Thread-Safe
    • SqlSessionFactory는 멀티스레드 환경에서도 안전하게 사용할 수 있도록 설계되었습니다.

SqlSessionFactory 생성 과정

SqlSessionFactory는 주로 SqlSessionFactoryBuilder를 사용하여 생성됩니다. 이 과정에서 MyBatis 설정 파일(mybatis-config.xml)과 데이터베이스 매퍼 XML 파일을 로드합니다.

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml"; // 설정 파일 경로
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Failed to initialize SqlSessionFactory");
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}
import org.apache.ibatis.session.SqlSession;

public class Main {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
        
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.selectUser(1); // SQL 실행
            System.out.println(user);
        }
    }
}

장점

  1. 재사용 가능
    • SqlSessionFactory는 생성된 이후 애플리케이션 전체에서 재사용할 수 있습니다.
    • 매번 새로 생성할 필요 없이 효율적으로 관리됩니다.
  2. 효율적인 자원 관리
    • 내부적으로 데이터베이스 연결 풀(예: PooledDataSource)을 관리하여 효율적인 커넥션 사용을 지원합니다.
  3. 환경 설정의 중앙화
    • MyBatis 환경 설정을 한 곳에서 관리할 수 있어 유지보수가 용이합니다.
  4. 멀티스레드 안전성
    • SqlSessionFactory는 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.

유의 사항

  1. SqlSession의 사용 및 닫기
    • SqlSessionFactory로 생성된 SqlSession은 Thread-Safe하지 않습니다.
    • 각 요청마다 SqlSession 객체를 새로 생성해야 하며, 사용 후 반드시 close() 메서드로 닫아야 합니다.
  2. 싱글톤 관리
    • SqlSessionFactory는 애플리케이션에서 싱글톤으로 관리해야 합니다.
    • 위의 예제처럼 static 변수로 초기화하거나 Spring과 통합하여 관리할 수 있습니다.
  3. Spring과의 통합
    • Spring을 사용하는 경우, SqlSessionFactory를 자동으로 관리하는 **SqlSessionFactoryBean**을 활용할 수 있습니다.

결론

SqlSessionFactory는 MyBatis의 핵심 구성 요소로, 데이터베이스와의 연결을 효율적으로 관리하고, SQL 작업을 수행할 SqlSession 객체를 제공합니다.
다른 라이브러리나 프레임워크(Spring)와 통합하거나, 독립적으로 사용해도 안정적이고 효율적인 데이터베이스 작업 환경을 제공할 수 있습니다.