IT Developer/Spring

Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)>

TEMA_ 2025. 3. 29. 13:32
반응형

스프링 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 구현을 배워봅시다!



 

반응형