Spring boot 3 Migration MySQL ⇒ MariaDB

MySQL에서 MariaDB 로
김주혁's avatar
Jun 26, 2024
Spring boot 3 Migration MySQL ⇒ MariaDB
 
회사에서 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 : 첫 번째로 수정해야 하는 항목은 driver-class-name이다.
      • driver-class-name: com.mysql.cj.jdbc.Driver => driver-class-name: org.mariadb.jdbc.Driver
       
    • url : 두 번째로 수정해야 하는 항목은 url이다.
      • url: jdbc:mysql://${HOST}:${PORT}/dev?autoReconnect=true&passwordCharacterEncoding=UTF-8 => jdbc:mariadb://localhost:${PORT}/dev # localhost인 이유는 ssh로 터널링 했기 때문이다.
       
    • jpa database-platform : 세 번째로 수정해야 하는 항목은 데이터베이스 플랫폼이다.
      • 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
RSSPowered by inblog