TDD를 위한 DB Schema싱크

chrisjune
chrisjune
Feb 7 · 3 min read

테스트코드를 실행하기 위하여 DB Schema를 복제하고 복원하는 작업이 필요하여 작성한 스크립트를 공유하고 자세한 설명을 합니다.

TL;DR:

완성된 코드는 Github링크에서 받을 수 있습니다.

배경

DjangoModel 을 기준으로 기본 데이터베이스인 SQLite에 스키마를 만들어줍니다. 하지만, 때로는 이 기능을 사용하지 못하고 개발자가 직접 DDL을 수행해야하는 상황이 있습니다.

때는 2018년 말, 테스트코드를 위한 DB가 필요하였습니다. 처음에는 개발 db에서 수동으로 스키마를 다운받고 로컬에 직접 설치한 db에 실행하였습니다. 하지만, 스키마 conflict로 테스트코드가 자주 깨졌습니다. 따라서 잦은 동기화가 필요했습니다.

환경 및 요구사항

  1. 동일한 Host에 독립적인 두개의 서비스의 DB가 있고, 로컬에서 두곳의 스키마를 싱크하는 것을 가정합니다.
  2. 스키마를 동기화 후, 테스트DB에 필요한 필수정보를 Insert해야한다고 가정합니다.
  3. 스키마와 필수데이터를 동기화하면 이 과정중 생성된 임시파일을 삭제합니다.
  4. 로컬 DB는 docker container를 이용하여 로컬 환경 영향을 주지 않도록 합니다.
2개의 서비스DB와 1개의 로컬 테스트용 DB

쉘 스크립트 설명

환경변수 파일에서 접속정보를 읽어들입니다.

원본DB로 부터 스키마 파일을 생성합니다. Database 서버에는 2개의 데이터베이스가 있기 때문에 호출이 용이하도록 함수화하고 database 이름을 변수로 받도록 하였습니다

스키마 파일을 기준으로 Target db에 복원합니다. 그 후 필수 기본정보들을 생성해줍니다. 이 정보는 서비스별로 다를 수 있겠죠.

마지막으로 과정중 생성된 임시파일을 삭제해줍니다.

위의 과정을 실행해주는 Main 루프입니다. 실행중인 local db container를 down 시키고 새롭게 생성합니다. 그 후 스키마 파일을 생성, 복원 그리고 임시파일을 삭제하며 마무리합니다.

후기

특별한 설정과 설치없이 테스트환경을 만들기 위하여 docker와 shell 스크립트를 떠올리고 개발하였습니다. 이후 스키마 변경시 자동으로 docker 이미지를 만들려고 하였으나 필요성이 부족하여 추가 개발은 하지 않았습니다.

스크립트를 작성한지 2년이나 되었지만 프레임워크에서 제공하는 Migrate를 사용하지 못하는 분들께 조금이나마 도움이 되고자 공유를 합니다.
감사합니다.👏🏻👏🏻

29CM 기술블로그

Guide to Better Tech — 29CM 기술블로그입니다

29CM 기술블로그

Guide to Better Tech — 29CM 기술블로그입니다

chrisjune

Written by

chrisjune

Blog https://chrisjune.dev Work for www.29cm.co.kr

29CM 기술블로그

Guide to Better Tech — 29CM 기술블로그입니다