start.spring.io 에서 프로젝트를 구성할 때 JPA를 사용하기 위해 Spring Data JPA 를 dependencies 에 추가할 수 있습니다.
이때 IDE 에서 추가 설정을 하지 않고 프로젝트를 run 하게 되면 요런 에러가 발생하게 됩니다.
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource
[org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]:
Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'dataSource' defined in class path resource
[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]:
Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [com.zaxxer.hikari.HikariDataSource]:
Factory method 'dataSource' threw exception;
nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException:
Failed to determine a suitable driver class
어쩌구 저쩌구 길게 나오는데 저 dataSource
가 에러 발생의 시발점 입니다.
dataSourceScriptDatabaseInitializer
이란 빈을 생성하는데 에러가 생겼다고 하는데
아래 메시지를 보면 좀 더 이유를 명확히 알 수 있습니다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
dataSource
를 설정해야하는데 필요한 정보들이 없다!
이제 이유를 명확히 알게 되었습니다.
아무 설정 없이 run 을 했기 때문에 dataSource
를 초기화 할 수 없었던 거죠.
이제 설정을 하면 문제가 해결됩니다.
application.yml
이나 application.properties
같은 설정 파일에 아래처럼 spec 을 명시해주면 됩니다.
spring:
datasource:
username: xxxx
password: xxxx
url: jdbc:mysql://localhost:3306/[db name]?allowPublicKeyRetrieval=true&useSSL=false
driver-class-name: org.mariadb.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: none
위와 같이 명시해주고 다시 run 을 하면 정상 구동되는 걸 확인해볼 수 있습니다.
에러만 잘 읽으면 되는데 예전에 처음 이 에러를 맞이했을 때 왜 그리 원인을 찾기가 어려웠는지...