인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

키노님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

홈 화면과 레이아웃

테스트 코드에서 @Transaction사용 시 delete 쿼리가 나가지 않습니다.

해결된 질문

작성

·

67

·

수정됨

0


안녕하세요. 강의를 수강하며 따로 게시판을 만들어보는중에 문제가 발생하여 질문드립니다.

다름이 아니라 테스트 코드 작성중에 em.delete()를 사용하는 부분에서 궁금증이 생겨 질문 남깁니다.

아래는 테스트 코드가 작성 된 부분입니다.

스크린샷 2025-01-04 오후 10.25.08.png

회원을 만들고 게시글을 작성하고 이 게시글을 삭제하도록 하였습니다.

스크린샷 2025-01-04 오후 10.24.41.png스크린샷 2025-01-04 오후 10.25.49.png스크린샷 2025-01-04 오후 10.26.02.png

PostService의 deletePost, PostRepository의 delete를 사용하여 게시글의 id를 입력받아 삭제하는 구조로 작성하였습니다.


여기서 테스트를 실행 시키면 테스트가 실패합니다.
기대값은 0인데 실제로 1이되어 있다고 나옵니다.

스크린샷 2025-01-04 오후 10.27.39.png

로그를 통해 확인해보면 delete 쿼리가 작동하지 않았습니다.

하지만 테스트 클래스의 @SpringBootTest아래의 @Transactional을 삭제하고 실행 시키면

스크린샷 2025-01-04 오후 10.30.49.png

delete 쿼리가 작동하고 테스트가 정상 동작합니다.

@Transactional을 사용하면서 delete문이 제대로 작동하도록 할 수 있을까요?

웹 서핑을 하며 테스트 해본 것입니다.
1. em.flush()
2. @Rollback(value=false)


답변 1

0

인프런 AI 인턴님의 프로필 이미지

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

키노님, 테스트 코드에서 @Transactional을 사용할 때 delete 쿼리가 작동하지 않는 문제를 겪고 계신 것 같습니다. 이는 종종 트랜잭션 내에서의 데이터 변경 사항이 자동으로 처리되지 않아 발생할 수 있는 문제입니다. @Transactional을 사용하면 기본적으로 테스트가 끝나면 롤백되기 때문에, 데이터베이스의 상태 변화가 반영되지 않습니다. 이를 해결하기 위해 몇 가지 사항을 시도해볼 수 있습니다:

해결 방안:

  1. 트랜잭션 내에서의 데이터 플러시(Flush):

    • 트랜잭션 내에서 식별된 데이터 변경 사항(예: delete)이 데이터베이스에 즉시 반영되지 않을 수 있습니다. 자동 커밋 모드가 아니기 때문에 엔티티 매니저(또는 JPA 구현)가 flush() 호출 시점에 데이터베이스와의 동기화를 수행하게 됩니다. 따라서 아래와 같이 수동으로 flush()를 호출해 보세요.
    em.flush();
    
  2. @Rollback(false) 사용:

    • 이미 시도하신 것처럼 @Rollback(false)를 사용하면 롤백이 방지되어 트랜잭션 종료 시점에 데이터베이스에 commit이 발생하게 됩니다. 하지만 문제가 계속된다면, 다른 원인을 찾아보아야 합니다.
  3. delete 쿼리가 실행되지 않는 이유 탐색:

    • JPA 엔티티의 상태 및 영속성 컨텍스트를 점검해 보세요. 만약 해당 엔티티가 영속성 컨텍스트에서 관리되고 있지 않다면, delete가 예상대로 동작하지 않을 수 있습니다.
    • 예를 들어 엔티티가 Detach 상태라면 유지되는 변경 사항이 없을 수 있습니다. 이를 확인하기 위해 엔티티 매니저의 find() 메서드를 이용하거나, 로그를 통해 delete 메서드 호출 직후의 엔티티 상태를 점검합니다.

유사한 질문 참조:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

키노님의 프로필 이미지

작성한 질문수

질문하기