@Transactional, 선언적 트랜잭션

무지성개발자·2023년 10월 2일
0

@Transactional

@Transactional 어노테이션은 클래스, 메소드 레벨에 붙이는 것 만으로도 간단하게 트랜잭션 작업을 할 수 있도록 해준다.

@Transactional은 비지니스 로직 안에서 트랜잭션 경계설정을 해주지 않고 외부에서 트랜잭션 기능을 부여해주는 방식으로 선언적 트랜잭션이라고 한다. 선언적 트랜잭션의 장점은 비지니스 로직은 깔끔하게 비지니스를 위한 코드만 남게 된다는 것이다.

대체(fallback) 정책

@Transactional은 4단계의 대체 정책을 이용해서 적용된다.

@Transactional // 1
public interface Service{

	@Transactional // 2
	void method(){}
}

@Transactional // 3
public class ServiceImpl implements Service{

	@Transactional // 4
	void method(){}
}

위 코드에서 ServiceImpl.method를 실행하면 어떤 @Transactional을 우선 적용 하게 될까? 답은 4번이다.

@Transactional은 타깃 메소드 -> 타깃 클래스 -> 선언 메소드 -> 선언 타입(클래스, 인터페이스)의 순서로 탐색하여 가장 먼저 만난 @Transactional 설정을 따르도록 한다. 코드로 보면 4 -> 3 -> 2 -> 1의 순서로 우선권이 있다는 말이다.

대체정책이 중요한 이유는 @Transactional의 설정을 어떤 것을 사용하게 되는지가 달라 지기 때문이다.

테스트환경에서 @Transactional

테스트 환경에서는 항상 Rollback을 기본으로 한다. 때문에 DB 수정이 있는 통합 테스트에서도 일관된 환경을 제공하며, Rollback을 원하지 않을 경우 @Rollback(false)를 같이 사용하면 된다.


한 줄평 : 읽기작업만 있는 경우에도 Read Only를 사용하면 성능에 이점이 있다고 한다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글