inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

주문 기능 테스트

Test의 application.yml을 지웠을 때

106

soojinkimss

작성한 질문수 58

1

[질문 내용]

OrderServiceTest에서 테스트 메서드를 실행하면서 H2 DB에 쿼리가 들어가는지 확인하기 위해 Test 폴더 안에 resources를 지우고 상품주문 테스트 메서드 안에 RollBack(value = false), em.flush()를 통해서 실제 데이터가 들어가는것을 확인하였습니다. 그런데 다시 원래대로 돌리는 과정에서 Test폴더 안에 resource를 만들고 해당 테스트의 application.yml를 돌려났음에도 불구하고 실행했음에도 H2 DB 안에 데이터는 그대로 남더라고요. 그래서 RollBack(value = false), em.flush()를 지우고 다시 실행해도 계속 데이터가 남는데 어떻게 해결하면 좋을까요?

java spring 웹앱 spring-boot jpa

답변 2

0

y2gcoder

안녕하세요. soojinkimss님, 공식 서포터즈 y2gcoder입니다.

 

말씀하신 것을 제가 제대로 이해했다면 테스트용 DB 설정을 지우고 로컬 DB 설정을 이용해서 로컬 DB를 테스트에 이용하셨고, 그 결과로 데이터가 남았다고 이해했습니다.

만약 로컬 DB를 초기화하고 싶으시다면 AI 인턴의 설명 중 1번을 참고하여 src/main/resources/application.yml 의 spring.jpa.hibernate.ddl-auto 값을 create 로 한 뒤, 애플리케이션 실행(테스트 코드 실행이 아닙니다!)을 한 번 해주면 로컬 DB가 깨끗하게 초기화될 것입니다.

그리고 테스트 실행 시 DB에 데이터가 남는지 확인하고 싶으시다면, 로컬 DB에 바로 연결하기 보다는 테스트용 DB를 연결하여 테스트해보시는 것을 권장합니다 🙂

 

감사합니다.

1

soojinkimss

말씀해주신대로 JpaShopApplication을 실행하였더니 데이터가 말끔히 없어진것을 확인하였습니다. 감사합니다~! 그런데 처음부터 테스트용 DB를 연결해서 테스트를 했을 때 DB에 데이터가 안나오길래 로컬 DB로 바꾼거라 어떻게 실행하면 남는지 궁금합니다.

h2 로그인창

테스트db2.png

 

h2 실행 창(ORDERS를 실행했을 때 데이터가 없음)

테스트db3.png

 

test/resources/application.yml

테스트db4.png

 

build-gradle

테스트db5.png

 

OrderServiceTest의 상품주문 메소드

테스트db1.png



0

y2gcoder

올려주신 테스트용 application.yml 을 보니

테스트시에는 DB가 인메모리 방식으로 구동하고 있습니다. 쉽게 말해 테스트 DB가 애플리케이션과 동시에 동작하고, 종료시 같이 없어지는 방식입니다.

테스트 DB를 설정해달라고 말씀드린 것은 로컬의 application.yml 처럼 DB를 따로 만들고, 거기에 연결을 해서 테스트를 해보시는 것을 권해드린 것입니다 🙂

처음에 로컬 DB 만들 때처럼 만들되 이름을 달리 해서 만들어보시겠습니까?
예를 들어 지금 로컬 DB는 jpashop 이라는 이름으로 생성하신 것 같습니다! 그러면 테스트 DB 는 jpashoptest 와 같이 만들고 연결해서 테스트해보시는 것을 말씀드렸습니다(당연히 테스트 DB는 테스트할 때 켜주셔야 합니다!)

1

soojinkimss

덕분에 잘 해결되었습니다~~! 너무너무 감사합니다^ㅇ^

0

인프런 AI 인턴

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

스프링 부트와 JPA를 사용한 테스트 환경에서의 데이터 관리는 여러 요소들이 결합되어 복잡할 수 있습니다. 특히 H2 같은 인메모리 데이터베이스를 사용할 경우엔 데이터 유지/삭제가 의도대로 되지 않을 수 있습니다.

데이터가 예상대로 롤백되지 않는 문제는 보통 아래 몇 가지 원인에 의해 발생할 수 있습니다:

  1. DDL 설정 확인: application.yml 파일에서 spring.jpa.hibernate.ddl-auto의 설정을 확인해보세요. none으로 설정되어 있으면 생성된 테이블이 유지될 수 있습니다. 기본적으로 create-drop 설정을 사용하면 애플리케이션이 시작할 때 테이블이 생성되고, 애플리케이션이 종료될 때 테이블이 삭제됩니다.

  2. 테스트 격리 확인: 테스트에서 롤백이 정상적으로 이루어지지 않는 경우, @Transactional 어노테이션이 테스트 클래스에 잘 적용되어 있는지 확인해보세요. JUnit과 같은 테스트 프레임워크에서 이 어노테이션은 기본적으로 테스트 후 자동으로 롤백 처리를 담당합니다.

  3. H2 커넥션 종료: 테스트 데이터가 H2 콘솔에 여전히 남아 있는 경우, 콘솔에서 셧다운이 제대로 이루어지지 않았거나, 여전히 메모리 모드(kjdbc:h2:mem:…)로 작동하고 있을 수 있습니다. 테스트가 끝날 때 DB를 확실하게 종료할 수 있도록 설정하는 것도 필요합니다.

  4. 별도의 설정파일: Test 디렉토리 하위의 yml 파일이 아니라 메인 설정 파일이 사용될 수도 있습니다. Test 환경이 메인 설정에 영향을 받지 않도록 디렉토리 경로 및 파일명을 정확히 설정했는지 확인해보세요.

아래는 비슷한 문제에 대한 해결책이 제시된 게시물들이니 추가적으로 확인해보시기를 권장드립니다.

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

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

27

1

sdk 설정 오류

0

67

2

오탈자 - @Transactional

0

62

1

src/test/resources 테스트 경로 문제

0

56

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

70

1

MemberRepositoryTest 실행오류

0

90

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

195

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

153

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

56

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

80

1

기본 생성자

0

67

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

107

1

멤버서비스테스트 부분에서 막힙니다.

0

173

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

124

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

129

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

121

1

24분 27초 연관관계 편의 메서드 위치

0

118

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

114

2

빌드 툴, Gradle

0

63

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

81

2

Repository에서 EntityManager 주입 방식 차이

0

97

1

롬복과 사용자 정의 setter 메서드

0

77

1

주문 목록 조회 fetch join 질문드립니다

0

91

1

dirty checking 질문드립니다.

0

86

1