출처: https://docs.spring.io/spring-boot/4.0-SNAPSHOT/reference/io/jta.html
주의: 이 버전은 아직 개발 중이며 안정적인 것으로 간주되지 않습니다. 최신 안정 버전은 Spring Boot 3.5.6을 사용하세요!
Spring Boot는 JNDI에서 검색한 트랜잭션 매니저를 사용하여 여러 XA 리소스에 걸친 분산 JTA 트랜잭션을 지원합니다.
JTA 환경이 감지되면 Spring의 JtaTransactionManager가 트랜잭션을 관리하는 데 사용됩니다.
자동 구성된 JMS, DataSource 및 JPA 빈은 XA 트랜잭션을 지원하도록 업그레이드됩니다.@Transactional과 같은 표준 Spring 관용구를 사용하여 분산 트랜잭션에 참여할 수 있습니다.
JTA 환경 내에 있지만 여전히 로컬 트랜잭션을 사용하려는 경우 spring.jta.enabled 속성을 false로 설정하여 JTA 자동 구성을 비활성화할 수 있습니다.
Using a Jakarta EE Managed Transaction Manager
Spring Boot 애플리케이션을 war 또는 ear 파일로 패키징하고 Jakarta EE 애플리케이션 서버에 배포하는 경우, 애플리케이션 서버의 내장 트랜잭션 매니저를 사용할 수 있습니다.
Spring Boot는 일반적인 JNDI 위치(java:comp/UserTransaction, java:comp/TransactionManager 등)를 조회하여 트랜잭션 매니저를 자동 구성하려고 시도합니다.
애플리케이션 서버에서 제공하는 트랜잭션 서비스를 사용하는 경우, 일반적으로 모든 리소스가 서버에서 관리되고 JNDI를 통해 노출되도록 하려고 할 것입니다.
Spring Boot는 JNDI 경로(java:/JmsXA 또는 java:/XAConnectionFactory)에서 ConnectionFactory를 조회하여 JMS를 자동 구성하려고 시도하며, spring.datasource.jndi-name 속성을 사용하여 DataSource를 구성할 수 있습니다.
Mixing XA and Non-XA JMS Connections
JTA를 사용할 때, 기본 JMS ConnectionFactory 빈은 XA를 인식하고 분산 트랜잭션에 참여합니다.@Qualifier를 사용할 필요 없이 빈에 주입할 수 있습니다:
Java
import jakarta.jms.ConnectionFactory;
public class MyBean {
public MyBean(ConnectionFactory connectionFactory) {
// ...
}
}
Kotlin
import jakarta.jms.ConnectionFactory
class MyBean(connectionFactory: ConnectionFactory?)
경우에 따라 비-XA ConnectionFactory를 사용하여 특정 JMS 메시지를 처리하고 싶을 수 있습니다.
예를 들어, JMS 처리 로직이 XA 타임아웃보다 오래 걸릴 수 있습니다.
비-XA ConnectionFactory를 사용하려면 nonXaJmsConnectionFactory 빈을 사용할 수 있습니다:
Java
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
Kotlin
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("nonXaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
일관성을 위해 jmsConnectionFactory 빈도 빈 별칭 xaJmsConnectionFactory를 사용하여 제공됩니다:
Java
import jakarta.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyBean {
public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
// ...
}
}
Kotlin
import jakarta.jms.ConnectionFactory
import org.springframework.beans.factory.annotation.Qualifier
class MyBean(@Qualifier("xaJmsConnectionFactory") connectionFactory: ConnectionFactory?)
Supporting an Embedded Transaction Manager
XAConnectionFactoryWrapper와 XADataSourceWrapper 인터페이스를 사용하여 임베디드 트랜잭션 매니저를 지원할 수 있습니다.
이 인터페이스는 XAConnectionFactory와 XADataSource 빈을 래핑하고 일반 ConnectionFactory와 DataSource 빈으로 노출하여 분산 트랜잭션에 투명하게 등록합니다.
DataSource 및 JMS 자동 구성은 ApplicationContext 내에 JtaTransactionManager 빈과 적절한 XA 래퍼 빈이 등록되어 있는 경우 JTA 변형을 사용합니다.
