본문 바로가기

개발 기록/스프링

[스프링] 트랜잭션이란 무엇인가? (종류, 주의점)

 

트랜잭션이라 함은 작업의 단위로써 트랜잭션 범위 안에서 진행되는 작업은 모두 commit()을 통해 성공하던지 아니면 모든 작업이 rollback()을 통해서 취소가 되어야 한다.

 

트랜잭션의 종류의 대해서 알아보자

종류 설명
REQUIRED(디폴트) 진행 중인 트랜잭션이 없으면 새로 시작하고, 시작된 트랜잭션이 있다면 그 트랜잭션이 포함된다.
REQUIRES_NEW 앞에 시작된 트랙잭션이 있던 없던 새로운 트랜잭션을 만든다.
NESTED 진행 중인 트랜잭션이 있다면 진행 중인 트랜잭션 영향을 받지만, nested로 만들어진 트랜잭션은 진행 중인 트랜잭션에 영향을 미치지 않는다.
MANDATORY 현재 트랜잭션에 포함되며, 진행 중인 트랜잭션이 없다면 예외가 발생한다.
NEVER 트랜잭션을 사용하지 않으며, 진행 중인 트랜잭션이 있을 시 예외 발생
SUPPORTS 진행 중인 트랜잭션이 있다면 참여하고, 없다면 트랜잭션 없이 진행한다.
NOT_SUPPORTED 트랜잭션이 없이 진행하며, 진행 중인 트랜잭션이 있다면 중단시킨다.

 

트랜잭션 사용 시 가장 중요한 점은 위에 나열된 옵션의 사용방법이 아니다.

트랜잭션이 걸린 메서드를 사용할 때, 클래스-메서드를 직접 선언해서 사용해서는 트랜잭션이 걸리지 않는다.

반드시 스프링 컨테이너로부터 주입 받은 객체를 사용해야 트랜잭션이 정상적으로 걸린다.

 

트랜잭션 어노테이션 사용시, 해당 클래스나 메서드는 트랜잭션 범위 안에 감싸진다. 범위에 감싸아 주는 역할을 스프링 컨테이너가 해준다.

내부 메서드로 그냥 사용하거나, 직접 선언을 해서 사용을 한다면 트랜잭션이 발생하지 않는다. (스프링이 트랜잭션 범위를 감싸지 않기 때문에)

 

참고 사이트)

트랜잭션 종류: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html#REQUIRED