Spring Boot 3 에서 MYSQL 의존성 못찾는 경우

작성: 2023.04.02

수정: 2023.04.02

읽는시간: 00 분

Development/Daily Error

반응형

문제

스프링 부트 3.0.0 버전으로 개인 프로젝트를 진행하고 있는데, 시간도 어느정도 흘렀고 해서 3.0.5 버전으로 버전을 높이던 중 MySQL 드라이버를 찾지 못하는 문제가 발생.

 Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader

비교적 최근의 3.0.5 에서의 문제인가 하여 3.0.4, 3.0.3 조금씩 낮춰보며 확인을 해 보았지만 3.0.0 으로 바꾸기 전까지는 해결된 기미가 보이지 않음

원인

원인을 찾아보자. 일단 지금 상태의 build.gradle.kts 파일이다.

${code:build.gradle.kts}

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "3.0.5"
    id("io.spring.dependency-management") version "1.1.0"
    kotlin("jvm") version "1.7.22"
    kotlin("plugin.spring") version "1.7.22"
    kotlin("plugin.jpa") version "1.7.22"
}

...

repositories {
    mavenCentral()
}

dependencies {
    // Kotlin
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

    // Spring Boot
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-devtools")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    testImplementation("org.springframework.boot:spring-boot-starter-test")

    // Database
    runtimeOnly("com.h2database:h2")

      ###### 여기에 주목 ######
    #
    runtimeOnly("mysql:mysql-connector-java")
    #
    ###### 여기에 주목 ######

    implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0")
    ...
}

스프링 공식 문서 https://docs.spring.io/spring-boot/docs/3.0.5/reference/html/dependency-versions.html#appendix.dependency-versions.coordinates 를 참고해서io.spring.dependency-managementplugin.spring 등 버전을 명시해줄 필요가 있는것들은 변경을 해 주었는데 여전히 문제가 발생했다.

그말은 즉, 최신의 스프링부트 의존성에는 mysql:mysql-connector-java가 없다는 것인데, 스프링부트에서 mysql을 지원하지 않을리가 없다.

그러면 mysql 을 검색해서 의존성을 확인해본다.

image-20230402113446239

com.mysql

사실 신경쓰고 보는게 아니면 그냥 지나칠수도 있는데, mysql-connector-j 라고 써있다.

스프링부트 3버전으로 넘어오면서 큰 변화중 하나는 패키지명 등에서 java를 모두 없애고 jakarta 로 바꿨다는건데 처음엔 그 작업의 일환인 줄 알았다.

그래서 MySQL 릴리즈노트를 조금 찾아보니

image-20230402114037413

https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-31.html

8.0.31 버전부터 본인들의 네이밍 가이드라인에 맞춰 groupid 및 artifactId를 바꿨다고 한다. 물론 무작정 바꾸진 않고 오래된 groupId와 artifactId도 여전히 새로운 Connector/j를 링크하도록 노력을 했지만 언제까지 이어질지는 장담하지 못하니 얼른 바꾸라고 코멘트를 남겨뒀었다.

메이븐 센트럴을 확인 해 보면

image-20230402114400927

https://central.sonatype.com/artifact/mysql/mysql-connector-java/8.0.32

보이는 것 처럼 기존의 이름에도 계속 올라오고 있기는 하다.

image-20230402114635115

https://central.sonatype.com/artifact/com.mysql/mysql-connector-j/8.0.32

새로운 이름으로는 변경 이후 두번째 릴리즈까지 나왔다. 종합해보면 mysql 쪽에서는 어찌됐건 최대한 배려를 해주려고 양쪽에 신경을 써주고는 있는건데, 스프링이 얄짤 없이 새로운 버전의 의존성 관리에서는 과거의 네이밍 컨벤션을 빼버리고 새로운 mysql-connector-j 만을 지원하고 있는 것이다. 개인적으로는 이렇게 칼같이 쳐내는걸 선호하기는 하지만 그래도 영문을 모른채 당황할 수 있는 상황이다.

해결

문제와 원인을 찾아냈으니 해결은 간단하다.

${code:build.gradle.kts}

runtimeOnly("com.mysql:mysql-connector-j")

이렇게 변경하고 나면 이제 의존성문제가 말끔이 해결된다.

References

반응형