Testing-The-Database
1 Testing the database
- 통합 테스트의 마지막 퍼즐 조각은 프로세스 외부 관리 의존성이다
- 실제 데이터베이스르 테스트하면 버그 방지가 아주 뛰어나지만 설정하기가 쉽지 않다
관리 의존성
- 관리 의존성은 전체를 제어할 수 있는 프로세스 외부 의존성을 의미한다
- 관리 의존성은 애플리케이션을 통해서만 접근할 수 있다
- 따라서 해당 의존성과의 상호 작용은 외부 환경에서 볼 수 없다
- 예로 애플리케이션 데이터베이스가 있는데 이는 애플리케이션만 사용하는 데이터베이스르 말한다
비관리 의존성
- 전체를 제어할 수 없는 프로세스 외부 의존성을 의미한다
- 따라서 비관리 의존성과의 상호 작용을 외부에서 볼 수 있다
- 예를 들어 SMTP 서버와 메시지 버스 등이 있다
- 둘 다 다른 애플리케이션에서 볼 수 있는 부작용을 발생시킴
2 데이터베이스 테스트를 위한 전제 조건
- 통합 테스트에서는 관리 의존성은 목으로 대체하지 않고 그대로 사용해야한다
- 목을 사용하지 않기 때문에 비관리 의존성보다 테스트하는 것이 더 힘들 수 있다
- 관리 의존성인 애플리케이션 데이터베이스를 테스트하기 위해서는 아래와 같은 전제 조건이 필요하다
데이터베이스 테스트를 위한 전제 조건
- 형상 관리 시스템에 데이터베이스 유지
- 개발자마다 별도의 데이터베이스 인스턴스 사용
- 데이터베이스 배포에 마이그레이션 기반 방식 적용
2.1 데이터베이스를 형상 관리 시스템에 유지
- 데이터베이스를 테스트하는 첫 번째 단계는 데이터베이스 스키마를 일반 코드로 취급하는 것이다
- 일반 코드와 마찬가지로 git과 같은 형상관리 시스템에 저장해야한다
모델 전용 데이터베이스 단점
- 기준점이 되는 역할을 하는 데이터베이스를 모델 데이터베이스라고 한다
- 스키마 변경 사항을 모델 인스턴스에 반영하고 운영 데이터베이스와 비교하여 업그레이드 스크립트를 생성한다
- 생성된 스크립트를 통해 운영 데이터베이스에도 변경 사항을 적용하는 방식으로 운영한다
- 이 방식의 문제점은 아래와 같다
- 변경 내역 부제: 데이터베이스를 과거의 특정 시점으로 되돌릴 수 없다
- 복수의 원천 정보: git(형상 관리 시스템)과 모델 데이터베이스와 같이 두 가지 기준을 두면 부담이 가중된다
형상 관리 시스템을 이용해야 하는 이유
- 형상 관리 시스템을 사용하면 원천 정보를 하나만 둘 수 있고 변경을 추적할 수 있어 특정 시점으로 돌아갈 수 있다
- 다만 형상 관리 외부에서 데이터베이스를 수정하면 안 된다
참조 데이터
- 참조 데이터는 애플리케이션이 제대로 작동하도록 미리 채워야 하는 데이터다
- 이러한 참조 데이터도 데이터베이스 스키마다
- 참조 데이터와 일반 데이터의 차이점은 애플리케이션이 데이터를 수 정할 수 있으면 일반 데이터고 그렇지 않으면 참조 데이터다
- 예를 들어 공통 코드 테이블이 있다
- 이러한 참조 데이터는 애플리케이션 필수 사항이라 다른 스키마와 함께 SQL INSERT 문 형태로 형상 관리 시스템에 저장해야한다
2.2 별도의 데이터베이스 인스턴스
- 실제 데이터베이스를 테스트하는 것은 매우 어려우며 다른 개발자와 데이터베이스를 공유해야 한다면 훨씬 더 어려워진다
- 서로 다른 개발자가 실행한 테스트느 서로 간섭되기 때문
- 하위 호환성이 없는 변경으로 다른 개발자의 작업을 막을 수 있다
- 테스트 실행 속도를 극대화하려면 개발자마다 별도로 데이터베이스 인스턴스를 사용해야 한다
2.3 데이터베이스 배포
- 데이터베이스 배포에는 상태 기반과 마이그레이션 기반 두 가지 방식이 있다
- 마이그레이션 기반 방식은 초기 구현과 유지보수가 어렵지만 장기적으로 상태 기반 방식보다 훨씬 효과적이다
상태 기반 데이터베이스 배포
- 상태 기반 데이터베이스 배포는 개발 내내 유비 보수하는 모델 데이터베이스가 있다
- 배포 중에 비교 도구가 스크립트를 생성해 운영 데이터베이스를 모델 데이터베이스와 비교해 최신 상태로 유지한다
- 비교 도구는 운영 데이터베이스 상태와 관계없이 비교 도구는 불필요한 테이블을 삭제하고 새 테이블을 생성하고 컬럼명을 바꾸는 등 모델 데이터베이스와 동기화 하는데 필요한 모든 작업을 수행한다
마이그레이션 데이터베이스 배포
- 데이터베이스를 어떤 버전에서 다른 버전으로 전환하는 명시적인 마이그레이션을 의미
- 상태 기반 테이터베이스의 비교 도구와 같이 자동으로 동기화하기 위한 도구를 쓰지 않고 업그레이드 스크립트를 직접 작성한다
- 마이그레이션 기반 방식에서 형상 관리에 저장되는 산출물은 데이터베이스 상태가 아닌 마이그레이션이다
- 마이그레이션은 일반적으로 SQL 스크립트로 표시한다.