🍃Spring
[Spring] 선언적 트랜잭션 동작 확인하기
waveofmymind
2023. 2. 3. 09:11
스프링이 제공하는 트랜잭션 추상화를 이용하면,
사용하는 ORM 기술이 변경되어도 동일한 방식으로 트랜잭션을 사용할 수 있다.
스프링이 제공하는 추상 인터페이스 PlatfromTransactionManager를 이용하는 방법은
- 선언적 트랜잭션: @Transactionl 어노테이션으로 트랜잭션 사용 가능
- 프로그래밍 방식 트랜잭션: 트랜잭션 관련 코드를 작성하여 트랜잭션 사용 가능
이 있다. 이 중 선언적 트랜잭션을 이용하면 @Transactional 하나만으로 프록시 방식의 AOP가 적용되는데, 어노테이션 하나로 트랜잭션을 관리할 수 있는 만큼, 눈으로 동작 과정을 확인하는 것이 어렵다.
그래서 테스트를 통해 실제 트랜잭션이 적용되고 있는지 알아볼 것이다.
TxBasicTest
@Slf4j
@SpringBootTest
public class TxBasicTest {
@Autowired
BasicService basicService;
@Test
void proxyCheck() {
//BasicService$$EnhancerBySpringCGLIB...
log.info("aop class={}", basicService.getClass()); //basicService가 스프링 AOP 프록시 기술이 적용 됬는지 여부를 알 수 있다.
assertThat(AopUtils.isAopProxy(basicService)).isTrue();
}
@Test
void txTest() {
basicService.tx();
basicService.nonTx();
}
@TestConfiguration
static class TxApplyBasicConfig {
@Bean
BasicService basicService() {
return new BasicService();
}
}
@Slf4j
static class BasicService {
@Transactional
public void tx() {
log.info("call tx");
boolean txActive =
TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active={}", txActive);
}
public void nonTx() {
log.info("call nonTx");
boolean txActive =
TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active={}", txActive);
}
}
}
- 메서드 tx()에는 @Tranactional을 선언했고, nonTx()는 선언하지 않았다.
- TranactionSynchronizationManager.isActualTranactionaActive()로 트랜잭션이 적용되는지 여부를 확인할 수 있다.
- txTest() 메서드를 실행하면,
tx active를 반환받음으로써 트랜잭션이 적용되는지 여부를 알 수 있다.
동작 과정
tx() 메서드에 @Transactional을 붙여줌으로써, 스프링 AOP는 basicService의 프록시가 스프링 빈으로 등록된다.
BasicService에 오토와이어링을 하면, 실제 basicService 객체가 아닌, 프록시를 주입해 준다.
프록시는 BasicService를 상속받았기 때문에 다형성을 활용할 수 있다.
basicService.tx() 호출
- 프록시의 tx()가 호출되는데, 이때 해당 메서드가 트랜잭션을 사용할 수 있는지 확인한다.
- 그다음의 실제 basicService.tx()를 호출한다.
- 호출이 종료되고, 프록시로 반환되면, 트랜잭션 로직을 커밋하거나 롤백해서 트랜잭션을 종료시킨다.
basicService.nonTx() 호출
- 동일하게 프록시의 nonTx()가 호출되며, 해당 메서드가 트랜잭션을 사용할 수 있는지 확인한다.
- @Transactionl이 없으므로 적용 대상이 아니라고 판단하고, 실제 basicService.nonTx()만 호출한다.
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
스프링 DB 2편 - 데이터 접근 활용 기술 - 인프런 | 강의
백엔드 개발에 필요한 DB 데이터 접근 기술을 활용하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의 소개 | 인
www.inflearn.com