MyBatis + Spring에서 SqlSessionTemplate을 이용해 DB를 다루는 방법
SqlSessionTemplate은 MyBatis의 SqlSession 기능을 Spring Framework 환경에 맞게 구현한 템플릿 클래스이다.SqlSession이 제공하는 select, insert, update, delete 기능을 감싸면서, 스프링의 트랜잭션 동기화, 예외 변환 처리, 자원 해제를 자동으로 관리해준다.SqlSessionFactory.openSession()으로 세션을 열거나 닫는 코드를 작성할 필요 없이, 템플릿 메서드를 호출하는 것만으로 DB 작업이 가능해진다.| 항목 | 설명 |
|---|---|
| 트랜잭션 연동 | 스프링 트랜잭션 매니저와 연동되어 동일한 트랜잭션 범위 내에서 작업을 수행한다. |
| 자원 자동 해제 | SQL 실행 후 Connection, PreparedStatement, ResultSet 객체를 자동으로 해제한다. |
| 예외 일괄 변환 | SQLException을 Spring의 DataAccessException 하위 예외로 변환하여 처리 일관성을 유지한다. |
| 스레드 안전성 | 다중 스레드 환경에서도 안전하게 사용할 수 있도록 설계되어 있다. |
| 메서드 | 설명 |
|---|---|
insert(String statement, Object parameter) | SQL INSERT 문을 실행하고 영향받은 행 수를 반환한다. |
update(String statement, Object parameter) | SQL UPDATE 문을 실행하고 수정된 행 수를 반환한다. |
delete(String statement, Object parameter) | SQL DELETE 문을 실행하고 삭제된 행 수를 반환한다. |
selectOne(String statement, Object parameter) | SQL SELECT 문을 실행하여 1건만 반환한다. (여러 건일 경우 예외 발생) |
selectList(String statement, Object parameter) | SQL SELECT 문을 실행하여 다수의 레코드를 리스트로 반환한다. |
Mapper XML 파일은 SQL 문을 정의하는 파일로, Java 코드에서 쿼리를 직접 작성하는 대신 XML로 관리한다.
이로 인해 SQL 가독성과 유지보수성이 향상된다.
<mapper namespace="mybatis">
<insert id="m1">
INSERT INTO address (name, age, gender)
VALUES ('홍길동', 25, 'm')
</insert>
<delete id="m2" parameterType="String">
DELETE FROM address WHERE seq = #{seq}
</delete>
<select id="m5" resultType="int">
SELECT COUNT(*) FROM address
</select>
<select id="m6" parameterType="String" resultType="com.test.mybatis.model.AddressDTO">
SELECT * FROM address WHERE seq = #{seq}
</select>
</mapper>
| 항목 | 설명 |
|---|---|
| SQL 분리 | Java 코드와 SQL 문을 명확히 분리하여 가독성과 유지보수성을 향상시킨다. |
| 객체 자동 매핑 | SELECT 결과를 DTO 객체로 자동 변환하여 코드 작성을 간소화한다. |
| 트랜잭션 통합 | 스프링 트랜잭션(@Transactional)과 자연스럽게 통합된다. |
| 자원 자동 관리 | 커넥션(Connection), 스테이트먼트(Statement), 결과셋(ResultSet)을 자동으로 해제한다. |
| 예외 변환 | JDBC의 SQLException을 Spring의 일관된 예외 계층으로 변환하여 처리한다. |
| 스레드 안전성 | 다중 요청 환경에서도 안전하게 작동하도록 보장한다. |