@Transactional

Louie·2023년 2월 23일
0

@Transactinal이란?

  • 스프링에서 트랜잭션을 관리해주는 기능입니다.
  • @Transactional을 사용하여 트랜잭션을 처리하는 방식을 선언적 트랜잭션 처리라고 부르며 반대로 프로그래밍을 통해 트랜잭션을 처리하는 프로그래밍적 트랜잭션 처리가 있습니다.

선언적 트랜잭션 vs 프로그래밍적 트랜잭션 처리

  • 프로그래밍적 트랜잭션 처리는 스프링 컨테이너와 스프링 AOP를 사용하지 않아도 되지만 선언적 트랜잭션 처리가 훨씬 간편하고 실용적이어서 저는 선언적 트랜잭션 처리를 사용하고 있습니다.

@Transactional의 동작 방식

  • 스프링에서 @Transactional이 적용된 메서드가 존재하는 Bean은 프록시 객체로 관리됩니다.
  • 따라서 해당 Bean을 사용하는 클라이언트들은 프록시 객체를 주입받고 사용하게 됩니다.
  • 프록시 객체를 호출하게 된다면 내부에서 트랜잭션을 처리를 담당하는 트랜잭션 매니저를 호출합니다.
  • 트랜잭션 매니저는 DataSource를 통해 커넥션을 생성한 다음 트랜잭션을 시작(auto commit = false)하고 생성한 커넥션을 트랜잭션 동기화 매니저에 보관하게 되는데요, DB에 접근이 필요한 경우 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내서 사용하게 됩니다.

트랜잭션 동기화 매니저란?

  • 트랜잭션 동기화 매니저는 ThreadLocal을 사용하여 커넥션을 관리합니다.
  • ThreadLocal은 스레드마다 고유의 저장소가 존재하여 동일한 스레드가 ThreadLocal에 담긴 데이터를 꺼낸다면 동일한 데이터를 반환합니다.
  • 따라서 트랜잭션 동기화 매니저는 스레드마다 사용하는 커넥션을 보관하고 동일한 스레드에서 커넥션을 조회하면 동일한 커넥션을 반환하도록 구현되어 있습니다.

마무리

  • 스프링에서 @Transactional을 어떻게 내부적으로 트랜잭션 처리 로직을 추상화했는지 학습할 수 있던 좋은 기회였습니다.
  • 다음번에는 @Transactional의 readOnly 옵션에 대해 학습해보겠습니다.

Reference

profile
백엔드 개발자를 준비하고 있는 Louie입니다.

0개의 댓글