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

박태영님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

데이터 일관성유지를 어떻게 하면서 테스트하는지 궁금합니다.

해결된 질문

작성

·

92

·

수정됨

0

안녕하세요. 인강 너무 잘 들었습니다. 궁금한 게 몇 가지 있어 질문드리게 되었습니다.

현재 H2 데이터로 테스트 코드를 작성해 주셨는데요.

 

개발 환경의 DB 서버를 My-sql DB로 생성하고 테스트 코드를 구현하게 되면, 다른 개발자로 인해 DB의 데이터가 인입되면서 테스트 코드의 일관성이 깨지는 경우가 많이 발생되었습니다. 그렇다고 H2 데이터로 로컬환경을 붙이려고 하니 Mysql과 H2의 엔티티의 컬럼 선언이 다른경우가 존재해서 JPA의 자체 auto-ddl: create가 안먹히는 경우가 발생이되었습니다.

 

[요약]

  • 개발 환경을 MY-SQL DB로 구현하면 같이 개발하면서 데이터가 인입되면서 테스트 코드의 일관성이 깨짐

  • 그렇다고 H2 DB로 진행하려고 하니, 엔티티의 칼럼 설정하는 것이 달라서 스프링 부트가 실행되지 않음

Service Layer에서 일관성 있게 테스트 환경을 설정하려면 H2와 Mysql을 같이 돌릴 수 있게 프로젝트를 변경해 줘야 되는지 궁금합니다.

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 박태영 님!

H2를 사용하는 이유는 인메모리 DB로 가볍고, 검증이 다소 편리하기 때문인데요.
일부 상황에서 MySQL과의 차이점이 존재하기 때문에 이점을 염두에 두고 사용해야 합니다.
H2가 가진 장점을 위해 약간의 Trade-off가 있다고 생각하시면 되는데요.

만약 테스트의 용이함을 위해 프로젝트를 아주 약간만 변경할 수 있다면 한번 시도해보시고, 프로덕션 코드에 너무 많은 영향을 주어야 한다면, 테스트 환경을 MySQL로 구성하는 것도 하나의 방법이 될 수 있겠습니다. (TestContainers 적용 등 - 다만, TestContainers를 사용하면 그만큼 속도적인 부분은 포기하셔야 합니다 🥲)

도움이 되셨기를 바랍니다.
감사합니다 🙂

0

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

박태영님의 질문은 H2와 MySQL을 사용하면서 발생하는 테스트 환경의 데이터 일관성 문제와 엔티티 컬럼 설정의 차이로 인한 이슈에 관한 것으로 이해됩니다. 이와 유사한 상황을 해결한 경험이 있는 개발자들의 조언이 도움이 될 것 같습니다.

우선, H2 데이터베이스와 MySQL을 함께 사용하면서 테스트 환경을 일관성 있게 유지하는 방법에 관해서는 여러 접근 방법이 있습니다. 하나의 방법은 Spring Profiles을 사용하여 application.yml에서 서로 다른 프로필을 설정하여 각 환경에 맞는 설정을 구성하는 것입니다. 이 방법을 통해 개발 환경과 테스트 환경을 분리하여 관리할 수 있습니다.

“테스트코드에서만 적용되는 yml 설정을 하고 싶습니다.“라는 질문에 대해 다루어진 테스트코드에서만 적용되는 yml 설정을 하고 싶습니다. 글을 참조하시면, 실제로 이러한 문제를 해결하는데 도움이 될 수 있는 방법론을 찾을 수 있을 겁니다. 테스트 코드용 yml 파일을 별도로 구성하여 테스트 환경에서는 H2, 개발 또는 운영 환경에서는 MySQL을 사용하도록 설정하는 방법에 대해 설명되어 있습니다.

또한, Spring Boot에서 데이터베이스 테스트 환경을 설정하는데 관하여는 환경별 DB 분리 질문있습니다.에서 제시된 답변에서와 같이, 테스트용 resources로 yml을 따로 작성하고, @ActiveProfiles을 사용하여 테스트 프로필을 분리하는 방법을 추천드립니다.

이러한 접근은 H2와 MySQL 간의 호환성 문제를 해결하고, 각 환경에 맞게 데이터베이스를 구성할 수 있게 해줍니다. H2와 MySQL사이의 DDL 명령어 차이로 인해 발생하는 문제는 dialect 설정이나 커스텀 SQL 스크립트를 통해 해결할 수도 있습니다. JPA 엔티티의 컬럼 선언이 데이터베이스 간의 차이로 인해 문제가 발생한다면, 최소한의 변경으로 서로 호환될 수 있도록 엔티티 정의를 조정해야 할 수도 있습니다.

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