트랜잭션
하나의 작업을 수행하기 위해 데이터베이스에서 논리적인 작업의 단위 또는 한번에 모두 수행되어야 하는 일련의 연산이다.
커밋으로 성공하거나 롤백으로 실패 이후 취소되어야 한다.
스프링의 트랜잭션 지원
트랜잭션 관리자
트랜잭션이 완료될 때까지 트랜잭션 상태를 유지하는 역할을 한다.
여러 작업이 동시에 실행되고 있을 때 한 작업의 에러 발생 시 이 트랜잭션은 중단되고 충돌없이 잘 이루어지도록 관리해준다.
PlatformTransactionManager

이 인터페이스를 이용해 추상화한다. db 연동 기술에 따라 각각의 구현 클래스가 제공된다.이 구현체를 직접 사용하진 않는다.
// 정의
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
DataSourceTransactionManager
스프링에서 jdbc 기반 라이브러리로 데이터베이스에 접근 하는 경우 사용하는 인터페이스이다.dataSource 프로퍼티를 통해 전달받은 Connection으로 커밋, 롤백을 수행하면서 관리한다.
HibernateTransactionManager
하이버네이트를 이용해 데이터베이스에 접근하는 경우에 사용한다.
JpaTransactionManager
JPA로 데이터베이스에 접근하는 경우에 사용한다. LocalContainerEntityManagerFactoryBean 타입의 빈을 등록해줘야한다.
JtaTransactionManager
하나 이상의 DB나 글로벌 트랜잭션을 이용할 때 사용한다.
TransactionTemplate을 이용한 트랜잭션
트랜잭션을 시작, 종료 시점을 명시적으로 결정할 수 있도록 스프링에서 제공하는 방법이다.
하나의 트랜잭션 안에서 동작해야 하는 코드를 한군데 모아서 만든 방식이다.
1. TransactionTemplate을 bean으로 설정
2. 프로퍼티에 DataSourceTransactionManager 입력
3. 코드에 적용
TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
this.transactionManager.commit(status);
} catch (RuntimeException e) {
this.transactionManager.rollback(status);
throw e;
}
선언적 트랜잭션
클래스, 메서드 위에 @Transactional을 선언해서 사용하면 트랜잭션 기능이 적용된 프록시 객체가 생성된다.
@Transactional
public void test() {
}
이 함수에 대한 프록시를 만들고, 로직이 잘 끝나면 커밋을, 오류가 나면 롤백을 시켜준다.
>> 프록시 객체이기 때문에 같은 내부에서 호출하게 되면 트랜잭션이 정상 작동하지 않는다.
// @Transactional 정의
@Target(value={TYPE,METHOD})
@Retention(value=RUNTIME)
@Inherited
@Documented
public @interface Transactional {}