@transactional 데코레이터는 메서드를 자동으로 트랜잭션으로 감싸주어 보일러플레이트 코드를 줄여줍니다.
데코레이터 개요
자동 트랜잭션
메서드 실행을 자동으로 트랜잭션으로 감쌈 성공 시 커밋, 실패 시 롤백
코드 간결화
transaction() 호출 불필요 가독성 향상
Isolation Level
트랜잭션 격리 수준 설정 동시성 제어
중첩 트랜잭션
자동 컨텍스트 공유 Savepoint 지원
기본 사용법
Before: 수동 트랜잭션
After: @transactional 데코레이터
@transactional() 데코레이터가 적용된 메서드는 자동으로 트랜잭션 내에서 실행됩니다.작동 원리
데코레이터 옵션
dbPreset 설정
Isolation Level 설정
실전 예제
예제 1: 단순 트랜잭션
예제 2: 자동 롤백
예제 3: 복잡한 트랜잭션 (Company → Dept → Employee)
예제 4: 동시성 제어
중첩 트랜잭션
자동 컨텍스트 공유
중첩 트랜잭션의 이점: - 코드 재사용성 향상 - 메서드 조합 자유로움 - 트랜잭션 경계 자동 관리
중첩 트랜잭션 메커니즘 상세
Sonamu의 중첩 트랜잭션은 트랜잭션 컨텍스트 공유 방식으로 동작합니다.트랜잭션 컨텍스트 공유
outerMethod실행 → 트랜잭션 A 시작innerMethod호출 → 기존 트랜잭션 A 감지innerMethod는 새 트랜잭션을 시작하지 않고 A를 재사용innerMethod종료 → 커밋하지 않음outerMethod종료 → 트랜잭션 A 커밋
Savepoint는 생성되지 않음
Sonamu는 Savepoint를 자동으로 생성하지 않습니다. 모든 중첩된 메서드가 같은 트랜잭션을 공유하므로:methodB에서 에러 발생 → 전체 트랜잭션 롤백methodA의 users INSERT도 롤백됨- Savepoint가 없으므로 부분 롤백 불가
Savepoint가 필요한 경우
부분 롤백이 필요하면 수동으로 Savepoint를 관리해야 합니다:- 선택적 작업이 실패해도 메인 작업은 성공시켜야 할 때
- 여러 단계의 작업 중 일부만 롤백하고 싶을 때
- 복잡한 비즈니스 로직에서 부분 실패 처리가 필요할 때
트랜잭션 컨텍스트 확인
현재 실행 중인 트랜잭션이 있는지 확인하는 방법:중첩 레벨 제한 없음
Sonamu는 중첩 레벨에 제한이 없습니다:커밋 시점
오직 최상위 트랜잭션만 커밋합니다:권장 사항: - 간단한 중첩:
@transactional 자동 공유 사용 - 복잡한 로직: 수동 Savepoint 관리
고려 - 에러 처리: 최상위 메서드에서 처리@api와 함께 사용
데코레이터 조합
장단점
장점
코드 간결화
transaction() 호출 불필요 보일러플레이트 제거
가독성
트랜잭션 경계 명확 비즈니스 로직에 집중
자동 관리
커밋/롤백 자동 처리 실수 방지
재사용성
메서드 조합 용이 중첩 트랜잭션 지원
단점
제약사항
메서드 레벨에서만 사용 부분 트랜잭션 불가
디버깅
트랜잭션 경계가 숨겨짐 문제 추적 어려울 수 있음
사용 가이드
언제 사용하나?
✅ 사용 권장:- 메서드 전체가 하나의 트랜잭션
- 여러 DB 작업이 원자성 필요
- 코드 재사용이 중요한 경우
- API 핸들러 메서드
- 메서드 내 부분적 트랜잭션
- 복잡한 트랜잭션 제어 필요
- 트랜잭션 경계가 명확해야 하는 경우
패턴 비교
주의사항
흔한 실수
다음 단계
수동 트랜잭션
transaction() 직접 사용하기
모범 사례
트랜잭션 사용 가이드
UpsertBuilder
트랜잭션 내 데이터 저장
데코레이터
Sonamu 데코레이터 이해하기