Spring
[Spring] @Transaction을 알아보자
chlalswns200
2023. 11. 12. 00:11
Spring 프로젝트를 예시를 보다 보면 Repository에 있는 @Transaction을 만나게 된다.
트랜잭션 그리고 @Transaction을 정리한다

트랜잭션
1. 정의
데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다. 데이터의 정합성을 보장하기 위해 고안된 방법이다.
목적
- 오류로부터 복구를 허용하고 데이터베이스를 일관성있게 유지하는 안정적인 작업 단위를 제공한다.
- 동시 접근하는 여러 프로그램 간 격리를 제공한다
2. ACID
이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장한다. 이 성질을 첫글자를 따 ACID라 부른다
- 원자성(Atomicity) :
트랜잭션이 완전히 성공하거나 완전히 실패하는 단일 단위로 처리되도록 보장하는 능력이다. 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다. - 일관성(Consistency): 각 데이터 트랜잭션이 데이터베이스를 일관성 있는 상태에서 일관성 있는 상태로 이동해야 함을 의미한다. 즉 트랜잭션이 성공적으로 완료하면 언제나 동일한 데이터베이스 상태로 유지하는 것을 의미한다.
- 독립성(Isolation): 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 여러 트랜잭션이 동시에 발생하는 경우 최종 상태는 트랜잭션이 개별적으로 발생한 것과 같아야 한다. 즉, 데이터베이스는 스트레스 테스트를 통과해야 한다. 즉, 과부하로 인해 잘못된 데이터베이스 트랜잭션이 발생하지 않아야 한다.
- 지속성(Durability) : 성공적으로 수행된 트랜잭션은 영원히 반영(기록)되어야 함을 의미한다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다. 데이터베이스 내의 데이터는 트랜잭션의 결과로만 변경되어야 하며 외부 영향에 의해 변경될 수 없어야 한다. 예를 들어 소프트웨어 업데이트로 인해 데이터가 실수로 변경되거나 삭제되지 않아야 한다.
3. 트랜잭션 과정
- 트랜잭션 시작
- 비즈니스 로직 실행(여러 쿼리들이 실행) (DB내 갱신이 아직 적용되지 않는다)
- 트랜잭션 커밋 (트랜잭션이 성공적이며, 갱신이 실제 적용됨)
만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다.
이제부터 JDBC 트랜잭션의 이해부터 시작해서 Spring에서의 트랜잭션으로 넘어가보자.
JDBC 트랜잭션
import java.sql.Connection;
Connection connection = dataSource.getConnection(); // (1)
try (connection) {
connection.setAutoCommit(false); // (2)
// 비즈니스 로직 수행
connection.commit(); // (3)
} catch (SQLException e) {
connection.rollback(); // (4)
}
- DB와 연결한다.
- Java에서 데이터베이스의 트랜잭션을 시작하는 유일한 방법. setAutoCommit(true)는 모든 SQL statement를 래핑한다. 즉, JDBC 라이브러리 룰에 따라 자동으로 커밋, 롤백 즉 트랜잭션이 이뤄진다. setAutoCommit(false)는 이와 반대로 트랜잭션을 내가 관리한다. 즉 제어를 내가하고 내가 원할 때 커밋 또는 롤백합니다. 다만 commint의 begin()은 setAutoCommit(false) 호출과 동시에 시작됩니다.
- 명시적으로 commit 한다.
- 예외 발생시 rollback 한다.
setAutoCommit(false)를 쓰는 이유
작업 단위를 개발자가 직접 설정하게되면서 원하는 곳에서 rollback을 발생시킬 수 있다.
JDBC의 단점
- Connection 오브젝트를 한번 생성 후 계속 메소드의 파라미터로 전달하다가 DAO를 호출할 때 사용한다.
- 데이터 접근 기술에 의존적인 코드
- 순수 비즈니스 로직과는 다른 관심사의 일(DB 접근 관련)을 수행한다. 코드가 깔끔하지 않다.
JDBC는 이러한 단점들을 가지고 있다. 하지만 이러한 단점을 우리는 Spring Transaction으로 해결 할 수 있다.
해당 방식은 java에서 트랜잭션을 하는 유일한 방법이기에 Spring Transaction또한 방법은 동일하다.
Spring Transaction