일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Database
- was
- Oracle
- jQuery
- 암호화
- web.xml
- 함수
- JVM
- 개념
- 태그
- eGovFramework
- controller
- json
- input
- 배열
- CSS
- mybatis
- 과정평가형
- Java
- 오류
- TO_DATE
- spring
- sql
- eGov
- javascript
- Ajax
- array
- html
- POI
- select
- Today
- Total
web developer
[egov] 트랜잭션 처리방식1 - Programmatic Transaction Management 본문
[egov] 트랜잭션 처리방식1 - Programmatic Transaction Management
trueman 2024. 9. 13. 00:011. Programmatic Transaction Management
1-1. 정의
egovframeWork에서 Programmatic Transaction Management는 트랜잭션 관리를 개발자가 직접 코드 내에서 제어하는 방식을 의미합니다. 이는 선언적 트랜잭션 관리와 대비되는 개념으로, 선언적 트랜잭션은 주로 XML 설정 파일이나 애노테이션을 통해 관리되지만, Programmatic Transaction Management는 트랜잭션의 시작, 커밋, 롤백 등을 코드에서 명시적으로 처리합니다.
1-2. 주요 특징
- 개발자가 트랜잭션의 흐름을 직접 제어:
- 트랜잭션의 경계를 코드 내에서 명확히 정의하고, 시작, 커밋, 롤백 등을 개발자가 원하는 시점에 명시적으로 처리할 수 있습니다.
- 세밀한 제어 가능:
- 트랜잭션의 경계를 좀 더 세밀하게 조절할 수 있어, 복잡한 비즈니스 로직에 적합합니다. 예를 들어, 특정 조건에서만 트랜잭션을 롤백하거나 커밋하는 상황을 코드 내에서 쉽게 처리할 수 있습니다.
- Spring의 PlatformTransactionManager 사용:
- eGovFramework는 Spring 기반이기 때문에 프로그래매틱 트랜잭션 관리에서도 PlatformTransactionManager 인터페이스를 사용합니다.
- TransactionTemplate 또는 TransactionStatus를 이용하여 트랜잭션의 시작, 커밋, 롤백을 코드에서 처리할 수 있습니다.
2. TransactionTemplate를 사용하는 방법
2-1. 정의
TransactionTemplate를 정의하고 callback 메소드 정의를 이용하여 Transaction 관리를 할 수 있도록 하는 방법이다.
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
위의 설정에서 transactionTemplate를 정의하고 property로 transactionManager을 정의한다. Templeate를 이용한 샘플은 아래와 같다.
2-2. 샘플코드
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class MyService {
private final TransactionTemplate transactionTemplate;
@Autowired
public MyService(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
public void performOperationWithoutResult() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
// 비즈니스 로직 수행
// 예: 데이터베이스 작업, 다른 서비스 호출 등
} catch (Exception e) {
status.setRollbackOnly(); // 예외 발생 시 롤백
}
}
});
}
public Object performOperationWithResult() {
return transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
try {
// 비즈니스 로직 수행
// 결과를 반환
return someResult;
} catch (Exception e) {
status.setRollbackOnly(); // 예외 발생 시 롤백
return null; // 결과 반환을 위한 null 처리
}
}
});
}
}
Transaction Context에 의해 호출될 callback 메소드를 정의하고 이 메소드 내에 비즈니스 로직을 구현해주면 된다.
- 서비스 클래스에서 TransactionTemplate을 사용하여 비즈니스 로직과 트랜잭션을 관리합니다.
- TransactionCallbackWithoutResult는 트랜잭션 내에서 결과( Result 값 )를 반환할 필요가 없을 때 사용하며, TransactionCallback은 트랜잭션 내에서 결과( Result 값 )를 반환해야 할 때 사용합니다.
또한, callback 메소드 내에서 입력 인자인 TransactionStatus 객체의 setRollbackOnly() 메소드를 호출함으로써 해당 Transaction을 rollback할 수 있다.
3.Trnasaction Manager를 사용하는 방법
3-1. 정의
Transaction Manager를 직접 이용하는 방법이다.
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
위의 설정에서 transactionManager을 정의한다.
3-2. 샘플코드
@Service
public class MyService {
@Autowired
private PlatformTransactionManager transactionManager;
public void performOperation() {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 비즈니스 로직 수행
transactionManager.commit(status); // 성공 시 커밋
} catch (Exception e) {
transactionManager.rollback(status); // 예외 발생 시 롤백
throw e;
}
}
}
Transaction 서비스를 직접 얻어온 후에 위와 같이 try~catch 구문 내에서 Transaction 서비스를 이용하여, 적절히 begin, commit, rollback을 수행한다. 이 때, TransactionDefinition와 TransactionStatus 객체를 적절히 이용하면 된다.
'Framework > Egovframework [spring]' 카테고리의 다른 글
[egov] 트랜잭션 처리방식2 - Declarative Transaction Management (2) | 2024.09.13 |
---|---|
[egov] 트랜잭션 관리 (1) | 2024.09.12 |
[egov] 트랜잭션 서비스 (2) | 2024.09.12 |
[egov] egovFramework 페이지네이션 기능 (5) | 2024.08.13 |
[egov] dispacther-servlet.xml / 로그인 체크 Interceptors 설정 (2) | 2024.05.28 |