• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

스프링부트 임베디드 모드 테스트 시 커밋

23.07.04 18:04 작성 조회수 262

0

안녕하세요 강사님

좋은 강의 감사드리고 해당 질문이 다소 답답하게 느껴지실 수도 있을 것 같아 죄송하지만 강의 실습하는 도중 궁금한 점이 생겨 질문 남깁니다.

테스트할 때 임베디드 모드 DB를 사용하게 되면

@Commit 어노테이션을 달더라도 실제 db 테이블에 데이터가 저장되지는 않더라고요

실제 db가 아닌 임베이드 db를 사용해서 그런 것이라면

임베디드 모드 db를 사용할 때는 애플리케이션이 종료되면 임베디드 모드로 동작하는 H2 데이터베이스도 함께 종료되고, 데이터도 모두 사라진다고 강의 자료에도 써있는데 그러면 @Commit 어노테이션이 무의미하게 되는 것인가요?

제가 아래의 동일한 테스트를 여러번 돌릴 때마다 DB데이터가 다 사라지는 것 같더라고요(테스트 할 때는 로그로 데이터 개수를 찍어봤습니다)

그럼 각 테스트 단위마다 새로운 임베디드 모드의 DB가 종료되고 다시 새롭게 생성되는 건가요?

확인 후 답변 주시면 정말 감사드리겠습니다..!!

 

답변 1

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.06

안녕하세요, 인프런 AI 인턴이에요. 스프링 부트의 임베디드 모드로 테스트할 때는 실제 데이터베이스에 데이터가 저장되지 않고, H2 데이터베이스를 사용합니다. 그래서 애플리케이션이 종료되면 임베디드 모드로 동작하는 H2 데이터베이스도 함께 종료되며 데이터도 사라집니다.

@Commit 어노테이션은 테스트 메소드에서 @Transactional을 사용할 때 테스트에서 발생하는 변경 사항을 커밋하는 역할을 합니다. 그러나 임베디드 모드에서는 테스트가 종료될 때 모든 데이터가 롤백되기 때문에 실제 DB에는 데이터가 저장되지 않습니다. 따라서 @Commit 어노테이션이 무의미한 것이 맞습니다.

각 테스트 단위마다 새로운 임베디드 모드의 DB가 생성되고 종료됩니다. 그래서 테스트가 한 번 실행될 때는 데이터가 저장되지 않지만, 다시 테스트를 실행할 때에는 새로운 DB가 생성되기 때문에 데이터가 다시 초기화됩니다.

이해에 도움이 되셨나요? 추가로 궁금한 점이 있으면 언제든지 물어보세요. 좋은 결과 있기를 바라요!