본문 바로가기
스프링 부트3

스프링 부트 3에서 트랜잭션 관리

by 굿센스굿 2024. 12. 5.
반응형

 

스프링 부트 3(Spring Boot 3)에서 트랜잭션 관리는 애플리케이션의 데이터 일관성을 유지하고, 데이터베이스 작업의 원자성을 보장하기 위한 핵심 기능 중 하나입니다. 이 글에서는 스프링 부트 3에서 트랜잭션 관리의 기본 개념과 설정 방법, 그리고 실습 예제를 통해 이해를 돕고자 합니다.

1. 트랜잭션이란?

트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키기 위해 수행하는 일련의 연산 작업들을 하나로 묶은 논리적인 작업 단위입니다. 트랜잭션의 주요 특징은 다음과 같습니다.

  • 원자성(Atomicity): 트랜잭션 내의 모든 작업이 완전히 수행되거나 전혀 수행되지 않아야 합니다.
  • 일관성(Consistency): 트랜잭션 수행 전과 후의 데이터베이스 상태가 일관성을 유지해야 합니다.
  • 고립성(Isolation): 여러 트랜잭션이 동시에 실행되더라도 서로 간섭하지 않아야 합니다.
  • 지속성(Durability): 트랜잭션이 완료되면 결과가 영구적으로 반영되어야 합니다.

2. 스프링 부트 3에서 트랜잭션 관리 설정

스프링 부트 3에서는 @Transactional 애너테이션을 사용하여 트랜잭션을 관리할 수 있습니다. 이 애너테이션을 클래스나 메소드에 적용하면, 해당 범위 내에서 트랜잭션이 자동으로 관리됩니다.

먼저, 의존성 설정을 확인합니다. 스프링 부트 3를 사용하기 위해 spring-boot-starter-data-jpa 의존성을 추가합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

다음으로, 데이터베이스 설정을 application.properties 파일에 추가합니다.

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update

이제, @Transactional 애너테이션을 사용하여 트랜잭션을 관리하는 방법을 살펴보겠습니다.

3. 실습 예제

예제 1: 간단한 트랜잭션 관리

아래 예제는 간단한 트랜잭션 관리 예제입니다. UserService 클래스의 createUser 메소드에 @Transactional 애너테이션을 사용하여 트랜잭션을 관리합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }
}

예제 2: 복합 트랜잭션 관리

다음 예제는 여러 데이터베이스 작업을 하나의 트랜잭션으로 관리하는 방법을 보여줍니다. OrderService 클래스의 placeOrder 메소드에서 주문과 결제 작업을 하나의 트랜잭션으로 묶습니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private PaymentRepository paymentRepository;

    @Transactional
    public void placeOrder(Order order, Payment payment) {
        orderRepository.save(order);
        paymentRepository.save(payment);
    }
}

예제 3: 트랜잭션 롤백 처리

트랜잭션이 실패했을 때 롤백 처리하는 방법을 보여줍니다. ProductService 클래스에서 예외가 발생하면 트랜잭션이 롤백됩니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Transactional(rollbackFor = Exception.class)
    public void addProduct(Product product) throws Exception {
        productRepository.save(product);
        if (product.getStock() < 0) {
            throw new Exception("Stock cannot be negative");
        }
    }
}

4. 결론

스프링 부트 3에서 트랜잭션 관리는 애플리케이션의 데이터 무결성을 유지하는 중요한 기능입니다. @Transactional 애너테이션을 사용하여 손쉽게 트랜잭션을 관리할 수 있으며, 이를 통해 데이터 일관성을 유지하고, 복잡한 데이터베이스 작업을 안전하게 처리할 수 있습니다. 위의 예제들을 참고하여 실제 프로젝트에 적용해보시기 바랍니다.

스프링 부트 3의 강력한 트랜잭션 관리 기능을 활용하여 더욱 안정적이고 신뢰할 수 있는 애플리케이션을 개발하시길 바랍니다.

반응형