강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

c.h jo님의 프로필 이미지
c.h jo

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 매니저2

레포지토리가 트랙잭션 동기화매니저에서 커넥션을 가져오는 부분에 대한 질문이 있습니다.

작성

·

109

0

레포지토리의 update, find.. 등의 메서드를 실행할 때 getConnection 의 DataSourceUtils 메서드를 통해 커넥션을 가져오는데요. 여기서 트랜잭션 동기화 매니저에 커넥션이 있으면 해당 커넥션을 가져오는 설명을 잘 들었습니다.

그런데 트랜잭션 매니저는 DataSourceTransactionManager 의 인스턴스고 DataSourceUtils 는 static util 클래스인데 이 사이에 트랙잭션 동기화 매니저가 어느 위치에 있는지 궁금합니다.

답변 2

0

DataSourceUtils에서 TransactionSynchronizationManager를 import하고 있습니다.

그리고 TransactionSynchronizationManager의 모든 메서드와 필드는 static입니다. 따라서 DataSourceUtils의 메서드들은 TransactionSynchronizationManager.xxx()로 static 메서드를 호출하여 동기화 매니저를 이용합니다.

ThreadLocal을 사용하기 때문에 컨텍스트가 특정 인스턴스에 종속되는 것이 아니고, (아마도) threadId로 구분하기 때문에 모두 static으로 관리하는 것 아닐까싶네요.

결론적으로, 트랜잭션 매니저데이터소스 유틸 모두 동기화 매니저의 static 영역에 접근해서 커넥션을 얻습니다. 이때 스레드별로 저장 공간이 분리되는데, 웹 애플리케이션에서 사용자별로 스레드가 할당되기 때문에 동일한 스레드의 요청이라면 ThreadLocal의 로직에 의해 같은 저장 공간에 접근하게 됩니다.

-1

안녕하세요, 인프런 AI 인턴입니다.
c.h jo님께서 질문하신 내용에 대해 설명드리겠습니다.

스프링의 트랜잭션 관리에서는 DataSourceUtilsTransactionSynchronizationManager가 중요한 역할을 합니다. DataSourceUtils는 스프링 프레임워크 내의 여러 클래스가 데이터베이스 커넥션을 취득할 때 주로 사용되는 유틸리티 클래스입니다. TransactionSynchronizationManager는 트랜잭션 관리의 핵심이라 할 수 있는 트랜잭션 동기화 정보를 관리합니다.

스프링의 트랜잭션 관리에서 DataSourceUtils.getConnection() 메서드는 내부적으로 TransactionSynchronizationManager를 통해 현재 트랜잭션에 속한 리소스들을 관리하고, 필요한 경우 적절한 커넥션을 제공합니다. TransactionSynchronizationManager는 현재 쓰레드와 관련된 정보들을 ThreadLocal에 저장하여 관리하므로 각 쓰레드는 다른 쓰레드와 독립적으로 트랜잭션을 관리할 수 있습니다.

질문에서 언급하신 DataSourceTransactionManager는 스프링이 제공하는 트랜잭션 매니저 구현체 중 하나로, 데이터 소스를 기반으로 트랜잭션을 시작하고 커밋하거나 롤백하는 역할을 합니다. DataSourceTransactionManager는 트랜잭션 시작 시 TransactionSynchronizationManager를 초기화하고, 후속 호출 시 DataSourceUtils가 적절히 사용되도록 합니다.

관련하여 이해를 돕기 위한 유사한 질문과 답변을 여기에 소개합니다:

이 내용을 바탕으로 스프링 트랜잭션 관리의 동작 방식을 파악하는 데 도움이 되셨길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

c.h jo님의 프로필 이미지
c.h jo

작성한 질문수

질문하기