Skip to main content
@transactional 데코레이터는 메서드를 자동으로 트랜잭션으로 감싸주어 보일러플레이트 코드를 줄여줍니다.

데코레이터 개요

자동 트랜잭션

메서드 실행을 자동으로 트랜잭션으로 감쌈 성공 시 커밋, 실패 시 롤백

코드 간결화

transaction() 호출 불필요 가독성 향상

Isolation Level

트랜잭션 격리 수준 설정 동시성 제어

중첩 트랜잭션

자동 컨텍스트 공유 Savepoint 지원

기본 사용법

Before: 수동 트랜잭션

After: @transactional 데코레이터

@transactional() 데코레이터가 적용된 메서드는 자동으로 트랜잭션 내에서 실행됩니다.

작동 원리

데코레이터 옵션

dbPreset 설정

Isolation Level 설정

Isolation Level 주의사항: - 높은 격리 수준은 동시성 감소 - SERIALIZABLE은 성능 영향 큼 - 대부분의 경우 REPEATABLE READ가 적절

실전 예제

예제 1: 단순 트랜잭션

예제 2: 자동 롤백

예제 3: 복잡한 트랜잭션 (Company → Dept → Employee)

예제 4: 동시성 제어

중첩 트랜잭션

자동 컨텍스트 공유

중첩 트랜잭션의 이점: - 코드 재사용성 향상 - 메서드 조합 자유로움 - 트랜잭션 경계 자동 관리

중첩 트랜잭션 메커니즘 상세

Sonamu의 중첩 트랜잭션은 트랜잭션 컨텍스트 공유 방식으로 동작합니다.

트랜잭션 컨텍스트 공유

동작 원리:
  1. outerMethod 실행 → 트랜잭션 A 시작
  2. innerMethod 호출 → 기존 트랜잭션 A 감지
  3. innerMethod는 새 트랜잭션을 시작하지 않고 A를 재사용
  4. innerMethod 종료 → 커밋하지 않음
  5. outerMethod 종료 → 트랜잭션 A 커밋

Savepoint는 생성되지 않음

Sonamu는 Savepoint를 자동으로 생성하지 않습니다. 모든 중첩된 메서드가 같은 트랜잭션을 공유하므로:
결과:
  • methodB에서 에러 발생 → 전체 트랜잭션 롤백
  • methodA의 users INSERT도 롤백됨
  • Savepoint가 없으므로 부분 롤백 불가

Savepoint가 필요한 경우

부분 롤백이 필요하면 수동으로 Savepoint를 관리해야 합니다:
Savepoint 사용 시나리오:
  • 선택적 작업이 실패해도 메인 작업은 성공시켜야 할 때
  • 여러 단계의 작업 중 일부만 롤백하고 싶을 때
  • 복잡한 비즈니스 로직에서 부분 실패 처리가 필요할 때

트랜잭션 컨텍스트 확인

현재 실행 중인 트랜잭션이 있는지 확인하는 방법:

중첩 레벨 제한 없음

Sonamu는 중첩 레벨에 제한이 없습니다:

커밋 시점

오직 최상위 트랜잭션만 커밋합니다:
정리:
중첩 트랜잭션 주의사항: 1. 전체 롤백: 중첩된 메서드에서 에러 발생 시 전체 트랜잭션이 롤백됨 2. Savepoint 없음: 부분 롤백이 필요하면 수동으로 Savepoint 관리 3. 커밋 시점: 중첩된 메서드 종료 시 커밋되지 않음 (최상위만 커밋) 4. 에러 처리: try-catch로 잡아도 트랜잭션은 이미 롤백된 상태
권장 사항: - 간단한 중첩: @transactional 자동 공유 사용 - 복잡한 로직: 수동 Savepoint 관리 고려 - 에러 처리: 최상위 메서드에서 처리

@api와 함께 사용

데코레이터 조합

장단점

장점

코드 간결화

transaction() 호출 불필요 보일러플레이트 제거

가독성

트랜잭션 경계 명확 비즈니스 로직에 집중

자동 관리

커밋/롤백 자동 처리 실수 방지

재사용성

메서드 조합 용이 중첩 트랜잭션 지원

단점

제약사항

메서드 레벨에서만 사용 부분 트랜잭션 불가

디버깅

트랜잭션 경계가 숨겨짐 문제 추적 어려울 수 있음

사용 가이드

언제 사용하나?

사용 권장:
  • 메서드 전체가 하나의 트랜잭션
  • 여러 DB 작업이 원자성 필요
  • 코드 재사용이 중요한 경우
  • API 핸들러 메서드
사용 비권장:
  • 메서드 내 부분적 트랜잭션
  • 복잡한 트랜잭션 제어 필요
  • 트랜잭션 경계가 명확해야 하는 경우

패턴 비교

주의사항

반드시 지켜야 할 사항: 1. 메서드는 async 함수여야 함 2. this.getPuri("r"/"w")로 DB 접근 3. 에러는 throw로 전파 (자동 롤백) 4. 중첩 트랜잭션은 같은 컨텍스트 공유

흔한 실수

다음 단계

수동 트랜잭션

transaction() 직접 사용하기

모범 사례

트랜잭션 사용 가이드

UpsertBuilder

트랜잭션 내 데이터 저장

데코레이터

Sonamu 데코레이터 이해하기