waveofmymind
기록하는 습관
waveofmymind
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • 📝 정리 (5)
    • 🌊TIL (9)
    • 💻CS (1)
      • 자료구조 (1)
    • 📙Language (9)
      • ☕Java (6)
      • 🤖Kotlin (3)
    • 🍃Spring (28)
    • 👨🏻‍💻알고리즘 (67)
      • 프로그래머스 (59)
      • 백준 (3)
    • 👷DevOps (4)
      • 🐳Docker (2)
      • 🤵Jenkins (1)

블로그 메뉴

  • 홈
  • Spring
  • Java
  • 알고리즘

공지사항

인기 글

태그

  • 다이나믹 프로그래밍
  • 완전탐색
  • JDBC
  • 트랜잭션
  • til
  • resultset
  • CORS
  • 통합테스트
  • LeetCode
  • 스프링 시큐리티
  • 스프링 부트
  • sql
  • 스택
  • mybatis
  • 힙
  • spring boot
  • BFS
  • kotlin
  • Connection
  • 트랜잭션 전파
  • SpringAOP
  • 스프링
  • Spring Security
  • 코틀린
  • chat GPT
  • kotest
  • AOP
  • spring
  • Open AI
  • 챗GPT

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
waveofmymind

기록하는 습관

[Spring] 선언적 트랜잭션 동작 확인하기
🍃Spring

[Spring] 선언적 트랜잭션 동작 확인하기

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

 

 

'🍃Spring' 카테고리의 다른 글

[Spring] 트랜잭션 - 프록시 내부 호출 문제 2  (0) 2023.02.03
[Spring] 트랜잭션 - 프록시 내부 호출 문제 1  (0) 2023.02.03
[Spring DB] MyBatis 사용하기  (0) 2023.01.29
[Spring DB] 테스트 - 트랜잭션  (0) 2023.01.29
[Spring DB] JDBC Template 사용하기  (0) 2023.01.29
    '🍃Spring' 카테고리의 다른 글
    • [Spring] 트랜잭션 - 프록시 내부 호출 문제 2
    • [Spring] 트랜잭션 - 프록시 내부 호출 문제 1
    • [Spring DB] MyBatis 사용하기
    • [Spring DB] 테스트 - 트랜잭션
    waveofmymind
    waveofmymind

    티스토리툴바