-
[MyBatis] SqlSession, SqlSessionFactory, SqlSessionTemplateIT/코딩히스토리_BE 2025. 1. 12. 23:53
마이바티스는 자바 기반의 SQL 매퍼 프레임워크라고했다.
SQL문을 실행해주고 리턴을 받아야 하는데 이때 마이바티스는 SqlSession이라는 객체를 통해서
이를 진행한다.
SqlSession이란?
MyBatis에서 제공하는 주요 인터페이스로, 데이터베이스와의 연결(Session)을 관리하며 SQL 쿼리 실행, 트랜잭션 관리, 매퍼 호출 등의 역할을 담당
MyBatis의 SqlSession은 JDBC의 Connection 객체를 내부적으로 사용하며, 이를 통해 개발자가 SQL 실행과 결과 매핑을 쉽게 처리할 수 있도록 도와준다.
즉, SqlSession은 JDBC의 Connection 객체와 같이
SQL을 실행하고 결과를 반환받는 그릇이라고 생각하면 된다.
SqlSession 자체도 열고 닫고를 SQL실행마다 명시적으로 진행해야하며
이걸 하기 싫어서 히카리CP를 사용하는것이다.
아무튼 마이바티스에서 SqlSession을 사용하기 위해서는 SqlSessionFactory라는 객체를 통해 생성해야한다.
SqlSessionFactory를 생성하는 방식은 순수 자바와 Spring Framework에서 다를 수 있다.
1. 순수 자바에서 SqlSessionFactory 생성
순수 자바에서 MyBatis를 사용하려면 SqlSessionFactory를 수동으로 설정하고 생성해야 한다.이를 위해 SqlSessionFactoryBuilder를 사용해 SqlSessionFactory를 생성할 수 있다.
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class MyBatisExample { public static void main(String[] args) throws Exception { // MyBatis 설정 파일 위치 String resource = "mybatis-config.xml"; // 설정 파일을 InputStream으로 읽어오기 InputStream inputStream = Resources.getResourceAsStream(resource); // SqlSessionFactory 생성 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 이제 sqlSessionFactory를 사용해서 SqlSession을 생성하고 DB에 접근할 수 있음 try (SqlSession session = sqlSessionFactory.openSession()) { // SQL 쿼리 실행 // session.selectList("namespace.selectQuery"); } } }
2. Spring Framework에서 SqlSessionFactory 생성
Spring Framework에서는 SqlSessionFactory를 빈으로 등록하여 DI(Dependency Injection)을 통해 관리한다.보통 Spring의 DataSource와 연결하여, Spring의 환경에 맞게 MyBatis를 설정한다.
Spring에서는 또1)XML이나
2)Java Config를 통해
SqlSessionFactory를 생성할 수 있다.
- Java Config 방식
[예시]import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class MyBatisConfig { private final DataSource dataSource; public MyBatisConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // DataSource 연결 설정 factoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml")); // mybatis 설정 파일 경로 return factoryBean.getObject(); } }
- XML 방식
[예시]<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> <!-- DataSource 설정 --> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/> </bean>
위에 방식으로 선언되면 아래 방법으로 사용가능하다.
Spring에서 sqlSessionFactory를 사용하는 방법
1) @Autowired 어노테이션을 사용하여 자동으로 주입(Spring에서는 일반적으로 주입받아서 쓰겠죠?)import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class MyService { @Autowired private SqlSessionFactory sqlSessionFactory; // xml에서 정의한 sqlSessionFactory를 주입받습니다. public void someMethod() { try (SqlSession session = sqlSessionFactory.openSession()) { // MyBatis를 이용한 SQL 실행 // 예시: session.selectList("UserMapper.selectAllUsers"); } } }
2) ApplicationContext를 사용하여 직접 가져올 수도 있습니다.
import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) context.getBean("sqlSessionFactory"); try (SqlSession session = sqlSessionFactory.openSession()) { // MyBatis SQL 실행 예시 // 예시: session.selectList("UserMapper.selectAllUsers"); } } }
외에도 mybatis-spring이라는 모듈을 추가로 사용하면 sqlSessionFactory를 사용하던 것을
SqlSessionTemplate을 사용해서 SqlSession을 사용한다.
또한 메퍼인터페이스를 사용하면 저렇게 세션을 명시적으로 열 필요도 없다.
이는 다음 글에서 설명하겠다.
'IT > 코딩히스토리_BE' 카테고리의 다른 글
[MyBatis] SqlSessionTemplate, 메퍼 인터페이스 (2) 2025.01.15 [MyBatis] MyBatis? (0) 2025.01.12 [SPRING BOOT] application.properties을 활용해 설정을 나누기 (0) 2024.01.24