본문 바로가기
백엔드/Spring

스프링부트 @Transactional의 개념과 사용법

by 개발자K씨 2024. 1. 8.

스프링 부트에서 @Transactional 어노테이션은 트랜잭션 관리를 단순화하고 강화하는 중요한 도구입니다. 이 글에서는 @Transactional의 핵심 개념과 사용법을 상세히 설명하고, 효과적인 사용 방법을 안내하겠습니다.

 

@Transactional의 기본 개념

@Transactional은 스프링 프레임워크에서 제공하는 선언적 트랜잭션 관리를 위한 어노테이션입니다. 선언적 트랜잭션 관리란, 개발자가 코드로 직접 트랜잭션을 관리하지 않고, 어노테이션을 사용하여 트랜잭션의 시작과 종료를 프레임워크에 위임하는 방식을 말합니다.

핵심 이점

  • 간결성: 복잡한 트랜잭션 관리 로직을 어노테이션 한 줄로 대체할 수 있습니다.
  • 일관성: 일관된 방식으로 애플리케이션 전체의 트랜잭션을 관리할 수 있습니다.
  • 신뢰성: 예외 발생 시 자동 롤백으로 데이터 일관성을 유지합니다.

@Transactional의 사용법

기본 사용법

@Transactional은 클래스 또는 메서드 레벨에 적용할 수 있습니다. 클래스에 적용하면 해당 클래스의 모든 public 메서드에 트랜잭션이 적용됩니다. 메서드 레벨에서 적용하면, 특정 메서드에만 트랜잭션을 적용할 수 있습니다.

@Service
public class MyService {
    @Transactional
    public void myMethod() {
        // 비즈니스 로직
    }
}

 

트랜잭션 전파 행위 설정

propagation 속성을 통해 트랜잭션의 전파 방식을 설정할 수 있습니다. 예를 들어, PROPAGATION_REQUIRED는 기존 트랜잭션이 없을 경우 새로 시작하고, 이미 있는 경우에는 기존 트랜잭션을 사용합니다.

트랜잭션 롤백 설정

rollbackFor와 noRollbackFor 속성을 사용하여 특정 예외가 발생했을 때 트랜잭션이 롤백되는 조건을 세밀하게 제어할 수 있습니다.

읽기 전용 트랜잭션

데이터를 변경하지 않고 조회만 하는 경우, readOnly 속성을 true로 설정하여 성능을 최적화할 수 있습니다.

@Transactional(readOnly = true)
public List<User> findUsers() {
    // 사용자 조회 로직
}

 

실제 사용 시 고려 사항

  • 레벨 선택: 일반적으로 비즈니스 로직을 수행하는 서비스 레이어에서 @Transactional을 사용합니다.
  • 적절한 범위 설정: 트랜잭션은 필요한 최소한의 범위에 적용해야 합니다. 너무 큰 범위의 트랜잭션은 성능에 부정적인 영향을 미칠 수 있습니다.
  • 프록시 기반 AOP: 스프링의 @Transactional은 프록시 기반 AOP를 사용합니다. 따라서, 같은 클래스 내부에서 @Transactional 메서드를 직접 호출할 경우 트랜잭션이 적용되지 않을 수 있습니다.

결론

@Transactional 어노테이션은 스프링 부트에서 강력하고 유연한 트랜잭션 관리를 가능하게 합니다. 올바른 사용법을 이해하고 적절하게 적용한다면, 애플리케이션의 데이터 무결성을 보장하고, 성능을 최적화하는 데 크게 기여할 수 있습니다.