[cozy 개발일지] 로컬 DB와 테스트 DB 분리
업데이트:
Intro
- 지금까지 개발하면서
로컬 DB
와테스트 DB
를 나누는 것에 대해서 크게 생각해 본적이 없었는데, 이번 기회에 고민해 볼 기회가 생겼다.
개발 환경에 따른 디비 환경 구축
- 로컬 개발 DB와 테스트 환경의 DB는 어떻게 나눌 것이며, 어떻게 환경을 구축할지에 대한 고민이 있었다.
환경 구축 방법
- 이 부분에 대해서 멘토님께서 총
4가지 방안
을 제시해 주셨는데 다음과 같다.- 로컬, 테스트 환경 모두 docker로 구축하는 방법.
- 로컬은 docker, 테스트 환경은 h2로 구축하는 방법.
- 두 환경 모두 개발환경과 동일한 DB를 사용하는 방법.
- 즉 개발 환경(추후, Naver cloud를 사용할 것)에서 별도의 개발 DB를 따로 구축하고, 해당 DB를 로컬에서 참조하는 방법
- 개발환경도 마찬가지로 docker로 구축할 것 같긴 한데… docker에 대한 추가 학습이 필요.
- 로컬은 개발 DB를 참조, 테스트 환경은 h2를 사용하는 방법
나의 생각
- 나는 개인적으로 테스트는
h2
를 이용하는 것이 좋다고 생각한다. 이유는 다음과 같다.성능
- h2를
in-memory
형태로 사용하면 아무래도 disk를 사용하는 db보다는 빠르게 테스트를 동작시킬 수 있다. - 테스트 코드가 많아질 수록 h2의 가치는 높아질 것이다.
- 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에서 동작시키도록 설정하였다.
댓글남기기