Programing/Spring
@Transactional에 대하여
블스뜸
2025. 5. 13. 17:48
@Transactional 어노테이션 정리
주요 목적:
- 하나의 논리적인 작업 단위 (Unit of Work) 정의
- 해당 작업 단위 내의 여러 데이터 접근 작업을 원자적으로 (Atomically) 관리
- 성공 시 커밋 (Commit): 모든 작업 성공 시 데이터베이스에 변경 사항 반영
- 실패 시 롤백 (Rollback): 하나라도 실패 시 모든 변경 사항 이전 상태로 복구 (데이터 일관성 유지)
예시:
- @Transactional 적용 메서드 내 2개 이상 DB 연산 시, 전체 성공 시 커밋, 하나라도 실패 시 전체 롤백
적용 위치:
- Service 계층 (일반적): 여러 데이터 접근 로직을 묶어 트랜잭션 관리 (예: 스케줄 생성 시 스케줄 저장 + 사용자 정보 업데이트)
핵심 원리:
- 원자성 (Atomicity): DB 연산을 불가분한 하나의 작업 단위로 취급
- 성공 아니면 실패 (All or Nothing): 모든 DB 변경 성공 시 커밋, 중간 실패 시 전체 롤백
단일 SQL 작업 시 사용 여부:
- 일반적으로 불필요: DB는 단일 SQL 쿼리에 대해 기본적인 원자성 보장
단일 SQL 작업 시 고려 사항 (사용할 수 있는 경우):
- 예외 처리 일관성: Spring의 데이터 접근 예외 변환 활용
- AOP 기반 공통 로직 적용: 로깅, 성능 측정 등
- 격리 수준 제어: 기본 격리 수준 외 다른 수준 설정 (@Transactional(isolation = Isolation.SERIALIZABLE))
- 읽기 전용 힌트: 조회 작업 성능 최적화 (@Transactional(readOnly = true))