강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

황대선님의 프로필 이미지
황대선

작성한 질문수

실무에서 @Transactional의 noRollbackFor 옵션을 실제로 사용하나요?

작성

·

132

·

수정됨

0

안녕하세요 영한님 강의 너무 잘 듣고 있습니다.

스프링에서 @Transactional은 UnCheckedException은 Rollback을 수행하고, CheckedException은 Rollback하지 않는 것으로 알고 있습니다.
그렇다면, @Transactional의 noRollbackFor 옵션을 사용하여 특정 UnCheckedException을 의도적으로 Rollback시키지 않는 것은 잘못된(?) 코드인가요?


나름대로 noRollbackFor을 사용한 예시 코드를 만들어보았습니다.


@Service
@RequiredArgsConstructor
public class SomeService {

    private final SomeRepository someRepository;
    
    @Transactional(noRollbackFor = CustomRuntimeException.class)
    public void process() {
        ...

        if(doSomeBusinessLogic()){
            throw new CustomRuntimeException("Custom unchecked exception 발생");
            Events.raise(new SomeEvent("어떠한 이벤트"));
        }
      
        ...
    }

 

테스트 결과 noRollbackFor를 사용한 경우에는 이벤트가 발행이 되고, noRollbackFor가 없을 경우에는 이벤트 발행이 되지 않았습니다.

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

@TransactionalnoRollbackFor 옵션을 실무에서 사용하는 경우는 분명 존재합니다. 일반적으로 @Transactional은 비즈니스 로직 수행 중 예외가 발생할 경우 데이터의 일관성을 유지하기 위해 해당 트랜잭션 내의 모든 데이터 변경 작업을 롤백합니다.

하지만 특정 예외 상황에서는 비즈니스 요구사항에 따라 데이터 변경 작업을 유지해야 할 필요가 있을 수 있습니다. 이런 경우 noRollbackFor 옵션이 유용하게 사용됩니다. 예를 들어, 비즈니스 로직 수행 중 특정 조건에서는 예외를 던지되, 그 동안의 데이터 변경은 유지하고 싶은 상황이 있을 수 있습니다.

황대선님의 예시 코드와 같이, 비즈니스 로직 수행 중 예외 발생에도 불구하고 일부 데이터 변경이나 이벤트 발생 등을 유지하고자 할 때 noRollbackFor 옵션을 사용하면 그 목적을 달성할 수 있습니다.

따라서, noRollbackFor 옵션의 사용은 잘못된 코드라기보다는 특정 비즈니스 요구 상황에 따른 의도적인 선택이 될 수 있습니다. 그러나 이 옵션을 사용할 때는 해당 작업의 전체 트랜잭션 관리 및 데이터 일관성에 주의를 기울여야 합니다. 그리고 가능하면 이런 특수한 경우를 최소화하고, 사용 시 충분한 테스트와 코드 리뷰를 거치는 것이 중요합니다.

황대선님의 프로필 이미지
황대선

작성한 질문수

질문하기