[Spring] 13. 스프링 앱에서 트랜잭션 사용
데이터의 무결성을 보장하기 위한 필수 개념인 트랜잭션(Transaction)의 정의와 스프링 프레임워크에서의 동작 방식을 정리했습니다.
1. 트랜잭션 (Transaction) 이란?
트랜잭션은 정해진 가변 작업(데이터를 변경하는 작업)의 집합으로, "전부 실행되거나, 아예 실행되지 않아야 한다"는 원칙을 따릅니다.
- 커밋 (Commit): 트랜잭션 내의 모든 변경 사항이 성공적으로 수행되어 데이터베이스에 영구적으로 저장되는 상태입니다.
- 롤백 (Rollback): 작업 중 오류가 발생하여 데이터 불일치를 방지하기 위해, 데이터를 트랜잭션 시작 전의 상태로 복원하는 상태입니다.
2. 스프링에서의 트랜잭션 작동 방식
스프링은 개발자가 직접 트랜잭션 코드를 작성하지 않아도 관리해주는 선언적 트랜잭션 방식을 제공합니다.
- AOP 애스펙트 기반: 트랜잭션 관리의 이면에는 AOP(Aspect-Oriented Programming)가 있습니다.
- @Transactional 애너테이션: * 메서드에 이 애너테이션을 붙이면 스프링이 구성한 애스펙트가 메서드 호출을 가로챕니다.
- 해당 메서드가 실행되기 전 트랜잭션을 시작하고, 성공하면 커밋합니다.
- 만약 메서드 실행 중 런타임 예외(Runtime Exception)가 발생하면 애스펙트가 이를 감지하여 변경 내용을 유지하지 않고 롤백을 수행합니다.
3. 트랜잭션 사용 시 주의사항
트랜잭션의 자동 롤백 기능을 활용할 때 가장 주의해야 할 점은 예외 처리 방식입니다.
핵심 포인트: 트랜잭션이 적용된 메서드 내부에서 try-catch 등으로 예외를 직접 처리(catch)해버리는 경우입니다.
- 문제점: 트랜잭션을 관리하는 애스펙트는 예외 발생 여부를 감지해야 롤백을 결정합니다. 하지만 메서드 내부에서 예외를 처리하고 밖으로 던지지 않으면, 애스펙트는 예외를 볼 수 없게 됩니다.
- 결과: 예외가 발생했음에도 불구하고 애스펙트는 작업이 성공했다고 판단하여 트랜잭션을 커밋해버리므로 데이터 불일치가 발생할 수 있습니다.
🎯 요약
- 트랜잭션은 데이터의 일관성을 유지하기 위해 여러 작업을 하나로 묶는 단위다.
- 스프링은 AOP를 활용하여
@Transactional이 붙은 메서드를 자동으로 관리한다.
- 런타임 예외 발생 시 자동으로 롤백되지만, 내부에서 예외를 가로채면 롤백이 되지 않으므로 주의해야 한다.
#Spring #Transaction #Transactional #AOP #Commit #Rollback #백엔드공부