1. Test DB 사용
- 배포용 DB로 AWS의 RDS를 사용합니다.
- 하지만 프리티어로 많은 쿼리를 주고 받을 경우 과금이 부과될것입니다.
- TDD 기반의 개발이고 개발을 시작하기전 모든 테스트 코드를 한번씩 돌려보기 때문에 Test와 개발용 DB를 local에 따로 만들 필요가 있었습니다.
2. H2 vs MySQL
- H2
- RDMS
- In-memory를 제공합니다.
- 디스크에 저장하지 않고 메모리에 올리는 것이 가능합니다.
- 속도가 빠릅니다.
- 서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스입니다. (휘발성)
- 롤백이 필요없습니다.
- 매우 가볍습니다.
- Springboot 에서 Embedded Database을 지원하고 H2는 Java만 호환합니다.
- MySQL
- RDMS
- 보편적으로 많이 사용하는 DB 입니다.
- 배포하려는 AWS의 RDS와 같습니다.
😎 위와 같은 이유로 테스트 시에는 h2를 사용하고 MySQL을 개발 DB를 사용하기로 결정했습니다.
3. H2 with SpringBoot
build.gradle
runtimeOnly 'com.h2database:h2'
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username={username}
spring.datasource.password={password}
4. MySQL with SpringBoot
build.gradle
implementation 'mysql:mysql-connector-java'
properties
spring.datasource.url=jdbc:mysql://localhost:3306/{database}?serverTimezone={region}&characterEncoding=UTF-8
spring.datasource.username={username}
spring.datasource.password={password}
- 많은 블로그와 강의에서 H2와 MySQL을 연동하는 것을 다루니 간단히 넘어가겠습니다.
5. 고민해야할 점
😎 매번 properties에 주석을 처리해 가면서 DB를 바꿔야하는 문제가 있습니다.
😎 test용, dev용, deploy용 DB가 따로 있다면 schema가 변경될 때, 자동화하는 방법을 고안중입니다.
- Federated로 원격으로 DB를 읽고 schema만 복사하는 방법을 적용해 보려고 했습니다.
- 하지만, DB Engine이 Federated에서 다른 엔진으로 변경되지 않는 문제 발생했고
- 데이터도 같이 복사되는 문제가 발생했습니다.