
SqlSession 만들어 보기
[ JAVA 로 만들어보기 ]

public class Template {
// Mybatis
public static SqlSession getSqlSession() {
//mybatis-config-xml 파일을 읽어 들여서 해당 DB와 접속된 SqlSession 객체를 생성해서 반환
SqlSession sqlSession = null;
// SqlSession 객체를 생성하기 위해서는 SqlSessionFactory 객체가 필요하다.
// SqlSessoinFactory 객체를 생성하기 위해서는 SqlSessionFactoryBuilder 객체가 필요하다.
// 즉, SqlSession → SqlSessionFactory → SqlSessionFactoryBuilder 객체가 필요
String resource = "/mybatis-config.xml"; // 최상의 폴더를 의미한다.
try {
// 내가 원하는 자원과 스트림(통로)을 연결
InputStream stream = Resources.getResourceAsStream(resource);
/* 1단계)
* new SqlSessionFactoryBuilder() : SqlSessionFactoryBuilder 객체를 생성
*
* 2단계)
* .build(stream) : 통로로부터 mybatis-config.xml 파일을 읽어 들여서
* SqlSessionFactory 객체를 만든다.
*
* 3단계)
* .openSession(false) : SqlSession객체 생성, 앞으로 트랜잭션 처리 시
* 자동으로 commit 할건지, 아닌지 여부를 결정
* openSession() == openSession(false)
* → false : 개발자가 직접 commit 하겠다.
* → true : 자동으로 commit 하겠다.
*
*/
sqlSession = new SqlSessionFactoryBuilder().build(stream).openSession();
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
[Spring Bean 등록]
- root-context.xml 의 일부분이다.
- DB 연결을 하면서 3단계에서 SqlSessionTemplate와 SqlSessionFactoryBean을 빈으로 등록하였다.
<!-- DB연결 2단계 작성 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
<!-- mybatis 설정파일 위치를 지정 (src/main/resources)-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 연결을 위한 도구 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- DB 연결 3단계 작성 -->
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
<!-- sql 명령어 실행을 위한 도구에 대한참조 -->
<constructor-arg ref="sqlSessionFactory"/>
</bean>
[사용 예시 - JAVA]
- Spring에서가 아닌 순수 자바로만 구현 한 것입니다.
- 위에 있는 JAVA로 만들어보기에 getSqlSession() 메소드를 구현해 놨습니다.

[사용 예시 - Spring]
- 빈 등록을 해놨으니 주입을 받아서 사용합니다.

SqlSession 메소드
- sqlSession에서 제공하는 메소드를 통해서 sql문을 찾아서 실행하고 결과를 바로 받아볼 수 있다.
[사용 예시]
sqlSession.sql문 종류에 맞는 메소드("메퍼파일의 namespace.해당 sql문 고유한 id", 파라미터 변수);
sqlSession.insert("memberMapper.insertMember", MemberVo(생략 가능));

Tip) <mapper namespace="org.mybatis.example.BlogMapper"> 와 같이 클래스 경로처럼 작성해주는게 최신 작성 방법이다.
[실제 사용 코드]

SqlSession 과 SqlSessionTemplate 의 차이
SqlSession
- SqlSessionFactory를 통해서 단순하게 생성된다.
- 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할 수 있다.
- 필요하지 않는 상태가 되면 세션을 닫는다.
- 스프링 트랜잭션 설정에 따라 자동으로 커밋 혹은 롤백을 수행하고 닫혀지는, 쓰레드에 안전한 SqlSession 개체가 스프링 빈에 주입될 수 있다.
- 즉, 단순하게 SqlSessionFactory를 통해 단순하게 생성된 아이여서 Thread-Safe를 지원하지 않아 요청마다 객체 생성과 close를 해주어야 한다.
SqlSessionTemplate
- 마이바티스 스프링 연동 모듈의 핵심이다.
- SqlSession 인터페이스를 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.
- 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할 수 있다.
- getMapper()에 의해 리턴된 매퍼가 가진 메소드를 포함해서 SQL을 처리하는 마이바티스 메소드를 호출할 때 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다.
- 예외를 스프링의 DataAccessException으로 변환하는 작업 또한 처리한다.
- 마이바티스의 디폴트 구현체인 DefaultSession 대신 항상 사용된다.
: 왜냐하면 템플릿은 스프링 트랜잭션의 일부처럼 사용될 수 있고 여러개 주입된 매퍼 클래스에 의해 사용되도록 쓰레드에 안전하다.
: 동일한 어플리케이션에서 두개의 클래스 간의 전환은 데이터 무결성 이슈를 야기할 수 있다. - SqlSessionTemplate은 생성자 인자로 SqlSessionFactory를 사용해서 생성될 수 있다.
- 즉, SqlSession 인터페이스를 구현하고, thread-Safe, 트랙잭션 관리용 이라고 보면 된다.
'Spring boot > Spring boot 실무와 공부' 카테고리의 다른 글
MyBatis 3.0 이전버전의 DAO와 SqlSessionTemplate, SqlSessionDaoSupport.0 (0) | 2023.08.11 |
---|---|
SqlSessionTemplate/MapperInterface 두가지 방식에 따른 전체적인 구조 차이와 Mapper.xml 속성 차이에 대해 정리합니다. (0) | 2023.08.11 |
MyBatis VS JPA/Hibernate 차이점 (0) | 2023.08.11 |