일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ==
- repository
- 오블완
- EntityManager
- chown
- git pat
- java
- Python
- MariaDB
- Jenkins
- jetbrain
- 트랜잭션
- git
- JPQL
- git branch 삭제
- exe
- gtihub
- 티스토리챌린지
- IntelliJ
- db종류
- 프로시저
- docker
- 자동배포
- 애널리틱스4
- JPA
- ci/cd
- pat발급
- analytics4
- spring
- Today
- Total
hanker
Spring - 프로시저 롤백처리 방법에 관해(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()) 본문
Spring - 프로시저 롤백처리 방법에 관해(TransactionAspectSupport.currentTransactionStatus().setRollbackOnly())
hanker 2024. 10. 16. 00:09TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
1. TransactionAspectSupport: Spring AOP의 트랜잭션 관리를 지원하는 클래스
2. currentTransactionStatus(): 현재 실행 중인 트랜잭션의 상태 정보를 가져온다.
3. setRollbackOnly(): 트랜잭션 상태를 롤백 전용으로 설정
동작은
1. 트랜잭션 상태 확인: 현재 실행 중인 트랜잭션의 상태를 가져온 후
2. 롤백 표시: 해당 트랜잭션을 롤백해야 함을 Spring에 알림
3. 트랜잭션 종료 시 동작: 메서드가 종료될 때 Spring이 트랜잭션을 자동으로 롤백
@Transactional 어노테이션은 런타임 예외처리(RuntimeException)에서만 롤백을 수행하기 때문에, 체크드 예외(Checked Exception)처리로 세밀한 제어가 가능하다.
논외.
체크드 예외처리란 : 컴파일 시점에 처리 여부를 체크하는 예외처리 (RuntimeException 과 그 하위 클래스를 제외한 Exception)
대표적으로 IOException, SQLException, ClassNotFoundException 이 있다.
예외를 throw하지 않고도 트랜잭션을 롤백할 수 있다.
단, @Transactional 내에서 사용해야함
또한 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 실행 후 메서드가 종료되지 않음 이어서 계속 실행되고 메서드가 종료될 때 롤백 된다.
예제 코드
@Service
@RequiredArgsConstructor
@Slf4j
public class TestServiceImpl {
private final TestRepository testRepository;
@Transactional
public Map<String, Object> testTransactional(){
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> map = testRepository.testCallA();
if (!map.containsKey("result")) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
result.put("status", "ROLLBACK");
result.put("message", "롤백처리");
return result;
} else {
testRepository.testCallB();
result.put("status", "SUCCESS");
result.put("message", "성공");
}
} catch (Exception e) {
log.error("Error", e);
result.put("status", "ERROR");
result.put("message", e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
}
위 코드를 간략하게 설명하자면
1. testCallA 프로시저를 실행해서 결과 값을 map에 담는다.
2. map안에 result라는 key가 없으면 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 발생
3. result안에 status와 message를 넣고 return
4. map안에 result라는 key가 있으면 testCallB 프로시저 호출
간단하게 설정이 가능하다.
끝.
'SPRING' 카테고리의 다른 글
Spring - JPQL(Java Persistence Query Language) 완벽 정리 (2) | 2024.10.24 |
---|---|
Spring - JPA EntityManager 완벽 정복 (0) | 2024.10.23 |
Spring boot - application.properties Oracle DB 설정 (properties/yml) (0) | 2024.10.10 |
Spring - excel to csv 파일 변환 (한글 깨짐 문제 완벽 해결) (0) | 2024.10.06 |
Spring Boot - 메서드 호출 전/후 로깅 (AOP) (0) | 2024.10.04 |