1. 스프링 트랜잭션 소개


스프링에서는 DB 접근 기술 (JDBC, JPA 등)에 따라서 트랜잭션을 사용하는 코드가 다르다.

이러한 문제를 해결하기 위해 스프링은 트랜잭션 추상화를 제공한다.

트랜잭션을 사용하는 입자에서는 이 추상화를 통해 여러 DB 접근 기술의 트랜잭션을 동일한 방식으로 사용할 수 있다.

PlatformTransactionManager Interface 를 사용하자.

여기에 더해서 스프링 부트를 사용하면 어떤 데이터 접근 기술을 사용하는지 자동으로 인식해서 적절한 트랜잭션 매니저 구현체를 선택해 스프링 빈으로 등록해준다.

Untitled

실무에서는 선언적 트랜잭션 관리 @Transactional 을 주로 사용한다.

*트랜잭션 프록시 코드 예시*

public class TransactionProxy {
	private MemberService target;

	public void logic() {
		//트랜잭션 시작
		TransactionStatus status = transactionManager. getTransaction(..);
		try {
			//실제 대상 호출
			target.logic();
			transactionManager.commit(status); //성공시 커밋
		} catch (Exception e) {
			transactionManager. rollback(status); //실패시 롤백
			throw new IllegalstateException(e);
	}
	
}

2. 트랜잭션 AOP 주의 사항


1) 트랜잭션 AOP는 프록시 방식이라 내부 호출을 주의해라.

트랜잭션 AOP는 기본적으로 프록시 방식의 AOP를 사용한다.

대상 객체 내부의 메서드 호출이 발생하면 프록시를 거치지 않고 호출되기 때문에 트랜잭션이 걸리지 않는다!

fun external() {
	internal() // transaction 적용 안됨!!!!!!!!!!!!
}

@Transactoinal
fun internal() {
}