트랜잭션이란


크게는 작업의 처리 단위이고 보통은 ****DB와 연관된 하나의 작업 단위라는 의미다. 이게 왜 예외처리랑 연관이 없는지 알아보겠다.

Unchecked Exception은 무조건 롤백해야하나?


image.png

백기선 강사님도 구글에서 흔히 볼 수 있는 상단의 표는 문제가 많다고 생각한다. 쇼핑몰에서 주문 → 결제 → 영수증 발행 → 알림이라는 로직이 있고, UncheckedException이 발생하면 롤백하는 지시에 따른다고 가정한다.

@Transactional
public void 상품주문() {
		**주문();
		결제();
		영수증 발행();
		주문 및 결제완료 알림();**
}

4가지 절차 중 어느 하나에서 예외가 발생하면 롤백된다면, 결제가 완료되고 영수증까지 다 발행되었는데 롤백된다. 이게 과연 맞는 로직인가?

@Transactional
public void 상품주문() {
		**주문();
		결제();
		영수증 발행();**
		**주문 및 결제완료 알림();      // 알림 로직 단에서 예외발생해서 롤백 !!!**
}

정상적인 요구사항에 맞다면 주문-결제까지는 하나의 세트로 보고 알림은 따로 처리하는게 맞다. 조금 더 세분화하면 영수증 발행까지 에러가 나면 catch 해 정상적으로 실행하고 주문/결제만 신경써도 좋다.

@Transactional
public void 상품주문() {
			****// 주문-결제는 실패하면 롤백
			**주문();
			결제();**
			
			// 영수증, 알림은 실패해도 추후에 핸들링해 따로 처리
			****try {
					**영수증 발행();**
					**주문 및 결제완료 알림();      // 알림 로직 단에서 예외발생해서 롤백 !!!**
			} catch(예외 ex) {
					...
			}
}

private void 주문() throws 예외 {
		..
}
private void 결제() throws 예외 {
		..
}

결론


여기서 결론은 무조건 Unchecked Exception == 롤백이 아니고 완전히 트랜잭션과 예외는 논외라는 것이다. 개발자가 요구사항과 상황에 맞게 트랜잭션에 따라 롤백의 유무를 결정해야 하고 트랜잭션을 작은 단위로 나누는 노력이 필요하다.