이야기박스
Spring. SpringJDBC - ibatis 환경에서 Transaction 진행 본문
# 개요
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의 동작 프로세스는 다음과 같습니다.
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;
});
}
# 리뷰
스프링 스터디를 시작했던 게 작년 이맘때였던 것 같습니다. 그동안 스프링 프로젝트를 한동안 안 하게 되어서 많이 잊어버렸는데, 다시 복습을 시작해야 할 때인 것 같습니다.
# 참고자료
'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 |