이야기박스

Spring. SpringJDBC - ibatis 환경에서 Transaction 진행 본문

Programming Language/Spring

Spring. SpringJDBC - ibatis 환경에서 Transaction 진행

박스님 2019. 10. 18. 16:53
반응형

# 개요

Spring Core로 동작하는 webapp 프로젝트를 최근에 진행하게 되었습니다. DB와 커넥션은 SpringJdbc + ibatis를 이용하게 되었고, 여러 TABLE에 데이터를 한 배치에 INSERT 해야 하는 기능이 필요하였습니다.

 

마침 이전 Spring Study에서 @Transactional을 사용했던 기억이 나, 시도를 했었는데 기대했던 대로 동작하지 않았었습니다.

@Transactional(value = "myTransaction")
    private boolean transactionInsert(Object vo1, Object vo2) {

        try {
            mapper.insertFirst(vo1);
            mapper.insertSecond(vo2);
        } catch (Exception e) {
            log.error("Transactional Insert is failed : {}", e.getMessage());
            return false;
        }

        return true;
    }

이번 포스팅은 @Transactional의 미 동작 원인과 Spring + ibatis의 트랜잭션을 구현하는 내용을 담도록 하겠습니다.

# 원인

Bean 자체는 정상적으로 등록된 것이 확인되었고 "tx" Namepsace를 통한 어노테이션도 활성화 했었습니다.

원인은 ibatis의 동작 방식과 관련이 있을 것이라 생각되었습니다.

 

## Mybatis(ibatis)

Spring에서 동작하는 Mybatis의 동작 프로세스는 다음과 같습니다.

spring-mybatis 동작 아키텍처

1. Spring Interface에서 선언해둔 @Repository에서 Mybatis(Mapper)에 동작 요청을 함

2. Mybatis에서 Spring JDBC에서 생성해둔 Datasource / JDBC Basic API를 획득

3. JDBC Driver 호출해서 DB와 작업

 

여기서 (2.)에서 문제가 발생한 것으로 예상되었습니다. MyBatis가 각각 요청을 할 때마다 별개의 세션을 가져오기 때문에 트랜잭션이 적용되지 않았던 것 같습니다.

# 조치

해결 방법으로는 두 가지가 있을 것 같습니다.

 

1. 포인트 컷을 적용하여 Mapper 단위로 트랜잭션을 적용하는 방법

2. TransactionTemplate을 이용하여 코드 레벨에서 트랜잭션을 적용하는 방법

 

트랜잭션이 자주 필요한 환경이면 첫 번째 방법으로 했을 테지만, 한 곳에서만 사용될 예정이라 두 번째 방법으로 구현하였습니다.

@Autowired
@Qualifier("myTransactionTemplate")
TransactionTemplate transactionTemplate;
    
private boolean transactionInsert(Object vo1, Object vo2) {
        return transactionTemplate.execute(transactionStatus -> {
            try {
                mapper.insertFirst(vo1);
                mapper.insertSecond(vo2);
            } catch (Exception e) {
                log.error("Transactional Insert is failed : {}", e.getMessage());
                transactionStatus.setRollbackOnly();
                return false;
            }

            return true;
        });
    }

 

# 리뷰

스프링 스터디를 시작했던 게 작년 이맘때였던 것 같습니다. 그동안 스프링 프로젝트를 한동안 안 하게 되어서 많이 잊어버렸는데, 다시 복습을 시작해야 할 때인 것 같습니다.

 

# 참고자료

Spring Transaction

 

Chapter 6. AOP(3) 포인트 컷과 트랜잭션

포인트컷이란? 특정 조건에서 어드바이스(공통 기능의 코드)를 실행하기 위한 알고리즘입니다. 즉, 횡단 공통기능을 수행하기 위한 필터라고 생각하면 쉬울 것 같습니다. 1. 스프링 트랜잭션 어노테이션 포인트 컷..

box0830.tistory.com

Mybatis

 

[BE] Spring : MyBatis 기초 및 설정

1. MyBatis1) 정의 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 ...

blog.naver.com

반응형

'Programming Language > Spring' 카테고리의 다른 글

(작성중) Spring. HttpMessageConverters  (0) 2019.11.28
(작성중) Spring Test & JUNIT  (0) 2019.11.15
Spring - Filter  (0) 2019.08.13
Spring JPA. Batch Insert 에러  (0) 2019.03.28
Chapter 8. 스프링이란 무엇인가?  (0) 2019.03.22