크게는 작업의 처리 단위이고 보통은 ****DB와 연관된 하나의 작업 단위라는 의미다. 이게 왜 예외처리랑 연관이 없는지 알아보겠다.
백기선 강사님도 구글에서 흔히 볼 수 있는 상단의 표는 문제가 많다고 생각한다. 쇼핑몰에서 주문 → 결제 → 영수증 발행 → 알림이라는 로직이 있고, UncheckedException이 발생하면 롤백하는 지시에 따른다고 가정한다.
@Transactional
public void 상품주문() {
**주문();
결제();
영수증 발행();
주문 및 결제완료 알림();**
}
4가지 절차 중 어느 하나에서 예외가 발생하면 롤백된다면, 결제가 완료되고 영수증까지 다 발행되었는데 롤백된다. 이게 과연 맞는 로직인가?
@Transactional
public void 상품주문() {
**주문();
결제();
영수증 발행();**
**주문 및 결제완료 알림(); // 알림 로직 단에서 예외발생해서 롤백 !!!**
}
정상적인 요구사항에 맞다면 주문-결제까지는 하나의 세트로 보고 알림은 따로 처리하는게 맞다. 조금 더 세분화하면 영수증 발행까지 에러가 나면 catch
해 정상적으로 실행하고 주문/결제만 신경써도 좋다.
@Transactional
public void 상품주문() {
****// 주문-결제는 실패하면 롤백
**주문();
결제();**
// 영수증, 알림은 실패해도 추후에 핸들링해 따로 처리
****try {
**영수증 발행();**
**주문 및 결제완료 알림(); // 알림 로직 단에서 예외발생해서 롤백 !!!**
} catch(예외 ex) {
...
}
}
private void 주문() throws 예외 {
..
}
private void 결제() throws 예외 {
..
}
여기서 결론은 무조건 Unchecked Exception == 롤백이 아니고 완전히 트랜잭션과 예외는 논외라는 것이다. 개발자가 요구사항과 상황에 맞게 트랜잭션에 따라 롤백의 유무를 결정해야 하고 트랜잭션을 작은 단위로 나누는 노력이 필요하다.