Spring boot 3 Migration MySQL ⇒ MariaDB
MySQL에서 MariaDB 로
Jun 26, 2024
회사에서 rds mysql을 사용하다, aws vpc private subnet 안에서 운용되는 rds에 새롭게 mariadb로 데이터베이스를 이전하기로 했다.
사용 중인 Spring boot 버전은 다음과 같다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.6'
id 'io.spring.dependency-management' version '1.1.0'
id 'org.asciidoctor.convert' version '1.5.8'
}
java {
sourceCompatibility = '17'
}
dependencies {
implementation 'com.zaxxer:HikariCP:5.0.1'
implementation 'org.hibernate.orm:hibernate-core:6.0.2.Final'
implementation group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'
implementation 'org.apache.commons:commons-pool2:2.11.1'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
해당 설정 환경 구성을 제외한, 나머지는
기존 mysql을 고려한 설정값을 사용하다, mariadb를 사용하려고 하니 문제가 계속해서 발생했다. 설정으로 해결하는 방법은 다음과 같다.
- build.gradle
runtimeOnly 'com.mysql:mysql-connector-j'
해당 runtimeOnly로 사용하는 mysql connector를
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.6'
로 변경해주고 실행시켜야, 아래 application.yaml의 driver-class-name에 org.mariadb.jdbc.Driver를 사용할 수 있게 된다.
- application.yaml 설정 변경
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${HOST}:${PORT}/dev?autoReconnect=true&passwordCharacterEncoding=UTF-8
username: ${USERNAME}
password: ${PASSWORD}
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
driver-class-name: com.mysql.cj.jdbc.Driver
=>
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mysql://${HOST}:${PORT}/dev?autoReconnect=true&passwordCharacterEncoding=UTF-8
=>
jdbc:mariadb://localhost:${PORT}/dev
# localhost인 이유는 ssh로 터널링 했기 때문이다.
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
properties:
hibernate:
format_sql: true
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
physical_naming_strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
hbm2ddl.auto: none
jdbc:
batch_size: 10
hibernate:
ddl-auto: none
open-in-view: false
show-sql: false
=>
jpa:
properties:
hibernate:
format_sql: true
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
physical_naming_strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
hbm2ddl.auto: none
jdbc:
batch_size: 10
dialect: org.hibernate.dialect.MariaDBDialect
hibernate:
ddl-auto: none
open-in-view: false
show-sql: false
이 부분에서 많이 고생했는데,
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
database-platform으로 사용하던 Dialect가 mariadb를 사용하려고 하니
dialect: org.hibernate.dialect.MariaDBDialect
이런 형태로 들어가야 했기 때문에,
jpa:
database-platform: Maria10Dialect
이렇게 사용하려다 계속해서 에러가 발생했다.
- querydsl의 generated 폴더
혹시 몰라서 제거해 줬다.
위와 같은 설정의 mysql 프로젝트를 저런 형태로 변경하니 mariadb로 잘 실행됐다.
같은 문제를 겪고 있다면, 한 번 도전해 보는 것도 좋다고 생각한다.
참고로 ssh 터널링은 아래 방식으로 사용하고 있다.
ssh -i {bastion pem} -L {forwading port}:{host}:{rds port} {user}@{bastion ip}
Share article