1. 트랜잭션(Transaction)이 무엇인지 이해할 수 있다.
2. 트랜잭션(Transaction) 경계가 무엇인지 이해할 수 있다.
3. Spring에서 지원하는 트랜잭션 처리 방식 중 선언형 방식에 대해 이해할 수 있다.
- 트랜잭션 개요
✔︎ 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
✔︎ Atomicity (원자성)
✔︎ Consistency (일관성)
✔︎ Isolation (고립성)
✔︎ Durability (지속성)
✔︎ 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어
✔︎ 변경된 내용이 데이터베이스에 영구적으로 저장
✔︎ commit을 수행하지 않으면, 작업 결과가 데이터베이스에 최종적으로 반영 ❌
✔︎ commit을 수행하면, 하나의 트랜잭션 과정 종료
✔︎ 작업 중 문제가 발생하였을 때, 트랜잭션 내에서 수행된 작업들을 취소
✔︎ 트랜잭션 시작 이전의 상태로 되돌아감
✔︎ JPA 기술을 사용한 데이터베이스 인터렉션은 내부적으로는 JDBC API를 통해 이루어짐
- Spring Framework에서의 트랜잭션 처리 - 선언형 방식
✔︎ Spring Boot에서 자동 설정
✔︎ Spring Boot를 사용하지 않을 경우, Spring Configuration 클래스 직접 추가
✔︎ 로컬 트랜잭션
✔︎ 분산 트랜잭션
✔︎ 선언형 트랜잭션 방식
✔︎ 프로그래밍 코드 베이스 트랜잭션 방식
✔︎ 비즈니스 로직에 애너테이션을 추가하는 방식
✔︎ AOP 방식을 이용하여 비즈니스 로직에서 아예 트랜잭션 적용 코드 자체를 감추는 방식
✔︎ 클래스 레벨에 @Transactional
적용
✔︎ 메서드 레벨에 @Transactional
적용
@Transactional(readOnly = true)
: 읽기 전용 트랜잭션✔︎ 클래스 레벨과 메서드 레벨의 트랜잭션 적용 순서
@Transactional
이 적용된 경우@Transactional
적용 ❌ → 클래스 레벨의 @Transactional
적용✔︎ 체크 예외 (checked exception)
@Transactional
만 추가해서 rollback되지 않음@Transactional(rollbackFor = {SQLException.class, DataFormatException.class})
와 같이 해당 체크 예외 직접 지정✔︎ 여러 작업이 하나의 트랜잭션으로 묶이는 경우
@Transaction(propagation = )
애트리뷰트 유형Propagation.REQUIRED
Propagation.REQUIRES_NEW
Propagation.MANDATORY
Propagation.NOT_SUPPORTED
Propagation.NEVER
※ 다양한 Propagation 유형을 지원하지만, 작업별로 트랜잭션을 새로 생성하거나 특정 작업에는 트랜잭션을 허용하지 않는 경우가 아니라면 @Transaction
애너테이션만 추가해도 무방
@Transaction(isolation = )
애트리뷰트 유형Isolation.DEFAULT
Isolation.READ_UNCOMMITED
Isolation.READ_COMMITED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
✔︎ 적용 순서
@Configuration
애너테이션 추가TransactionManager
DITranscationManager
객체를 DI 받음TransactionInterceptor
Bean 등록TransactionInterceptor
객체 생성Advisor
Bean 등록Advisor
객체 생성☞ 트랜잭션은 앞서 접한 경험이 있어 ACID까지의 내용을 이해하는 데는 크게 어려움이 없었다. 그러나 Spring Framework에서의 트랜잭션 처리에 들어오고 나니 처음 보는 여러 메서드들이 많았고, 적용 구조를 이해하는 데에 어려움이 있었다. (특히, AOP 방식...) 그래도 애너테이션 방식이든, AOP 방식이든 직접 코드로 작성해보며 이해해나가려 노력했다.
오늘은 Spring에서의 트랜잭션 처리 방식 중 하나인 선언형 방식의 애너테이션 방식, AOP 방식에 대해 알아보았다. 다음 시간에 좀 더 보충해 내용을 공부하고 트랜잭션 적용 실습을 해보며 Spring 트랜잭션과 좀 더 친해져보도록 하겠다.
・ JTA를 이용한 분산 트랜잭션 적용
・ 트랜잭션 적용 실습