본문으로 건너뛰기

Testing-The-Database

1 Testing the database

  • 통합 테스트의 마지막 퍼즐 조각은 프로세스 외부 관리 의존성이다
  • 실제 데이터베이스르 테스트하면 버그 방지가 아주 뛰어나지만 설정하기가 쉽지 않다

관리 의존성

  • 관리 의존성은 전체를 제어할 수 있는 프로세스 외부 의존성을 의미한다
  • 관리 의존성은 애플리케이션을 통해서만 접근할 수 있다
  • 따라서 해당 의존성과의 상호 작용은 외부 환경에서 볼 수 없다
  • 예로 애플리케이션 데이터베이스가 있는데 이는 애플리케이션만 사용하는 데이터베이스르 말한다

비관리 의존성

  • 전체를 제어할 수 없는 프로세스 외부 의존성을 의미한다
  • 따라서 비관리 의존성과의 상호 작용을 외부에서 볼 수 있다
  • 예를 들어 SMTP 서버와 메시지 버스 등이 있다
    • 둘 다 다른 애플리케이션에서 볼 수 있는 부작용을 발생시킴

2 데이터베이스 테스트를 위한 전제 조건

  • 통합 테스트에서는 관리 의존성은 목으로 대체하지 않고 그대로 사용해야한다
  • 목을 사용하지 않기 때문에 비관리 의존성보다 테스트하는 것이 더 힘들 수 있다
  • 관리 의존성인 애플리케이션 데이터베이스를 테스트하기 위해서는 아래와 같은 전제 조건이 필요하다

데이터베이스 테스트를 위한 전제 조건

  1. 형상 관리 시스템에 데이터베이스 유지
  2. 개발자마다 별도의 데이터베이스 인스턴스 사용
  3. 데이터베이스 배포에 마이그레이션 기반 방식 적용

2.1 데이터베이스를 형상 관리 시스템에 유지

  • 데이터베이스를 테스트하는 첫 번째 단계는 데이터베이스 스키마를 일반 코드로 취급하는 것이다
  • 일반 코드와 마찬가지로 git과 같은 형상관리 시스템에 저장해야한다

모델 전용 데이터베이스 단점

  • 기준점이 되는 역할을 하는 데이터베이스를 모델 데이터베이스라고 한다
  • 스키마 변경 사항을 모델 인스턴스에 반영하고 운영 데이터베이스와 비교하여 업그레이드 스크립트를 생성한다
  • 생성된 스크립트를 통해 운영 데이터베이스에도 변경 사항을 적용하는 방식으로 운영한다
  • 이 방식의 문제점은 아래와 같다
    • 변경 내역 부제: 데이터베이스를 과거의 특정 시점으로 되돌릴 수 없다
    • 복수의 원천 정보: git(형상 관리 시스템)과 모델 데이터베이스와 같이 두 가지 기준을 두면 부담이 가중된다

형상 관리 시스템을 이용해야 하는 이유

  • 형상 관리 시스템을 사용하면 원천 정보를 하나만 둘 수 있고 변경을 추적할 수 있어 특정 시점으로 돌아갈 수 있다
  • 다만 형상 관리 외부에서 데이터베이스를 수정하면 안 된다

참조 데이터

  • 참조 데이터는 애플리케이션이 제대로 작동하도록 미리 채워야 하는 데이터다
  • 이러한 참조 데이터도 데이터베이스 스키마다
  • 참조 데이터와 일반 데이터의 차이점은 애플리케이션이 데이터를 수정할 수 있으면 일반 데이터고 그렇지 않으면 참조 데이터다
  • 예를 들어 공통 코드 테이블이 있다
  • 이러한 참조 데이터는 애플리케이션 필수 사항이라 다른 스키마와 함께 SQL INSERT 문 형태로 형상 관리 시스템에 저장해야한다

2.2 별도의 데이터베이스 인스턴스

  • 실제 데이터베이스를 테스트하는 것은 매우 어려우며 다른 개발자와 데이터베이스를 공유해야 한다면 훨씬 더 어려워진다
    • 서로 다른 개발자가 실행한 테스트느 서로 간섭되기 때문
    • 하위 호환성이 없는 변경으로 다른 개발자의 작업을 막을 수 있다
  • 테스트 실행 속도를 극대화하려면 개발자마다 별도로 데이터베이스 인스턴스를 사용해야 한다

2.3 데이터베이스 배포

  • 데이터베이스 배포에는 상태 기반과 마이그레이션 기반 두 가지 방식이 있다
  • 마이그레이션 기반 방식은 초기 구현과 유지보수가 어렵지만 장기적으로 상태 기반 방식보다 훨씬 효과적이다

상태 기반 데이터베이스 배포

  • 상태 기반 데이터베이스 배포는 개발 내내 유비 보수하는 모델 데이터베이스가 있다
  • 배포 중에 비교 도구가 스크립트를 생성해 운영 데이터베이스를 모델 데이터베이스와 비교해 최신 상태로 유지한다
  • 비교 도구는 운영 데이터베이스 상태와 관계없이 비교 도구는 불필요한 테이블을 삭제하고 새 테이블을 생성하고 컬럼명을 바꾸는 등 모델 데이터베이스와 동기화 하는데 필요한 모든 작업을 수행한다

마이그레이션 데이터베이스 배포

  • 데이터베이스를 어떤 버전에서 다른 버전으로 전환하는 명시적인 마이그레이션을 의미
  • 상태 기반 테이터베이스의 비교 도구와 같이 자동으로 동기화하기 위한 도구를 쓰지 않고 업그레이드 스크립트를 직접 작성한다
  • 마이그레이션 기반 방식에서 형상 관리에 저장되는 산출물은 데이터베이스 상태가 아닌 마이그레이션이다
  • 마이그레이션은 일반적으로 SQL 스크립트로 표시한다.