자바 트랜잭션 API
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
자바 트랜잭션 API(JTA)는 자바 환경에서 X/Open XA 아키텍처를 구현한 것으로, 분산 트랜잭션을 관리하기 위한 API를 제공한다. JTA는 `javax.transaction` 및 `javax.transaction.xa` 패키지로 구성되며, 애플리케이션 서버와 애플리케이션 컴포넌트 간의 트랜잭션 경계를 설정하고, 트랜잭션 관리자를 위한 인터페이스와 X/Open XA 프로토콜의 표준 자바 매핑을 정의한다. JTA는 `UserTransaction` 인터페이스를 통해 프로그래밍 방식으로 트랜잭션 경계를 제어하거나, `@Transactional` 어노테이션을 사용하여 선언적으로 트랜잭션을 제어할 수 있도록 지원하며, EJB 서버와 JNDI에서도 `UserTransaction`을 지원한다. JTA를 사용한 트랜잭션 관리자의 구현체로는 JTS(Java Transaction Service)가 있다.
더 읽어볼만한 페이지
- 자바 사양 요청 - 자바 플랫폼, 마이크로 에디션
자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다. - 자바 사양 요청 - 자바 커뮤니티 프로세스
자바 커뮤니티 프로세스는 자바 기술 명세의 개발 및 관리를 담당하는 조직으로, 자바 기술 표준화와 발전에 기여해왔으나 운영 방식에 대한 비판과 여러 논란에 직면해 있다. - 자바 플랫폼, 엔터프라이즈 에디션 - IBM 웹스피어
IBM 웹스피어는 IBM에서 출시한 기업용 소프트웨어 제품군 브랜드로, 다양한 애플리케이션 인프라, 비즈니스 프로세스 통합, 정보 통합 및 개발 도구를 포함한다. - 자바 플랫폼, 엔터프라이즈 에디션 - 자카르타 서버 페이지
자카르타 서버 페이지(JSP)는 웹 애플리케이션 개발에 사용되는 서버 측 스크립팅 기술로, 서블릿으로 변환되어 실행되고 HTML 형태로 결과를 반환하며, 지시어, 스크립틀릿, 표현식, 액션 등의 문법 요소, 표현 언어(EL), JSTL을 통해 동적인 웹 페이지를 구현하고 개발 편의성을 높였다.
자바 트랜잭션 API | |
---|---|
개요 | |
종류 | 자바 API |
명세 | 자카르타 EE |
상세 정보 | |
최초 버전 | 1.0 (1999년 6월) |
최신 버전 | 2.0 (2023년 5월 23일) |
라이선스 | CDDL 1.1 |
개발 | |
개발자 | 오라클 (이전에는 선 마이크로시스템즈) |
플랫폼 | 자바 |
2. X/Open XA 아키텍처
X/Open XA영어 아키텍처에서 TP 모니터는 데이터베이스 및 메시지 큐와 같은 여러 리소스 간의 트랜잭션을 조정한다. 각 리소스에는 자체 리소스 관리자가 있다. 리소스 관리자는 일반적으로 리소스를 조작하기 위한 자체 API, 예를 들어 관계형 데이터베이스 작업을 위한 JDBC API를 가지고 있다. 또한 리소스 관리자는 TP 모니터가 자체 및 다른 리소스 관리자 간에 분산 트랜잭션을 조정할 수 있도록 한다. 마지막으로, 트랜잭션을 시작, 커밋 또는 롤백하기 위해 TP 모니터와 통신하는 애플리케이션이 있다. 애플리케이션은 또한 리소스를 수정하기 위해 자체 API를 사용하여 개별 리소스와 통신한다.
2. 1. 구성 요소
X/Open XA 아키텍처에서 트랜잭션 매니저/transaction manager영어 (또는 TP 모니터)는 데이터베이스 등 여러 리소스 간의 트랜잭션을 조정한다. 각 리소스에는 매니저가 대응하고 있다. 리소스 관리자는 일반적으로 리소스를 조작하기 위한 고유 API를 가지며, 예를 들어 관계형 데이터베이스에서는 JDBC API가 사용된다. TP 모니터는 여러 리소스 매니저 간의 분산 트랜잭션을 조정한다. 애플리케이션은 TP 모니터와 통신하여 TP 모니터에 트랜잭션 그룹의 시작, 커밋, 롤백을 지시한다. 또한, 애플리케이션은 개별 리소스 매니저와도 고유 API로 통신하여 리소스의 갱신 등을 수행한다.3. JTA의 X/Open XA 아키텍처 구현
JTA는 X/Open XA영어 아키텍처를 자바 환경에서 구현한 것이다. JTA API는 `javax.transaction` 및 `javax.transaction.xa` 두 패키지로 구성된다.
JTA는 X/Open XA 아키텍처를 기반으로 하지만, 트랜잭션 경계를 설정하기 위해 두 개의 API를 정의하고 있다. JTA에서는 EJB 서버와 같은 애플리케이션 서버와 그 위의 애플리케이션 컴포넌트를 구분한다. 애플리케이션 서버가 트랜잭션의 시작/커밋/롤백을 지시하기 위한 인터페이스로 `TransactionManager`가 있다. 또한, 서블릿이나 EJB가 트랜잭션을 관리하기 위한 인터페이스로 `UserTransaction`이 있다.
JTA 아키텍처에서는 각 리소스 매니저 위에 `XAResource` 인터페이스를 구현하여 TP 모니터에서 제어할 수 있도록 해야 한다. 각 리소스 매니저에는 다음과 같은 고유의 API가 있다.
- 관계형 데이터베이스용: JDBC
- 메시징 서비스용: JMS
- 범용 EIS(엔터프라이즈 정보 시스템) 리소스용: Jakarta EE 커넥터 API
3. 1. JTA의 API 구성
JTA API는 두 개의 자바 패키지에 있는 클래스 그룹으로 구성된다.- `javax.transaction`: 애플리케이션 서버가 트랜잭션의 시작, 커밋, 롤백을 지시하기 위한 인터페이스인 `TransactionManager`를 제공하고, 서블릿이나 EJB가 트랜잭션을 관리하기 위한 인터페이스인 `UserTransaction`을 제공한다.
- `javax.transaction.xa`: 트랜잭션 리소스 관리자를 위한 X/Open XA 프로토콜의 표준 Java 매핑을 제공한다.
JTA는 X/Open XA 아키텍처를 기반으로 하지만, 트랜잭션 경계를 설정하기 위해 두 개의 API를 정의하고 있다. JTA에서는 EJB 서버와 같은 애플리케이션 서버와 그 위의 애플리케이션 컴포넌트를 구분한다.
JTA 아키텍처에서는 각 리소스 매니저 위에 `XAResource` 인터페이스를 구현하여 TP 모니터에서 제어할 수 있도록 해야 한다. 각 리소스 매니저에는 다음과 같은 고유의 API가 있다.
- 관계형 데이터베이스용: JDBC
- 메시징 서비스용: JMS
- 범용 EIS(기업 정보 시스템) 리소스용: Jakarta EE 커넥터 API
3. 2. 리소스별 API
4. JTA API
자카르타 트랜잭션 API(JTA)는 애플리케이션 수준의 트랜잭션 경계 설정 인터페이스, 애플리케이션 서버를 위한 상위 수준의 트랜잭션 관리자 인터페이스, 그리고 트랜잭션 리소스 관리자를 위한 X/Open XA 프로토콜의 표준 자바 매핑을 제공한다.
JTA API는 두 개의 자바 패키지에 있는 클래스 그룹으로 구성된다.
- `javax.transaction`
- `javax.transaction.xa`
JTA는 X/Open XA 아키텍처를 기반으로 하지만, 트랜잭션 경계를 설정하기 위해 두 개의 API를 정의하고 있다. JTA에서는 EJB 서버와 같은 애플리케이션 서버와 그 위의 애플리케이션 컴포넌트를 구분한다. 애플리케이션 서버가 트랜잭션의 시작/커밋/롤백을 지시하기 위한 인터페이스로 `TransactionManager`가 있다. 또한, 서블릿이나 EJB가 트랜잭션을 관리하기 위한 인터페이스로 `UserTransaction`이 있다.
JTA 아키텍처에서는 각 리소스 매니저 위에 `javax.transaction.xa.XAResource` 인터페이스를 구현하여 TP 모니터에서 제어할 수 있도록 해야 한다. 각 리소스 매니저에는 다음과 같은 고유의 API가 있다.
- 관계형 데이터베이스용: JDBC
- 메시징 서비스용: JMS
- 범용 EIS(기업 정보 시스템) 리소스용: Jakarta EE 커넥터 API
4. 1. UserTransaction 인터페이스
`UserTransaction` 인터페이스는 애플리케이션이 프로그래밍 방식으로 트랜잭션 경계를 제어할 수 있게 한다. 이 인터페이스는 자바 클라이언트 프로그램이나 EJB 빈에서 사용할 수 있다.`UserTransaction.begin()` 메서드는 글로벌 트랜잭션을 시작하고 호출 스레드와 연결한다. 트랜잭션과 스레드의 연결은 트랜잭션 관리자가 투명하게 관리한다. 중첩 트랜잭션 지원은 필수가 아니며, 호출 스레드가 이미 트랜잭션과 연결되어 있고 트랜잭션 관리자 구현이 중첩 트랜잭션을 지원하지 않는 경우 `UserTransaction.begin()` 메서드는 `NotSupportedException`을 발생시킨다.
애플리케이션 프로그램 간 트랜잭션 컨텍스트 전파는 클라이언트 및 서버 머신의 기본 트랜잭션 관리자 구현에 의해 제공된다. 전파에 사용되는 트랜잭션 컨텍스트 형식은 프로토콜에 따라 다르며, 클라이언트 및 서버 호스트 간에 협상되어야 한다. 예를 들어 트랜잭션 관리자가 JTS 사양 구현인 경우, CORBA OTS 1.1 사양에 지정된 트랜잭션 컨텍스트 전파 형식을 사용한다. 트랜잭션 전파는 애플리케이션 프로그램에 투명하게 이루어진다.
JTA는 애플리케이션 서버가 트랜잭션 시작, 커밋, 롤백을 지시하기 위한 인터페이스로 `TransactionManager`를 제공하며, 서블릿이나 EJB가 트랜잭션을 관리하기 위한 인터페이스로 `UserTransaction`을 제공한다.
4. 2. @Transactional 어노테이션
`@Transactional` 어노테이션은 선언적으로 트랜잭션 경계를 제어할 수 있도록 한다. 이 어노테이션은 Jakarta EE 관리형 빈(CDI 관리형 빈 포함)으로 정의하는 모든 클래스에 적용할 수 있다.다음은 요청 범위의 CDI 관리형 빈에서 `@Transactional`를 사용하는 예시이다.
```java
@RequestScoped
public class ExampleBean {
@Transactional
public void foo() { // 여기서 트랜잭션이 활성화됨
// 작업 수행
} // 메서드가 반환된 후 트랜잭션이 커밋되거나 롤백됨
}
```
트랜잭션 동작은 어노테이션의 속성을 통해 구성할 수 있다. 사용 가능한 옵션은 EJB의 옵션과 거의 동일하다.
4. 3. @TransactionScoped 어노테이션
`@TransactionScoped` 어노테이션은 빈(bean)의 수명이 특정 트랜잭션이 활성 상태인 동안에 묶여 있음을 선언할 수 있도록 한다.아래 코드 샘플은 요청 범위의 CDI 관리 빈에서 `@TransactionScoped`의 사용법을 보여준다.
```java
@TransactionScoped
public class TxScopedBean {
public int number;
public int getNumber() { return number; }
public void setNumber(int number) { this.number = number; }
}
@RequestScoped
public class ExampleBean {
@Inject
private TxScopedBean txScopedBean;
@Transactional
public void foo() {
txScopedBean.setNumber(1);
}
@Transactional
public void bar() {
System.out.print(txScopedBean.getNumber());
}
}
```
만약 관리되는 `ExampleBean` 인스턴스에서 먼저 `foo()` 메서드가 호출된 후, 다음에 `bar()` 메서드가 호출된다면, 출력되는 숫자는 1이 아닌 0이 된다. 이는 각 메서드가 자체적인 트랜잭션을 가지고, 따라서 자체적인 `TxScopedBean` 인스턴스를 갖기 때문이다. 따라서 `foo()` 호출 중에 설정된 숫자 1은 `bar()` 호출 중에 보이지 않게 된다.
5. EJB 서버에서의 UserTransaction 지원
EJB 서버는 `javax.ejb.UserTransaction` 인터페이스를 지원해야 하며, 이는 빈 관리 트랜잭션(BMT)을 사용하는 EJB 빈에서 사용된다. (`@TransactionManagement(BEAN)`)[1] `UserTransaction` 인터페이스는 `EJBContext` 인터페이스를 통해 또는 `@Resource` 어노테이션을 사용하여 직접 주입을 통해 EJB 컴포넌트에 접근할 수 있다.[1] EJB 애플리케이션은 트랜잭션 관리를 위해 EJB 서버에 의존한다.[1]
EJB 세션 빈에서 빈 관리 트랜잭션을 통해 `UserTransaction`을 사용하는 예시는 다음과 같다.
```java
@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {
@Resource
private UserTransaction utx;
public void foo() {
// 트랜잭션 시작
utx.begin();
// 작업 수행
// 커밋
utx.commit();
}
}
```
`UserTransaction`은 `SessionContext`에서도 얻을 수 있다.
```java
@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {
@Resource
private SessionContext ctx;
public void foo() {
UserTransaction utx = ctx.getUserTransaction();
// 트랜잭션 시작
utx.begin();
// 작업 수행
// 커밋
utx.commit();
}
}
```
`@TransactionManagement(BEAN)` 어노테이션이 생략되면 `foo()`가 호출될 때마다 JTA 트랜잭션이 자동으로 시작되고 `foo()`가 종료될 때 자동으로 커밋 또는 롤백된다. 따라서 EJB 프로그래밍에서 `UserTransaction`을 사용하는 것은 매우 특수한 경우에만 필요하다.
6. JNDI에서의 UserTransaction 지원
JTA 구현이 환경에 설치된 경우, `java:comp/UserTransaction`에서 `UserTransaction`을 사용할 수 있다.
7. Java Transaction Service (JTS)
JTA를 사용한 트랜잭션 관리자의 구현체이다. CORBA 아키텍처를 기반으로 하며, 여러 JTS 간의 트랜잭션 전파에는 IIOP를 사용한다. Jakarta EE 애플리케이션 서버는 JTS의 구현이 필수 사항으로 여겨진다.
8. 버전의 역사
wikitable
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com