해결됨
스프링 DB 2편 - 데이터 접근 활용 기술
강의의 롤백 커밋 기준에 대해 추가로 궁금한 점이 있습니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이전 강의 예외와 트랜잭션 커밋, 롤백 - 기본에서 예외 발생시 트랜잭션 내부에서 예외를 처리하지 못하고, 트랜잭션 범위 밖으로 예외를 던지면,스프링은 기본적으로언체크 예외 = 롤백체크 예외 = 커밋 한다고 배웠습니다.그리고 본 강의 활용에서 체크 예외와 언체크 예외를 통해 커밋과 롤백이 되는 것을 확인할 수 있었는데요.여기서 제가 궁금한 것은 일단 언체크 예외도 명시적으로 던지지 않아도 catch 해서 처리할 수 있다고 알고 있습니다.그러면 스프링이 언체크 예외를 롤백시키는 기준이 트랜잭션 내에서 언체크 예외를 처리하지 못하고 범위 밖으로 던졌을 때에만 롤백하는 것인가요?즉, 해당 트랜잭션 내에서 언체크 예외를 잡아서 처리하면 트랜잭션 범위 밖으로 언체크 예외가 던져졌기 않았기 때문에 해당 트랜잭션이 롤백되지 않고 커밋 되나요?예를 들어 아래의 코드와 같이 트랜잭션은 OrderService의 order() 메서드에서 실행되고, couponService를 통해 주문한 고객에게 쿠폰을 1개 우선 발행한 뒤에, 해당 트랜잭션 내에서 orderRepository.save 를 통해 DB에 주문이 저장됩니다.(주문을 먼저 완료하고 쿠폰을 발행 해야겠지만 제 질문 상황의 명확성을 위해 예시를 이렇게 했습니다.)하지만 orderRepository.save()메서드 실행 도중 DB에 문제가 생겨 Order가 DB에 정상적으로 저장이 되지 않아 Exception이 발생하였고 (언체크 예외) 해당 예외를 잡아서 처리했습니다. 그러면 해당 트랜잭션 밖으로 던져지는 예외는 존재하지 않으며 정상흐름대로 동작합니다. 이 경우 해당 트랜잭션은 롤백되는 것인가요 아니면 커밋되는 것인가요? 1번 질문에서 정상 흐름으로 바뀌었기 때문에 커밋이 된다고 하면,만약 RuntimeException을 잡아 체크 예외로 변경해서 해당 트랜잭션 범위 밖으로 던질 경우도 동일하게 커밋이 되는건가요?@Transactional
public void order(Order order) {
couponService.giveCoupon(order.getUserId));
try { orderRepository.save(order);
} catch (RuntimeException e) {
// Exception을 잡아서 처리하는 로직
}
}