1. SqlSession이란?
- SqlSession은 MyBatis의 핵심 객체로, 데이터베이스 작업(SQL 실행, 트랜잭션 관리 등)을 담당합니다.
- 역할:
- SQL 실행: SELECT, INSERT, UPDATE, DELETE 쿼리를 실행합니다.
- 트랜잭션 관리: 데이터베이스 작업의 시작과 종료를 관리합니다.
- 매핑 작업: SQL 결과를 자바 객체로 매핑합니다.
2. SqlSession 사용 흐름

- SqlSessionFactory 생성:
SqlSession 객체를 생성하기 위한 팩토리 클래스.
- MyBatis 설정 파일과 데이터 소스를 기반으로 초기화.
- SqlSession 생성:
openSession() 메서드로 SqlSession 객체를 생성.
- SQL 실행:
- SQL ID와 파라미터를 전달하여 쿼리 실행.
- 결과 매핑:
- 트랜잭션 처리:
commit() 또는 rollback() 메서드로 트랜잭션을 처리.
- SqlSession 종료:
3. SqlSessionFactory
3.1 역할
SqlSession 객체를 생성하는 팩토리 클래스.
- MyBatis 설정 파일(
mybatis-config.xml)과 데이터 소스를 기반으로 구성됩니다.
3.2 생성 방법
- 직접 생성:
SqlSessionFactoryBuilder를 사용하여 MyBatis 설정 파일에서 생성.
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- Spring에서 생성:
- Spring Boot에서는
SqlSessionFactoryBean을 통해 자동으로 생성.
4. SqlSession 주요 메서드
4.1 SQL 실행 관련 메서드
| 메서드 | 설명 |
|---|
selectOne(String statement) | 단일 행 결과 조회. |
selectList(String statement) | 다중 행 결과를 리스트로 반환. |
insert(String statement) | 데이터 삽입. |
update(String statement) | 데이터 업데이트. |
delete(String statement) | 데이터 삭제. |
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
User user = sqlSession.selectOne("com.example.mapper.UserMapper.findUserById", 1);
System.out.println(user.getName());
}
4.2 트랜잭션 관련 메서드
| 메서드 | 설명 |
|---|
commit() | 트랜잭션 커밋. |
rollback() | 트랜잭션 롤백. |
close() | SqlSession을 닫아 자원을 해제. |
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
sqlSession.update("com.example.mapper.UserMapper.updateUser", user);
sqlSession.commit();
}
4.3 Mapper 인터페이스 사용
SqlSession의 getMapper() 메서드를 통해 Mapper 인터페이스를 쉽게 호출할 수 있습니다.
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user.getName());
}
5. Spring과 SqlSession
5.1 SqlSessionFactoryBean
- Spring 환경에서는
SqlSessionFactoryBean을 사용해 SqlSessionFactory를 생성합니다.
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));
return factoryBean.getObject();
}
5.2 MyBatis와 Spring 통합 방식
- 자동 Mapper 등록:
@MapperScan을 통해 Mapper 인터페이스를 스캔하고 SqlSession과 연결.
@MapperScan("com.example.mapper")
@SpringBootApplication
public class MyBatisApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisApplication.class, args);
}
}
- SqlSession 직접 사용:
SqlSessionFactory를 주입받아 SqlSession을 직접 생성하고 사용.
@Service
public class UserService {
private final SqlSessionFactory sqlSessionFactory;
@Autowired
public UserService(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User getUserById(int id) {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
return sqlSession.selectOne("com.example.mapper.UserMapper.findUserById", id);
}
}
}
6. SqlSession 이해하기
6.1 SqlSession의 역할
- 데이터베이스 작업의 중간 관리자:
- 개발자가 SQL을 실행하고 결과를 처리할 수 있도록 환경을 제공합니다.
- 짧은 생명주기:
- 각 작업마다 새롭게 생성되며, 사용 후 즉시 종료해야 합니다.
6.2 SqlSessionFactory와 SqlSession의 관계
- SqlSessionFactory는 공장:
- 애플리케이션 전체에서 공유되며,
SqlSession을 생성하는 역할을 합니다.
- SqlSession은 공장에서 나오는 제품:
- 하나의 데이터베이스 작업을 처리한 후 폐기됩니다.
6.3 트랜잭션 처리
SqlSession은 작업 단위(Unit of Work)를 관리합니다.
- 트랜잭션 커밋 또는 롤백을 통해 데이터 무결성을 보장합니다.

7. SqlSession과 관련된 주요 클래스 및 용어
| 클래스/용어 | 설명 |
|---|
| SqlSession | SQL 실행, 결과 매핑, 트랜잭션 관리 담당. |
| SqlSessionFactory | SqlSession을 생성하는 팩토리 클래스. |
| SqlSessionFactoryBean | Spring에서 SqlSessionFactory를 생성하기 위한 설정 클래스. |
| Mapper 인터페이스 | SQL과 자바 메서드 간의 연결 인터페이스. |
| Mapper XML | SQL 쿼리를 정의하는 XML 파일. |

8. 학습 포인트 요약
- SqlSession의 역할:
- SqlSessionFactory와의 관계:
SqlSession은 팩토리(SqlSessionFactory)에서 생성됨.
- Spring 통합:
- Spring Boot에서는
SqlSessionFactoryBean을 통해 자동으로 설정 가능.
- 트랜잭션 관리:
commit(), rollback() 메서드로 작업의 무결성 보장.
- Mapper 인터페이스 사용:
- SQL 호출을 간소화하며, 스프링과의 통합을 통해 더욱 효율적인 작업 가능.