🍃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