[Spring MVC] 트랜잭션(Transaction)

✏️ 트랜잭션(Transaction)이란?
- 트랜잭션은 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위를 의미 한다.
- ACID 원칙
1) 원자성(Atomicity)
트랜잭션에서의 원자성(Atomicity)이란 작업을 더 이상 쪼갤 수 없음을 의미 한다.
따라서 논리적으로 하나의 작업으로 인식해서 둘 다 성공하든 둘 다 실패하든가(All or Nothing)의 둘 중 하나로만 처리되는 것이 보장된다.
2) 일관성(Consistency)
일관성(Consistency)은 트랜잭션이 에러 없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는 대로 일관성 있게 저장되거나 변경되는 것을 의미 한다.
3) 고립성(Isolation)
고립성(Isolation)은 여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함을 의미 한다.
4) 지속성(Durability)
지속성(Durability)은 여러분들이 잘 알고 있다시피 데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되어 지속적으로 유지되어야 한다는 의미 한다.
- 커밋(commit)
1) 커밋(commit)은 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어로써 commit 명령을 수행하면 변경된 내용이 데이터베이스에 영구적으로 저장된다.
2) 만약 commit 명령을 수행하지 않으면 작업의 결과가 데이터베이스에 최종적으로 반영되지 않는다.
3) commit 명령을 수행하면, 하나의 트랜젝션 과정은 종료하게 된다.
- 롤백(rollback)
1) 롤백(rollback)은 작업 중 문제가 발생했을 때, 트랜잭션 내에서 수행된 작업들을 취소한다.
2) 따라서 트랜잭션 시작 이 전의 상태로 되돌아간다.
- JPA 기술을 사용한 데이터베이스와의 인터랙션은 내부적으로는 JDBC API를 통해서 이루어진다.
✏️ 선언형 방식의 트랜잭션 적용
- 트랜잭션 관련 설정은 Spring Boot이 내부적으로 알아서 해주기 때문에 개발자가 직접적으로 트랜잭션 설정해 줄 필요가 없다.
- Spring에서는 일반적으로 애너테이션 방식( @Transactional )의 트랜잭션과 AOP 방식의 트랜잭션 적용 방식을 사용한다.
- 체크 예외(checked exception)는 @Transactional 애너테이션만 추가해서는 rollback이 되지 않으며, @Transactional(rollbackFor = {SQLException.class, DataFormatException.class})와 같이 해당 체크 예외를 직접 지정해 주거나 언체크 예외(unchecked exception)로 감싸야 rollback 기능을 적용할 수 있다.
- 트랜잭션 전파란 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식을 의미한다.
- @Transactional 애너테이션의 isolation 애트리뷰트를 통해 트랜잭션 격리 레벨을 지정할 수 있다.