✨ 트랜잭션
- DB 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 한꺼번에 모두 수행되어야 할 일련의 연산들
트랜잭션은 데이터베이스, 메시지 큐 등 다양한 자원에서 다양한 로직을 수행한다. 때로는 여러가지 작업이 한 트랜잭션에서 일어나기를 원할 수도 있다. Java에는 자원에 접근하고 수행하는 여러 방법들을 지원한다. 각 자원마다 따로 로컬 트랜잭션을 수행할 수도 있고 여러 자원들이 한 글로벌 트랜잭션에 참여할 수도 있다. 이 문장이 어떤 의미인지는 앞으로의 글을 읽으며 천천히 이해해보자.
🌏 Local Transaction
로컬 트랜잭션을 한번 알아보기 위해 여러 자원들 중에서도 우리에게 친숙한 JDBC를 이용해서 살펴보자. JDBC는 Java Database Connectivity의 약자로 자바에서 DB에 접근할 수 있게 정의해준 API이다. 여러가지 DB 업체에서는 자신이 제공하는 DB에 연결할 수 있도록 JDBC 드라이버를 제공한다. (자세한 설명은 JDBC가 등장한 이유 참고)
Connection 오브젝트는 auto-commit이 디폴트 설정이지만 이를 내 마음대로 변경할 수도 있다. 그리고 해당 Connection으로부터 여러 명령을 실행시키고 커밋/롤백을 선언할 수 있다. 이를 트랜잭션 경계를 설정한다고도 표현하는데 트랜잭션 경계는 트랜잭션을 적용할 시작 지점부터 끝 지점까지의 범위를 의미한다.
try {
connection.setAutoCommit(false);
// PreparedStatement 실행 1
// PreparedStatement 실행 2
// PreparedStatement 실행 3
connection.commit();
} catch (Exception e) {
connection.rollback();
}
위에서 로컬 트랜잭션을 이용해 단일 리소스 내에서 여러 작업을 수행할 수 있는 것을 알아보았다. 헌데 위 방법은 JDBC 기술인 Connection을 이용해 이용한 방법이다. JDBC 외에 JPA나 JMS 등에서는 사용할 수 없다. 각각의 기술들도 저마다 트랜잭션 경계를 설정하는 방법이 존재하지만 하나의 기술에 의존된다는 사실은 변함이 없다. 하나가 아닌 여러 자원을 동시에 사용하는 경우라면? JDBC, JPA를 둘 다 사용하는데 하나의 트랜잭션 안에서 작업되어야 한다면 어떻게 해야할까?
🌌 Global Transaction
하나의 트랜잭션을 다양한 자원들과 사용하고 싶은 경우에는 Global Transaction을 이용하면 된다. 글로벌 트랜잭션은 Transaction Manager에 의해 관리되는데 이를 지원하기 위해 Spring에서는 PlatformTransactionManager라는 추상 인터페이스를 제공한다.
JDBC를 활용하는 경우에는 DataSourceTransactionManager, JPA를 활용하는 경우에는 JpaTransactionManager 등 다양한 구현체가 존재한다. 여러 자원을 활용하는 경우에는 JtaTransactionManager를 활용한다.
❓ JTA란?
XA는 여러 자원에서 트랜잭션을 제어하는 트랜잭션 매니저를 정의하는 사양 중 하나이다. Java는 이를 JTA를 통해 지원한다. JTA는 트랜잭션 관리자와 트랜잭션 간의 표준 Java 인터페이스를 지정한다
😄 함께 읽으면 좋은 글
참고
- https://www.baeldung.com/java-transactions
- 토비의 스프링 3.1 / Chapter 5 서비스 추상화
'Develop > Spring+JPA' 카테고리의 다른 글
[Spring] @Transactional이 동작하지 않는다?😨 (0) | 2022.10.27 |
---|---|
[Spring Boot] 기본 Logging Framework는 진짜 'Logback'일까? (0) | 2022.10.13 |
[Spring] 내 테스트에만 stub 적용하기 😈 (2) | 2022.10.03 |
[Spring] DispatcherServlet (0) | 2022.09.28 |
[토비의 스프링] Chapter 1. 오브젝트와 의존관계 (0) | 2022.09.10 |