-
Notifications
You must be signed in to change notification settings - Fork 2
[BE] Test container ‐ 협업을 위한 테스트 DB
Mingyu Song edited this page Feb 25, 2025
·
2 revisions
- 테스트 환경을 구축할 때 데이터베이스 선택은 매우 중요한 결정입니다.
- 특히, 운영 환경과의 유사성을 유지하면서도 개발자들이 효율적으로 테스트를 진행할 수 있도록 하는 것이 핵심입니다.
- 본 아티클에서는 H2 데이터베이스의 한계를 경험한 후, 저희가 고려한 두 가지 대안인 테스트 컨테이너와 로컬 DB의 장단점을 비교하고, 테스트 컨테이너를 선택한 이유를 설명합니다.
- H2 데이터베이스는 가벼운 인메모리 DB로, 빠른 테스트 실행이 가능하다는 장점이 있습니다.
- 그러나 MySQL의 특정 기능(특히 Geo 관련 기능)과의 호환성 문제로 인해 테스트의 신뢰성이 떨어지는 문제가 있었습니다.
- 따라서 보다 운영 환경과 유사한 테스트 환경을 구축할 필요성이 대두되었습니다.
H2의 한계를 극복하기 위해 두 가지 방안을 검토했습니다:
- 테스트 컨테이너 사용 (Testcontainers)
- 로컬 DB 활용
테스트 컨테이너(Testcontainers)는 도커 컨테이너를 활용하여 외부 의존성을 포함한 테스트 환경을 자동으로 구축하고 관리할 수 있는 Java 라이브러리입니다.
- 운영 환경과의 유사성: MySQL을 그대로 사용할 수 있어, 운영 환경과 거의 동일한 DB 환경을 테스트에서 재현할 수 있습니다.
- 일관된 테스트 환경 유지: 모든 개발자가 동일한 환경에서 테스트를 수행할 수 있어, 환경 차이로 인한 테스트 실패 가능성을 줄일 수 있습니다.
- 자동화된 테스트 환경 관리: 개발자가 로컬에서 직접 DB를 설치하거나 설정할 필요 없이, 컨테이너가 자동으로 테스트 환경을 제공해줍니다.
- 테스트 실행 속도 저하: 매번 테스트 실행 시 컨테이너가 시작되므로 테스트 시간이 증가할 수 있습니다.
- 도커 의존성: 테스트 실행을 위해 로컬에 Docker가 설치되어 있어야 하며, Docker 데몬이 실행 중이어야 합니다. 그러나 이는 CI/CD 환경(GitHub Actions 등)에서는 기본적으로 지원되므로, 실질적인 문제는 아닙니다.
각 개발자가 개별적으로 로컬에 MySQL을 설치하고, 이를 활용하여 테스트를 실행하는 방식입니다.
- 빠른 테스트 실행: 별도의 컨테이너 실행 과정 없이 즉시 테스트를 실행할 수 있습니다.
- 추가적인 설정이 필요 없음: 개발자가 이미 로컬에 MySQL을 설치한 경우, 별도의 환경 설정이 필요하지 않습니다.
- 환경 차이로 인한 테스트 불일치: 각 개발자의 로컬 환경이 다를 수 있어, A 개발자 환경에서 통과한 테스트가 B 개발자 환경에서는 실패할 가능성이 있습니다.
- 버전 및 데이터 동기화 문제: 개발자마다 서로 다른 MySQL 버전을 사용할 가능성이 있으며, 테스트 데이터를 동기화하는 작업이 필요합니다.
테스트 컨테이너를 도입하여 성공적으로 운영한 사례를 조사한 결과, 다음과 같은 기업들이 이를 적극적으로 활용하고 있었습니다.
- 지마켓(Gmarket): 테스트 컨테이너를 사용하여 운영 환경과 동일한 테스트 환경을 유지하며, 환경 설정 자동화를 통해 개발 효율성을 극대화함.
- 컬리(Kurly): MySQL과의 호환성 문제를 해결하기 위해 H2에서 테스트 컨테이너로 전환, 테스트의 신뢰도를 높이는 데 성공함.
- 딜리셔스(Delicious): 개발자 간의 일관된 테스트 환경을 제공하기 위해 테스트 컨테이너를 활용, 협업 및 CI/CD 환경 개선.
협업의 관점에서, 테스트 컨테이너의 가장 큰 장점은 개발자 간 동일한 DB 환경을 유지할 수 있다는 점입니다.
- 로컬 DB를 사용할 경우, 개발자마다 환경이 다를 수 있어 테스트 결과의 일관성이 보장되지 않습니다.
- 반면, 테스트 컨테이너를 사용하면 모든 개발자가 동일한 MySQL 버전과 동일한 초기 데이터 상태에서 테스트를 수행할 수 있습니다.
- CI/CD 환경에서의 자동화가 용이하여 테스트 신뢰도를 높이고, 유지보수 비용을 줄일 수 있습니다.
이러한 이유로, 운영 환경과 유사한 테스트 환경을 제공하면서도 개발자 간의 일관된 테스트를 보장할 수 있는 테스트 컨테이너 사용을 최종적으로 결정하게 되었습니다.
- 🚏 완벽한 길을 그리기 위한 노력
- 🪖 버그데이 UT 결과 리포트
- 🐜 어드민 페이지
- 🌊 1차 자체 QA
- 🌊 2차 자체 QA
- 🌊 3차 자체 QA
- 🌊 4차 외부 QA
- 🌊 5차 외부 QA
- ☁️ FE의 GCP를 활용한 배포 방식 및 내부 아키텍쳐
- 🍀 UNIRO의 자연스러운 로딩 화면, 어떤 원리일까? (Suspense)
- 🧪 완벽한(?) 페이지를 위한 LightHouse 점수 개선기
- 🌎 구글 구면 좌표계 도입 여부
⚠️ API 통신 에러 처리- 🥷 바텀시트 만들기
- 💨 최적화 : 효율적인 길 렌더링(Event Capturing)
- 📀 최적화 : 오브젝트 캐싱
- 😎 최적화 : 모든 길 조회 SSE 적용