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, 트랙잭션 관리용 이라고 보면 된다.

+ Recent posts