Skip to content

[BE] Test container ‐ 협업을 위한 테스트 DB

Mingyu Song edited this page Feb 25, 2025 · 2 revisions

테스트 환경에서의 데이터베이스 선택: 테스트 컨테이너 vs 로컬 DB

작성자: 송민규

관련 PR: PR 링크


개요

  • 테스트 환경을 구축할 때 데이터베이스 선택은 매우 중요한 결정입니다.
  • 특히, 운영 환경과의 유사성을 유지하면서도 개발자들이 효율적으로 테스트를 진행할 수 있도록 하는 것이 핵심입니다.
  • 본 아티클에서는 H2 데이터베이스의 한계를 경험한 후, 저희가 고려한 두 가지 대안인 테스트 컨테이너로컬 DB의 장단점을 비교하고, 테스트 컨테이너를 선택한 이유를 설명합니다.

기존 H2 데이터베이스의 한계

  • H2 데이터베이스는 가벼운 인메모리 DB로, 빠른 테스트 실행이 가능하다는 장점이 있습니다.
  • 그러나 MySQL의 특정 기능(특히 Geo 관련 기능)과의 호환성 문제로 인해 테스트의 신뢰성이 떨어지는 문제가 있었습니다.
  • 따라서 보다 운영 환경과 유사한 테스트 환경을 구축할 필요성이 대두되었습니다.

고려한 대안

H2의 한계를 극복하기 위해 두 가지 방안을 검토했습니다:

  1. 테스트 컨테이너 사용 (Testcontainers)
  2. 로컬 DB 활용

1. 테스트 컨테이너

테스트 컨테이너(Testcontainers)는 도커 컨테이너를 활용하여 외부 의존성을 포함한 테스트 환경을 자동으로 구축하고 관리할 수 있는 Java 라이브러리입니다.

장점

  • 운영 환경과의 유사성: MySQL을 그대로 사용할 수 있어, 운영 환경과 거의 동일한 DB 환경을 테스트에서 재현할 수 있습니다.
  • 일관된 테스트 환경 유지: 모든 개발자가 동일한 환경에서 테스트를 수행할 수 있어, 환경 차이로 인한 테스트 실패 가능성을 줄일 수 있습니다.
  • 자동화된 테스트 환경 관리: 개발자가 로컬에서 직접 DB를 설치하거나 설정할 필요 없이, 컨테이너가 자동으로 테스트 환경을 제공해줍니다.

단점

  • 테스트 실행 속도 저하: 매번 테스트 실행 시 컨테이너가 시작되므로 테스트 시간이 증가할 수 있습니다.
  • 도커 의존성: 테스트 실행을 위해 로컬에 Docker가 설치되어 있어야 하며, Docker 데몬이 실행 중이어야 합니다. 그러나 이는 CI/CD 환경(GitHub Actions 등)에서는 기본적으로 지원되므로, 실질적인 문제는 아닙니다.

2. 로컬 DB

각 개발자가 개별적으로 로컬에 MySQL을 설치하고, 이를 활용하여 테스트를 실행하는 방식입니다.

장점

  • 빠른 테스트 실행: 별도의 컨테이너 실행 과정 없이 즉시 테스트를 실행할 수 있습니다.
  • 추가적인 설정이 필요 없음: 개발자가 이미 로컬에 MySQL을 설치한 경우, 별도의 환경 설정이 필요하지 않습니다.

단점

  • 환경 차이로 인한 테스트 불일치: 각 개발자의 로컬 환경이 다를 수 있어, A 개발자 환경에서 통과한 테스트가 B 개발자 환경에서는 실패할 가능성이 있습니다.
  • 버전 및 데이터 동기화 문제: 개발자마다 서로 다른 MySQL 버전을 사용할 가능성이 있으며, 테스트 데이터를 동기화하는 작업이 필요합니다.

실제 사례 분석

테스트 컨테이너를 도입하여 성공적으로 운영한 사례를 조사한 결과, 다음과 같은 기업들이 이를 적극적으로 활용하고 있었습니다.

  • 지마켓(Gmarket): 테스트 컨테이너를 사용하여 운영 환경과 동일한 테스트 환경을 유지하며, 환경 설정 자동화를 통해 개발 효율성을 극대화함.
  • 컬리(Kurly): MySQL과의 호환성 문제를 해결하기 위해 H2에서 테스트 컨테이너로 전환, 테스트의 신뢰도를 높이는 데 성공함.
  • 딜리셔스(Delicious): 개발자 간의 일관된 테스트 환경을 제공하기 위해 테스트 컨테이너를 활용, 협업 및 CI/CD 환경 개선.

결론: 협업의 관점에서 테스트 컨테이너 선택

협업의 관점에서, 테스트 컨테이너의 가장 큰 장점은 개발자 간 동일한 DB 환경을 유지할 수 있다는 점입니다.

  • 로컬 DB를 사용할 경우, 개발자마다 환경이 다를 수 있어 테스트 결과의 일관성이 보장되지 않습니다.
  • 반면, 테스트 컨테이너를 사용하면 모든 개발자가 동일한 MySQL 버전과 동일한 초기 데이터 상태에서 테스트를 수행할 수 있습니다.
  • CI/CD 환경에서의 자동화가 용이하여 테스트 신뢰도를 높이고, 유지보수 비용을 줄일 수 있습니다.

이러한 이유로, 운영 환경과 유사한 테스트 환경을 제공하면서도 개발자 간의 일관된 테스트를 보장할 수 있는 테스트 컨테이너 사용을 최종적으로 결정하게 되었습니다.

참고 자료

Clone this wiki locally