WEB
SQL Session Factory
NellKiM
2024. 12. 2. 10:35
SqlSessionFactory는 MyBatis에서 SQL 작업을 수행하기 위해 SqlSession 객체를 생성하는 역할을 하는 팩토리 클래스입니다.
MyBatis 애플리케이션에서 데이터베이스와 상호작용하려면 SqlSession 객체가 필요하며, 이 객체는 반드시 SqlSessionFactory를 통해 생성됩니다.
SqlSessionFactory의 주요 역할
- SqlSession 생성
- MyBatis에서 SQL을 실행하기 위해 필요한 SqlSession 객체를 생성합니다.
- 데이터베이스 작업이 끝난 후 SqlSession은 반드시 닫아야 합니다.
- SqlSession은 Thread-Safe하지 않으므로 요청마다 새로운 세션을 생성해야 합니다.
- MyBatis 환경 설정 관리
- MyBatis 설정 파일(mybatis-config.xml)에서 정의된 환경 설정(데이터베이스 연결 정보, 매퍼 파일 경로 등)을 로드하여 관리합니다.
- 캐싱 및 성능 관리
- MyBatis는 SqlSessionFactory를 통해 1차 캐싱(로컬 캐시) 및 2차 캐싱(전역 캐시) 메커니즘을 관리할 수 있습니다.
- 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);
}
}
}
장점
- 재사용 가능
- SqlSessionFactory는 생성된 이후 애플리케이션 전체에서 재사용할 수 있습니다.
- 매번 새로 생성할 필요 없이 효율적으로 관리됩니다.
- 효율적인 자원 관리
- 내부적으로 데이터베이스 연결 풀(예: PooledDataSource)을 관리하여 효율적인 커넥션 사용을 지원합니다.
- 환경 설정의 중앙화
- MyBatis 환경 설정을 한 곳에서 관리할 수 있어 유지보수가 용이합니다.
- 멀티스레드 안전성
- SqlSessionFactory는 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
유의 사항
- SqlSession의 사용 및 닫기
- SqlSessionFactory로 생성된 SqlSession은 Thread-Safe하지 않습니다.
- 각 요청마다 SqlSession 객체를 새로 생성해야 하며, 사용 후 반드시 close() 메서드로 닫아야 합니다.
- 싱글톤 관리
- SqlSessionFactory는 애플리케이션에서 싱글톤으로 관리해야 합니다.
- 위의 예제처럼 static 변수로 초기화하거나 Spring과 통합하여 관리할 수 있습니다.
- Spring과의 통합
- Spring을 사용하는 경우, SqlSessionFactory를 자동으로 관리하는 **SqlSessionFactoryBean**을 활용할 수 있습니다.
결론
SqlSessionFactory는 MyBatis의 핵심 구성 요소로, 데이터베이스와의 연결을 효율적으로 관리하고, SQL 작업을 수행할 SqlSession 객체를 제공합니다.
다른 라이브러리나 프레임워크(Spring)와 통합하거나, 독립적으로 사용해도 안정적이고 효율적인 데이터베이스 작업 환경을 제공할 수 있습니다.