🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

회사일중에 딱 이런상황에 마주쳐서 질문드립니다.

21.12.11 15:57 작성 조회수 261

0

이번 강의에서 내부메소드를 사용할 경우 그 메소드를 클래스로 만들어서 실행하게되면 AOP가 적용된다고 알려주셔서 실제 일하는곳에서 한번 적용을 해보았습니다.

[컨트롤러 - consultSave]

컨트롤러에서 insertConsult를 합니다.

[서비스 - ConsultService]

원래 서비스클래스안에 4개의 로직이 있었으나 Transactional이 적용되지 않아서 각각의 로직을 클래스로 만들어서 적용하였습니다.

[분리된 서비스클래스] 

총4개의 분리된 서비스가 있지만, 너무길어질것 같아서 1개의 로직만 업로드하였습니다!! 물론 분리된 서비스는 스프링빈에 등록될 수 있도록 @Service를 붙여놓은 상태입니다.

간략히 정리하여 저의 생각을 말씀드리면 tranSave.insertConsult()메서드를 통하여 저장을 한 후에 그 다음 로직에서 고의적으로 Exception이 발생시키면 @Transactional이 동작하여 rollback이 되어야한다고 생각하는데 rollback이 동작하지 않아 DB에 1개의 로우가 insert되어있는 현상입니다. 클래스를 나누어서 구조변경하였음에도 불구하고 @Transactional이 동작하지 않는 이유가 궁금합니다.

혹시 try catch문가 연관이 되어있을까요??

답변 1

답변을 작성해보세요.

1

David님의 프로필

David

2021.12.11

안녕하세요. 김은재님, 공식 서포터즈 David입니다.

.
스프링 트랜잭션의 경우 checkedException에서는 예외가 발생하더라도 롤백시키지 않습니다.

발생한 예외가 CheckedException인가요? 그렇다면 RuntimeException을 발생시켜보시겠어요?
.
감사합니다.

김은재님의 프로필

김은재

질문자

2021.12.11

RuntimeException으로 변경하면 롤백이 되고 모든로직을 수행한후에

html파일에서 ajax의 error 로 들어가지않고 success로 들어가게 되는데 왜 error로 빠지지않고 success로 들어가게 될까요??

David님의 프로필

David

2021.12.12

컨트롤러에서 catch로 예외를 처리해주기 때문인걸로 보입니다.

try-catch문에서 예외가 어떻게 처리되고, 예외가 처리된 이후에 어떤 흐름으로 코드가 진행되는지 학습해보시면 바로 알 수 있으실 거에요.

신동훈님의 프로필

신동훈

2022.02.09

조금 늦긴 했지만 rollbackFor이란 옵션을 사용하면 CheckedException도 롤백처리를 하도록 바꿀수 있는걸로 알고있습니다

채널톡 아이콘