[Spring] @Transactional

한결·2023년 8월 6일
0

WEB

목록 보기
59/63

트랜잭션이란

  • 트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 의미
  • 여러 개의 데이터베이스 연산이 모두 성공하거나 모두 실패해야 하며, 중간 상태는 허용하지 않는 원자적인 작업 단위
  • @Transactional 어노테이션을 메서드 레벨 또는 클래스 레벨에 적용하여 트랜잭션을 적용할 수 있음
@Transactional
public void saveData(Data data) {
    // 데이터 저장 작업
}

@Transactional
public class DataService {
    // 데이터 관련 메서드들
}

기능

@Transactional

  1. 트랜잭션의 시작과 종료 관리: @Transactional이 적용된 메서드나 클래스 내의 메서드가 실행될 때, 자동으로 트랜잭션을 시작하고, 해당 메서드가 예외 없이 정상적으로 종료될 경우 트랜잭션을 커밋(데이터베이스에 변경 사항을 반영)합니다. 반면, 메서드가 예외를 발생시키면 트랜잭션을 롤백하고(변경 사항을 취소), 이전 상태로 돌아갑니다.

  2. 트랜잭션의 범위 지정: @Transactional 어노테이션을 메서드에 적용하면 해당 메서드 내에서 수행되는 모든 데이터베이스 작업은 하나의 트랜잭션으로 묶입니다. 따라서 여러 개의 데이터베이스 작업이 하나의 원자적 작업 단위로 처리됩니다.

  3. 트랜잭션 옵션 설정: @Transactional 어노테이션에는 여러 옵션을 설정할 수 있습니다. 예를 들어, isolation, propagation, readOnly, timeout, rollbackFor, noRollbackFor 등의 속성을 사용하여 트랜잭션의 격리 수준, 전파 동작, 읽기 전용 여부, 타임아웃 등을 설정할 수 있습니다.

@Transactional 어노테이션은 스프링 프레임워크에서 데이터베이스 트랜잭션 관리를 편리하게 해주는 중요한 기능 중 하나이며, 데이터베이스 작업을 안정적이고 일관성 있는 방법으로 처리하는 데 도움을 줍니다.

원리 및 제약

@Transactional 어노테이션은 public 메서드에만 적용될 수 있음
이는 Spring 프레임워크가 프록시(proxy) 기반의 AOP(Aspect-Oriented Programming)를 사용하여 트랜잭션을 관리하기 때문
AOP는 프록시 패턴을 사용하여 특정 메서드의 실행 전후에 추가적인 동작을 수행할 수 있게 해줌

프록시를 사용하면 호출되는 메서드에 대해 트랜잭션을 시작하고 종료할 수 있음

  1. Spring에서 @Transactional 어노테이션이 적용된 메서드를 트랜잭션으로 처리하기 위해 프록시 객체를 생성
  2. 프록시 객체는 원본 객체(클래스)를 감싸서 트랜잭션과 관련된 추가 동작을 수행하게 됨
  3. 이 프록시 객체는 원본 메서드 호출 전에 트랜잭션을 시작하고, 호출이 성공적으로 끝나면 트랜잭션을 커밋하거나 예외가 발생하면 롤백하는 역할

그러나 private 메서드에는 외부에서 직접 호출할 수 없음 -> 외부에서 프록시 객체를 사용할 수 없음

따라서 private 메서드에 @Transactional 어노테이션을 적용해도 프록시 객체가 해당 메서드를 감싸서 트랜잭션 처리를 수행할 수 없음

반면에, public 메서드는 외부에서 직접 호출이 가능하므로, 프록시 객체를 통해 트랜잭션 관리가 가능

따라서 @Transactional 어노테이션은 트랜잭션 처리가 필요한 메서드에서는 반드시 public 접근 제어자를 가져야만 프록시 객체가 해당 메서드를 감싸서 트랜잭션 처리를 수행할 수 있음

0개의 댓글