코딩/Spring
@Transactional
americanoallday
2025. 3. 31. 19:49
트랜잭션 = 데이터베이스에서 하나의 논리적인 작업 단위
✔ 예를 들어 이런 상황:
1. 사용자 계좌에서 10만원 인출
2. 다른 계좌에 10만원 입금
→ 둘 중 하나라도 실패하면 모두 실패로 되돌려야 함! (rollback)
→ 둘 다 성공해야만 최종 commit되어야 함!
이런 걸 트랜잭션으로 묶는 것! 💥
✅ @Transactional 동작 원리
@Transactional
public void updateUserInfo() {
userRepository.save(user);
historyRepository.save(log);
// 예외 발생 시 → 둘 다 rollback 됨 ❗
}
• ✅ 메서드 실행 시작 → 트랜잭션 시작됨
• ✅ 메서드 정상 종료 → commit()
• ❌ 예외 발생 → rollback() 자동 처리됨!
💡 어떤 경우 rollback 되는지?
Spring은 기본적으로 RuntimeException (unchecked 예외) 발생 시 rollback 해줌.
throw new IllegalArgumentException("실패!");
→ 이럴 땐 자동 rollback 됨!
만약 IOException 같은 체크 예외를 rollback 하고 싶으면 설정 추가해야 함:
@Transactional(rollbackFor = Exception.class)
붙이는 위치예시
클래스 위 | 전체 메서드에 트랜잭션 적용 |
메서드 위 | 특정 메서드만 트랜잭션 적용 |
✅ 언제 사용하면 좋을까?
상황 | @Transactional 추천 여부 |
여러 DB작업이 함께 일어나는 경우 | ✅ 필수! |
한 메서드 안에 save, update 등 DB 수정 작업이 섞여 있는 경우 | ✅ 무조건! |
단순 조회만 하는 경우 | ❌ 생략 가능 |