이전에 Spring AOP와 Proxy를 공부한 이유는 사실 @Transactional
에 대해서 자세히 다뤄보고 싶어였다.
관련 내용은 아래 링크에서 확인할 수 있다.
Spring AOP와 Proxy
그렇기에 오늘은 Transactional에 대해서 공부하고 정리해보려고한다.
Transaction?
먼저 트랜잭션에 대해서 알아보자.
본래 뜻은 “거래”이며, 보통 “업무 처리의 최소 단위” 또는 “하나의 논리적인 작업 단위”로 부른다.
이는 트랜잭션이 하나의 작업을 처리하면서 더 이상 쪼개질 수 없는 명령들의 모임이며, 한 번에 실행되어야 하는 명령들의 모임이기 때문이다.
트랜잭션을 중요시하며 사용하는 이유가 뭘까?
이는 트랜잭션이 아래 **ACID 원칙
**을 보장하기 때문이다.
- 원자성 (A; Atomicity)
- 원자성은 트랜잭션 내의 각 명령이 일부만 성공하거나 실패하지 않도록 하는 성질이다.
- 트랜잭션이 정상적으로 처리 되었을 때는 **커밋(commit)**하여 작업을 완료하고, 오류가 발생했을 때는 **롤백(rollback)**으로 작업을 실행하기 전 상태로 복구 할 수 있기 때문에 작업 전체가 성공하거나 실패하거나의 선택지만 존재한다.
- 일관성 (C; Consistency)
- 일관성은 트랜잭션 처리 전과 처리 후 데이터에 모순이 없게 유지하도록 하는 성질이다.
- 정합성이라고도 불리며, 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 변경되지 않은 데이터베이스를 바탕으로 작업을 수행하기 때문에 데이터의 일관성을 유지할 수 있다.
- 독립성 (I; Isolation)
- 독립성은 트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 성질이다.
- 격리라고도 부르며, 트랜잭션의 완료되기 전 까지 다른 트랜잭션은 특정 트랜잭션의 결과를 참조할 수 없다는 의미이다.
- 이와 관련된 격리 수준, 낙관적 락, 비관적 락에 대해서도 아래에서 다뤄볼 예정이다.
- 영속성 (D; Durability)
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다는 성질이다.
- 지속성이라고도 불리며, 말 그대로 정상적으로 수행된 트랜잭션은 영구적으로 데이터베이스에 반영되어야 한다는 의미이다.
@Transactional?
@Transactional 어노테이션은 Spring에서 데이터 작업의 실행단위를 명시하기 위해 사용된다고 볼 수 있다.
사용법