[cozy 개발일지] 로컬 DB와 테스트 DB 분리

2 분 소요

업데이트:


Intro

  • 지금까지 개발하면서 로컬 DB테스트 DB를 나누는 것에 대해서 크게 생각해 본적이 없었는데, 이번 기회에 고민해 볼 기회가 생겼다.


개발 환경에 따른 디비 환경 구축

  • 로컬 개발 DB와 테스트 환경의 DB는 어떻게 나눌 것이며, 어떻게 환경을 구축할지에 대한 고민이 있었다.

환경 구축 방법

  • 이 부분에 대해서 멘토님께서 총 4가지 방안을 제시해 주셨는데 다음과 같다.
    1. 로컬, 테스트 환경 모두 docker로 구축하는 방법.
    2. 로컬은 docker, 테스트 환경은 h2로 구축하는 방법.
    3. 두 환경 모두 개발환경과 동일한 DB를 사용하는 방법.
      • 즉 개발 환경(추후, Naver cloud를 사용할 것)에서 별도의 개발 DB를 따로 구축하고, 해당 DB를 로컬에서 참조하는 방법
      • 개발환경도 마찬가지로 docker로 구축할 것 같긴 한데… docker에 대한 추가 학습이 필요.
    4. 로컬은 개발 DB를 참조, 테스트 환경은 h2를 사용하는 방법

나의 생각

  • 나는 개인적으로 테스트는 h2를 이용하는 것이 좋다고 생각한다. 이유는 다음과 같다.
    • 성능
      • h2를 in-memory 형태로 사용하면 아무래도 disk를 사용하는 db보다는 빠르게 테스트를 동작시킬 수 있다.
      • 테스트 코드가 많아질 수록 h2의 가치는 높아질 것이다.
    • 내장형 (Embedded)
      • 현재 프로젝트에서 github action을 사용하고 있고, release flow가 수행될 때마다 프로젝트가 build 되고 새 버전의 jar가 배포된다.
      • 그런데, build 하는 과정에서 테스트도 같이 진행된다.
      • github action에서는 자신만의 환경을 따로 구축해 flow를 수행하므로, github action이 떠있는 서버와 테스트 DB가 구축돼있는 서버간의 통신이 기본적으로 가능한 상태여야 DB에 의존하는 테스트를 통과시킬 수 있다.
        • 이렇게 되면 방화벽 이슈도 있을 수 있고, 관리 포인트도 더 늘어날 것이다.
      • 그런데 만약 임베디드 형태로 디비를 띄우면, 외부에서 별도의 DB 환경 구축을 하지 않고 DB에 의존하는 테스트를 수행시킬 수 있다.
        • 예를들면, 통합 테스트?
  • 그래서 나는 1,3번 방식 말고 2,4번 방식이 지금 상황에서 더 좋은 방식이라고 생각했다.
  • 그리고 현재 상황에서는 로컬과 개발환경에 디비를 각각 둘 필요성을 느끼지 못했다.
  • 그래서 나는 4번 방식을 선택했다.


개발 진행

  • 일단 4번 방식을 선택했지만, 다른 분들의 의견은 다를 수 있을 것 같다.
    • 만약, 다른 좋은 의견이 나온다면 다른 방식으로 유연하게 변경될 수 있을 것 같다.
  • 그리고, 기존에 datasource 코드에서 민감한 정보들이 github repository에 그대로 노출되는 코드들이 있었는데, 이 부분에 대해서는 노출하지 않는 것이 무조건 맞다고 생각한다.
    • 민감한 정보를 노출하지 않는 방법으로는 외부 파일로 뺀다던가, 아니면 config 서버 같은 것을 따로 구축하는 방법 등이 있다.
    • 아니면, kms를 제공해주는 외부 서비스를 이용할 수도 있다.
    • 그런데 현재 나는 github action을 사용하고 있으니까, github의 environment secrets를 통해 직접 민감한 환경세팅 값을 미리 세팅해 두고 github action에서 이를 이용하는 방법으로 수정했다.
      • 이렇게 하면, 만약 추후에 DB 관련 세팅값이 변한다고 하더라도 내 코드는 전혀 건드리지 않아도 된다는 장점이 있다.

    
      ...
      
      --- # local, dev 환경
      spring:
        config:
          activate:
            on-profile: [ local, dev ]
        datasource:
          url: jdbc:log4jdbc:mysql://${DEV_MYSQL_URL}:${DEV_MYSQL_PORT}/${DEV_DATABASE_NAME}?serverTimezone=UTC&characterEncoding=UTF-8
          username: ${DEV_MYSQL_USERNAME}
          password: ${DEV_MYSQL_PASSWORD}
          driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
      
      ...
      
    
  • 추가적으로 기존에는 쿼리에 대한 로그를 아예 남기지 않고 있어서 mybatis에서 로그를 남기는 설정들도 추가했다.
  • 그리고 테스트에서 사용할 별도의 application-test.yml 파일을 새로 만들어 4번 방식에 맞게 test는 h2에서 동작시키도록 설정하였다.

댓글남기기