작성
·
91
1
[질문 내용]
OrderServiceTest에서 테스트 메서드를 실행하면서 H2 DB에 쿼리가 들어가는지 확인하기 위해 Test 폴더 안에 resources를 지우고 상품주문 테스트 메서드 안에 RollBack(value = false), em.flush()를 통해서 실제 데이터가 들어가는것을 확인하였습니다. 그런데 다시 원래대로 돌리는 과정에서 Test폴더 안에 resource를 만들고 해당 테스트의 application.yml를 돌려났음에도 불구하고 실행했음에도 H2 DB 안에 데이터는 그대로 남더라고요. 그래서 RollBack(value = false), em.flush()를 지우고 다시 실행해도 계속 데이터가 남는데 어떻게 해결하면 좋을까요?
답변 2
0
안녕하세요. soojinkimss님, 공식 서포터즈 y2gcoder입니다.
말씀하신 것을 제가 제대로 이해했다면 테스트용 DB 설정을 지우고 로컬 DB 설정을 이용해서 로컬 DB를 테스트에 이용하셨고, 그 결과로 데이터가 남았다고 이해했습니다.
만약 로컬 DB를 초기화하고 싶으시다면 AI 인턴의 설명 중 1번을 참고하여 src/main/resources/application.yml 의 spring.jpa.hibernate.ddl-auto 값을 create 로 한 뒤, 애플리케이션 실행(테스트 코드 실행이 아닙니다!)을 한 번 해주면 로컬 DB가 깨끗하게 초기화될 것입니다.
그리고 테스트 실행 시 DB에 데이터가 남는지 확인하고 싶으시다면, 로컬 DB에 바로 연결하기 보다는 테스트용 DB를 연결하여 테스트해보시는 것을 권장합니다 🙂
감사합니다.
올려주신 테스트용 application.yml 을 보니
테스트시에는 DB가 인메모리 방식으로 구동하고 있습니다. 쉽게 말해 테스트 DB가 애플리케이션과 동시에 동작하고, 종료시 같이 없어지는 방식입니다.
테스트 DB를 설정해달라고 말씀드린 것은 로컬의 application.yml 처럼 DB를 따로 만들고, 거기에 연결을 해서 테스트를 해보시는 것을 권해드린 것입니다 🙂
처음에 로컬 DB 만들 때처럼 만들되 이름을 달리 해서 만들어보시겠습니까?
예를 들어 지금 로컬 DB는 jpashop 이라는 이름으로 생성하신 것 같습니다! 그러면 테스트 DB 는 jpashoptest 와 같이 만들고 연결해서 테스트해보시는 것을 말씀드렸습니다(당연히 테스트 DB는 테스트할 때 켜주셔야 합니다!)
0
안녕하세요, 인프런 AI 인턴입니다. soojinkimss님.
스프링 부트와 JPA를 사용한 테스트 환경에서의 데이터 관리는 여러 요소들이 결합되어 복잡할 수 있습니다. 특히 H2 같은 인메모리 데이터베이스를 사용할 경우엔 데이터 유지/삭제가 의도대로 되지 않을 수 있습니다.
데이터가 예상대로 롤백되지 않는 문제는 보통 아래 몇 가지 원인에 의해 발생할 수 있습니다:
DDL 설정 확인: application.yml 파일에서 spring.jpa.hibernate.ddl-auto
의 설정을 확인해보세요. none
으로 설정되어 있으면 생성된 테이블이 유지될 수 있습니다. 기본적으로 create-drop
설정을 사용하면 애플리케이션이 시작할 때 테이블이 생성되고, 애플리케이션이 종료될 때 테이블이 삭제됩니다.
테스트 격리 확인: 테스트에서 롤백이 정상적으로 이루어지지 않는 경우, @Transactional
어노테이션이 테스트 클래스에 잘 적용되어 있는지 확인해보세요. JUnit과 같은 테스트 프레임워크에서 이 어노테이션은 기본적으로 테스트 후 자동으로 롤백 처리를 담당합니다.
H2 커넥션 종료: 테스트 데이터가 H2 콘솔에 여전히 남아 있는 경우, 콘솔에서 셧다운이 제대로 이루어지지 않았거나, 여전히 메모리 모드(kjdbc:h2:mem:…)로 작동하고 있을 수 있습니다. 테스트가 끝날 때 DB를 확실하게 종료할 수 있도록 설정하는 것도 필요합니다.
별도의 설정파일: Test 디렉토리 하위의 yml 파일이 아니라 메인 설정 파일이 사용될 수도 있습니다. Test 환경이 메인 설정에 영향을 받지 않도록 디렉토리 경로 및 파일명을 정확히 설정했는지 확인해보세요.
아래는 비슷한 문제에 대한 해결책이 제시된 게시물들이니 추가적으로 확인해보시기를 권장드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
말씀해주신대로 JpaShopApplication을 실행하였더니 데이터가 말끔히 없어진것을 확인하였습니다. 감사합니다~! 그런데 처음부터 테스트용 DB를 연결해서 테스트를 했을 때 DB에 데이터가 안나오길래 로컬 DB로 바꾼거라 어떻게 실행하면 남는지 궁금합니다.
h2 로그인창
h2 실행 창(ORDERS를 실행했을 때 데이터가 없음)
test/resources/application.yml
build-gradle
OrderServiceTest의 상품주문 메소드