스프링 Spring
12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. 트랜잭션(Transaction)이란?
✔ 트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 작업 단위를 의미
✔ 여러 개의 SQL 작업을 하나의 단위로 묶어 실행하고, 일부만 수행되지 않도록 보장
✔ 트랜잭션이 성공하면 모든 작업을 반영(Commit), 실패하면 이전 상태로 되돌림(Rollback)
📌 트랜잭션의 특징 (ACID 원칙)
Atomicity (원자성) | 트랜잭션은 더 이상 쪼갤 수 없는 단위로 동작하며, 전부 수행되거나 전부 실패해야 함 |
Consistency (일관성) | 트랜잭션이 완료되면 데이터는 항상 일관된 상태를 유지해야 함 |
Isolation (격리성) | 동시에 실행되는 트랜잭션은 서로 간섭하지 않도록 격리되어야 함 |
Durability (지속성) | 트랜잭션이 성공적으로 완료되면 결과가 영구적으로 반영되어야 함 |
📌 트랜잭션은 "데이터베이스의 무결성을 보장하는 중요한 개념"
2. Spring에서의 트랜잭션 관리 방식
✔ Spring에서는 선언적 트랜잭션과 프로그래밍 방식의 트랜잭션을 지원
📌 트랜잭션 관리 방식 비교
선언적 트랜잭션 (@Transactional) | 어노테이션을 사용하여 간단하게 트랜잭션을 설정 |
프로그래밍 방식 트랜잭션 (TransactionTemplate, PlatformTransactionManager) | 직접 트랜잭션을 관리하며 세밀한 설정 가능 |
📌 Spring에서는 "대부분 @Transactional을 사용하여 선언적 트랜잭션 관리를 적용"
3. @Transactional 기본 사용법
✔ Spring에서 @Transactional 어노테이션을 사용하면 자동으로 트랜잭션을 관리할 수 있음
📌 @Transactional 적용 예제 (기본 설정)
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(String name, String email) {
User user = new User(name, email);
userRepository.save(user);
}
}
✔ 메서드 실행 중 예외가 발생하면 자동으로 롤백됨
✔ 기본적으로 RuntimeException이 발생하면 롤백되며, CheckedException은 롤백되지 않음
📌 @Transactional을 사용하면 "트랜잭션을 간단하게 선언하고 자동으로 관리 가능"
2. 상세 주제 정리
1. @Transactional의 주요 속성 설정
✔ @Transactional은 다양한 속성을 지원하여 트랜잭션 동작을 세밀하게 조정 가능
📌 @Transactional 속성 정리
propagation | 트랜잭션 전파 방식 설정 | REQUIRED |
isolation | 트랜잭션 격리 수준 설정 | DEFAULT |
timeout | 트랜잭션 실행 시간 제한(초 단위) | -1 (제한 없음) |
readOnly | 읽기 전용 트랜잭션 여부 설정 | false |
rollbackFor | 특정 예외 발생 시 롤백 지정 | RuntimeException |
📌 @Transactional을 사용하면 "트랜잭션의 동작을 상세하게 조정 가능"
2. 트랜잭션 전파(Propagation) 설정
✔ 트랜잭션이 여러 개의 서비스 계층을 거쳐 실행될 때, 기존 트랜잭션을 유지할지 새로 만들지 설정
📌 Propagation 종류 정리
REQUIRED | 기본값, 현재 트랜잭션이 있으면 참여, 없으면 새 트랜잭션 생성 |
REQUIRES_NEW | 항상 새로운 트랜잭션을 생성 (기존 트랜잭션과 별개) |
NESTED | 기존 트랜잭션 내에서 중첩된 트랜잭션 생성 |
MANDATORY | 반드시 기존 트랜잭션 내에서 실행 (없으면 예외 발생) |
SUPPORTS | 트랜잭션이 있으면 참여, 없으면 비트랜잭션으로 실행 |
📌 REQUIRES_NEW를 사용하면 "기존 트랜잭션과 분리된 새로운 트랜잭션을 생성 가능"
📌 Propagation 적용 예제
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
@Transactional
public void placeOrder(Long userId, Long productId) {
// 주문 생성 로직
paymentService.processPayment(userId, productId);
}
}
@Service
public class PaymentService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void processPayment(Long userId, Long productId) {
// 결제 처리 로직
}
}
✔ placeOrder()가 실행 중 예외가 발생해도 processPayment()는 롤백되지 않음
📌 Propagation을 적절히 사용하면 "복잡한 트랜잭션 흐름을 효과적으로 제어 가능"
3. 트랜잭션 격리 수준(Isolation Level) 설정
✔ 격리 수준은 트랜잭션이 다른 트랜잭션과 데이터를 공유하는 정도를 결정
📌 격리 수준 정리
READ_UNCOMMITTED | 다른 트랜잭션의 미확정 데이터를 읽을 수 있음 (Dirty Read 발생 가능) |
READ_COMMITTED | 다른 트랜잭션의 Commit된 데이터만 읽을 수 있음 |
REPEATABLE_READ | 동일한 트랜잭션 내에서 같은 데이터를 여러 번 읽어도 변경되지 않음 |
SERIALIZABLE | 가장 높은 수준, 트랜잭션을 직렬화하여 동시 실행을 방지 |
📌 격리 수준 적용 예제
@Transactional(isolation = Isolation.READ_COMMITTED)
public void processOrder(Long orderId) {
// 트랜잭션 실행
}
✔ READ_COMMITTED 설정 시, 다른 트랜잭션이 Commit한 데이터만 읽을 수 있음
📌 Isolation Level을 적절히 설정하면 "데이터 일관성을 유지하면서 성능을 최적화 가능"
4. 트랜잭션 롤백 설정 (rollbackFor & noRollbackFor)
✔ 기본적으로 RuntimeException 발생 시 롤백되지만, CheckedException은 롤백되지 않음
📌 CheckedException도 롤백시키려면 rollbackFor 사용
@Transactional(rollbackFor = Exception.class)
public void processTransaction() throws Exception {
throw new Exception("CheckedException 발생");
}
✔ CheckedException 발생 시에도 롤백 가능
📌 특정 예외에 대해 롤백 방지하려면 noRollbackFor 사용
@Transactional(noRollbackFor = IllegalArgumentException.class)
public void processTransaction() {
throw new IllegalArgumentException("롤백되지 않음");
}
✔ IllegalArgumentException 발생 시 롤백되지 않음
✅ 여기까지 Spring에서 트랜잭션 관리와 @Transactional의 고급 설정을 배웠습니다!
👉 "그렇다면, Spring Boot에서 JPA를 활용한 CRUD 구현은 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 JPA를 활용한 CRUD 구현을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현> (0) | 2025.04.01 |
---|---|
Spring 기초 <14. Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략> (1) | 2025.03.31 |
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
Spring 기초 <11. Spring Data JPA vs MyBatis 차이 및 선택 기준> (1) | 2025.03.28 |
Spring 기초 <10. Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)> (0) | 2025.03.27 |
Spring 기초 <9. Spring에서 DTO, Entity, VO의 차이 및 실무 적용법> (0) | 2025.03.26 |
Spring 기초 <8. Spring에서 RequestParam vs PathVariable 차이점> (0) | 2025.03.25 |
Spring 기초 <7. Spring Boot에서 REST API 개발 (GET, POST, PUT, DELETE)> (0) | 2025.03.24 |