본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Mybatis 에서 트랜젝션(commit, rollback) 수동 사용하기(SqlSessionFactory, TransactionFactory)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2022. 12. 12.

 

트랜젝션(Transaction) 설정은 스프링 프레임워크 구조에서 애노테이션(Annotation)이나 아니면 xml 같은 파일에서 설정하여 적용해서 사용하고는 합니다.

간혹 이와 다른 형태의 프로젝트를(사용자가 직접 메소드를 호출해서) 해야되는 경우 설정한거 같은데 동작을 안하는 경우를 만날 수 있습니다.

아래 코드처럼 사용자가 직접 메소드를 호출할 때 간혹 동작을 안할때가 있습니다.

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;

public class 테스트{
    SqlSessionFactory factory;

    public 테스트(SqlSessionFactory 가져온팩토리){
        this.factory = 가져온팩토리;
    }
    public void test(){
        SqlSession session = factory.openSession(false);
        session.insert("매퍼아디디", "저장데이터1");
        session.insert("매퍼아디디", "저장데이터2");
        session.rollback();	//왜 동작을 안하지...??
    }
}

 

분명히 openSession을 사용 할 때 논리값으로 false를 주면 오토커밋(auto commit)이 거짓(false)이 된 다고 나와 있습니다만..실제로 가져온 세션값에서 rollback이라는 메소드를 아무리 동작시켜도 무응답(?)일 때가 있습니다.

해당 이유는 사용하고 있는 세션팩토리 값에서의 트랜젝션 설정을 해 주지 않았기 때문 입니다.

 

기존의 애노테이션(Annotation)이나 아니면 xml 같은 파일에서 설정한 트랜젝션은 스프링이 쉽게 생성해 주기 때문에 별도의 정의 없이 사용할 수가 있습니다만..

이렇게 수동으로 하는 경우에는 개발자의 노력이 필요 합니다.

이런식으로 쉽게 사용했었죠...

 

스프링 부트를 예로 들면 아래처럼 DataSource 부터 SessionFactory까지 빈 객체를 생성할 때 아래처럼 추가적인 트랜젝션 설정을 해 주어야 합니다.

import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionTemplate;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
public class 데이터베이스설정{

    @Primary  
    @Bean(name = "datasource")
    @ConfigurationProperties(prefix = "spring.datasource")
    DataSource source() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "factory")
    SqlSessionFactory factory(@Qualifier("datasource") DataSource dt) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dt);
        factory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/*.xml"));  //사용할 매퍼를 읽습니다.
        factory.setConfiguration(getDefaultConfig());

        //바로 요 구간입니다~
        TransactionFactory trn= new JdbcTransactionFactory();
        trn.newTransaction(dt, null, false);  //트랜젝션 설정에서 기본 auto commit 값을 false로 해 줍니다.
        factory.setTransactionFactory(trn);

        return factory.getObject();
    }

    @Primary
    @Bean(name = "template")
    ISTemplate template(@Qualifier("factory") SqlSessionFactory sf) {
        return new SqlSessionTemplate(sf);
    }

}

 

위 코드처럼 팩토리(factory)를 생성하는 객체에 트랜젝션 팩토리(TransactionFactory) 클래스를 생성하여 팩토리(factory) 객체에 추가를 해 주어야 합니다.

  * 물론 해당 트랜젝션 팩토리 객체도 빈(Bean)으로 관리할 수 있습니다.

이렇게 해 준다면 맨 처음 보았던 코드에서 session.rollback(); 메소드가 정상적으로 동작하는 것을 볼 수 있습니다.

따로 트랜젝션 팩토리를 추가하지 않으면 기본 값이 적용되며, 기본 값 상태는 autoCommit 값이 true 입니다.

 

이상으로, 마이바티스에서 수동으로 트랜젝션 메소드를 호출 할 때 알아야 되는 부분에 대한 내용이였습니다!

궁금한점 또는 틀린 부분은 언제든 연락주세요!👻

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글