강의

멘토링

로드맵

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

윤서진님의 프로필 이미지
윤서진

작성한 질문수

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

인메모리 DB, 테스트 컨테이너 선택 기준이 있으신지 궁금합니다

작성

·

18

0

강의에서는 H2 인메모리 DB를 이용해 테스트를 진행하셨는데,
실무에서는 테스트 환경에서 실제 MySQL이나 PostgreSQL 같은 실제 운영 DB와 동일한 컨테이너 기반 테스트 DB를 사용하는 경우도 많은 것 같습니다.

실무에서는 인메모리 DB와 컨테이너 DB 중 어떤 상황에서 어떤 것을 선택하시는지, 선택 기준이나 장단점에 대해 조언을 받을수 있을까요?

답변 2

0

토비님의 프로필 이미지
토비
지식공유자

메모리DB 테스트는 실행 속도가 빠릅니다. JPA는 DB가 달라져도 동일한 결과를 어느 수준까지 보장을 해줍니다. 그래서 메모리DB를 우선 선택하는 것을 선호합니다.

반면 실제 DB를 컨테이너든, 로컬에 설치한 테스트용 DB를 쓰든 사용하는 경우엔 운영환경과 100% 동일한 조건으로 실행할 수 있고, 또 native sql과 같은 JPA가 지원하지 않는 조회 방식을 쓰는 코드도 테스트가 가능합니다.

실무에선 이 두가지를 동시에 사용하는 경우가 많습니다. 특별한 조회 로직이 있지 않은 기본적인, JPA로 커버되는 DB조작은 메모리 DB로, 실제 사용 DB로만 테스트가 가능한 것은 컨테이너 등을 이용해서 실 DB에 대해서 테스트를 수행합니다.

물론 운영 환경에 배포되기 전에는 h2로 테스트 했던 모든 테스트를 MySQL과 같은 실제 DB를 사용해서 테스트 되도록 만드는 것이 좋습니다. 만에 하나 DB 차이에 의해서, JPA를 쓰더라도 차이가 발생하는 문제를 발견할 수 있기 때문입니다.

물론 처음부터 운영용 DB로만 테스트 할 거야라는 분들도 있습니다. 그래도 상관없습니다. 여기서부터는 좀 취향의 영역이기도 합니다. 대신 테스트 수행 속도에서 차이가 있습니다.

0

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

테스트 환경에서 H2 인메모리 DB와 같은 인메모리 데이터베이스를 사용할지, 또는 MySQL이나 PostgreSQL 같은 실제 운영 DB의 컨테이너 기반 테스트 DB를 사용할지는 다양한 요소를 고려해야 합니다. 각각의 접근 방식에는 고유한 장단점이 있으며, 상황에 따라 적절한 선택이 필요합니다.

인메모리 DB (H2 등)

장점:
- 속도: 인메모리 DB는 메모리를 기반으로 하기 때문에 빠른 성능을 제공합니다. 테스트 수행 시간이 짧고 개발 중 빠른 피드백이 가능합니다.
- 설정의 간편함: 별도의 설치나 외부 설정 없이 간단히 설정 파일만으로 사용할 수 있어, 개발 환경에서 즉각적인 테스트가 가능합니다.

단점:
- 실제 DB와의 차이: 쿼리의 다이얼렉트 차이 또는 특정 DB에 관련된 최적화가 적용되지 않을 수 있어, 모든 테스트 사례를 완벽하게 커버하기 어려울 수 있습니다.
- 완벽한 시뮬레이션 부족: 실제 데이터베이스 환경을 완벽히 재현하지 못할 가능성이 있으며, 특히 운영 환경에서의 복잡한 트랜잭션 상황 등을 테스트하는데 한계가 있을 수 있습니다.

컨테이너 기반 실제 DB (MySQL/PostgreSQL 등)

장점:
- 운영 환경 일치: 실제 운영 환경과 동일한 데이터베이스를 사용하기 때문에, 환경 불일치로 인한 버그를 예방하고, 보다 현실적인 테스트가 가능하다.
- 복잡한 시나리오 테스트: 실제 DB를 사용하므로, 트랜잭션, 잠금, 쿼리 성능 등 복잡한 시나리오를 실제와 가깝게 테스트할 수 있습니다.

단점:
- 복잡한 설정: 각 테스트마다 컨테이너를 띄워야 하기 때문에 인프라 설정이 다소 복잡하며, 초기화 및 셋업 시간이 소모될 수 있습니다.
- 속도 저하: 인메모리 DB보다는 속도가 느릴 수 있으며, 특히 컨테이너 시작, 초기화 등이 모든 테스트 케이스마다 필요하게 되는 경우 전체 테스트 시간이 길어질 수 있습니다.

선택 기준

  1. 개발/빠른 테스트: 빠른 반복과 단순 검증이 필요한 초기 개발 단계에서는 H2와 같은 인메모리 DB를 주로 사용합니다.
  2. 릴리즈 전 통합 테스트: 실질적인 배포 전 테스트에서는 운영 환경과 동일한 DB 컨테이너 기반의 테스트 환경을 구성하여 실제 사용 환경에서의 리그레션 테스트를 수행합니다.
  3. 종속성 및 이식성: 프로젝트의 특성상 데이터베이스에 대한 높은 의존성이 있거나, 데이터베이스 기반의 비즈니스 로직을 집중적으로 검증해야 한다면 실제 DB 환경을 사용하는 것이 좋습니다.

유사한 고민에 대한 토비님의 답변을 아래에서 확인하실 수 있습니다:

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

윤서진님의 프로필 이미지
윤서진

작성한 질문수

질문하기