Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine suitable jdbc url - spring boot 3 datasource 설정
신규 프로젝트를 진행하는데
Spring Boot 2 -> 3으로 변경하면서 JAVA 17버전으로 올리는 것도 진행했다.
기존 프로젝트의 설정을 그대로 사용하지 않고 새로 set up을 했는데 그 과정에서 별 것도 아닌데 많은 오류를 만나게 되었다.
이전엔 아래와 같이 작업했는데
오류 - 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine suitable jdbc url
spring:
datasource:
hikari:
jdbc-url: jdbc:log4jdbc:mariadb:/localhost:3306
username:
password:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
maximum-pool-size: 4
minimum-idle: 1
connection-timeout: 60000
max-lifetime: 60000
Spring 2.7.2 버전
spring:
datasource:
url:
username:
password:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
hikari:
maximum-pool-size: 4
minimum-idle: 1
connection-timeout: 60000
max-lifetime: 60000
Spring 3.2.5 버전
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
fun dataSourceProperties(): DataSourceProperties {
return DataSourceProperties()
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
fun dataSource(dataSourceProperties: DataSourceProperties): HikariDataSource {
// HikariDataSource를 사용하기 위해 Hikari 설정 객체를 생성자로 넣은 HikariDataSource 객체 반환
val dataSource: HikariDataSource =
dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource::class.java).build()
if (StringUtils.hasText(dataSourceProperties.name)) {
dataSource.poolName = dataSourceProperties.name
}
return dataSource
}
기존엔 @ConfigurationProperties(prefix = "spring.datasource.hikari") 하나의 bean만 생성하여 HikariDataSource type의 클래스를 리턴하도록 하였는데 Spring Boot 버전이 올라가면서 설정하는 방식이 변경된 것 같다.
spring.datasource에 해당하는 빈을 만들고 spring.datasource.hikari 빈을 만들면서 만들어놓은 datasource를 hikariDataSource type으로 초기화하면서 dataSource를 반환하도록 했다.
오류 - Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl, jdbc:log4jdbc:mariadb://istg15-db.fassto.ai:3306/fsswms?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&allowMultiQueries=true
driverClass에 해당하는 JDBC가 없을 때 발생한다.
기존에는 mariadb를 사용할 때 mysql(runtimeOnly 'mysql:mysql-connector-java')을 JDBC로 사용해도 문제가 없었는데 Spring Boot 3으로 올리면서 엄격하게 타입 체크를 하는 것 같다.
mariadb(runtimeOnly("org.mariadb.jdbc:mariadb-java-client:3.3.2"))로 JDBC를 변경하니 오류 없이 DB 세팅은 완료되었다.
Spring Boot 3이 되면서 datasource 관련된 설정 방식이 기존과 다르게 많이 변경된 것 같다.
이번에 또 느낀게 인터넷에 있는 설정들은 내 작업물과 100% fit하지 않기 때문에 본인 설정 방식에 맞는 것을 오류 메시지를 통해서 파악해야한다!