- 개발환경
- IntelliJ 2019.02
- Java 11
- SpringBoot 2.1.7
- mysql-connector-java:8.0.17
- Gradle 5.6
스프링부트 프로젝트를 생성할 때, 내장된 데이터베이스 h2가 아닌 MySQL을 사용하려고 했습니다.
application.properties 또는 application.yml 파일에 커넥션 정보를 작성해주면, 스프링부트가 이 정보를 오버라이드하여 MySQL을 사용할 수 있도록 한다고 하는데요.
아무리 설정을 잡아줘도 아래의 에러 때문에 Run(실행)이 안되서 고생을 했었습니다.
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
이 글에서는 위의 에러를 해결하여 MySQL을 연동하는 방법에 대해 알아보도록 하겠습니다.
1. 스프링부트 프로젝트 생성
Spring Initializr에서 Gradle로 빌드하여 스프링부트 프로젝트를 생성하도록 합니다.
의존성은 어떤걸 추가해도 상관없으며, SQL > MySQL Driver만 선택했을 경우에 build.gradle 파일은 다음과 같습니다.
build.gradle
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2. 빌드 및 실행
프로젝트를 생성하고 빌드를 할 경우, 아래와 같은 에러가 발생할 것입니다.
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
스프링부트에서 밀고있는 h2 데이터베이스를 사용할 경우에는 AutoConfigure에서 설정을 잡아주기 때문에 별도의 설정이 필요없습니다.
하지만 MySQL을 사용한다면 src/main/resources/application.properties 파일에서 커넥션 정보를 작성하여 설정을 잡아줘야 합니다.
src/main/resources/application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/example?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234
- driver-class-name
- com.mysql.jdbc.Driver와 com.mysql.cj.jdbc.Driver 두가지가 있습니다.
- 전자는 Deprecated이므로 com.mysql.cj.jdbc.Driver를 사용하도록 합니다.
- url
- localhost:3306/example
- example은 database를 의미합니다.
- serverTimezone=UTC
- URL 쿼리 스트링에 serverTimezone을 작성해줘야 에러가 발생하지 않으므로, 꼭 작성하도록 합니다.
- username / password
- 계정명과 비밀번호를 작성하면 됩니다.
properties 파일이 아닌, yaml로 설정할 경우 아래와 같이 작성하시면 됩니다. ( yaml이 대세라고해서 써봤어요 ㅎㅎ )
src/main/resources/application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/example?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: 1234
이렇게 설정을 잡고, Run(실행)을 했을 때 잘 돌아가면 연동은 이것으로 끝입니다.
3. DataSource 오류 발생 및 해결
설정을 잡아주고 실행을 했는데도 똑같은 에러가 발생한다면, 다음과 같이 처리해주시면 됩니다.
1) 라이브러리 체크
mysql-connector-java 라이브러리가 설치되어 있는지 확인합니다.
설치되어 있지 않다면, 의존성 추가가 안된것이므로 빌드를 하여 의존성을 추가해줍니다.
2) MySQL 접속 체크
설정 정보에 이상이 있는지, 즉 시스템의 MySQL 접속이 가능한지 IntelliJ에서 확인해볼 수 있습니다.
우측의 Database > + 버튼 > Data Source > MySQL 클릭
그러면 Data Sources and Drivers 팝업창이 뜨는데, 커넥션 정보를 작성하고 Test Connection을 해줍니다.
커넥션이 안되면, 시스템 MySQL에 접근을 못한다는 것이므로 이를 먼저 해결해줘야 합니다.
3) gradle project re-import
위의 체크사황에 이상이 없으면, Message 탭에서 메시지를 확인합니다.
Warning: Unable to make the module: demo.main, related gradle configuration was not found. Please, re-import the Gradle and try again
re-import 메시지를 확인했으면, 우측의 Gradle 탭 > 우클릭 > Reimport Gradle Project 클릭 합니다.
새로고침 > 빌드 > Run을 클릭합니다.
그러면 아래와 같이 Edit Configuration 팝업이 뜨는데요.
Use classpath of module을 선택해줍니다.
그리고 Run을 클릭하면, 초기 메시지는 사라지고 실행이 정상적으로 되는 것을 확인할 수 있습니다.
4) 성공
5) 그래도 안된다면..
File > Invalidate Caches / Restart ... 를 클릭해서 재시도 합니다.
이상으로 스프링부트에서 MySQL을 연동해보았습니다.
application.properties 또는 application.yml 파일에서 설정만 해주면 쉽게 연동이 가능합니다.
그런데.. 에러때문에 기나긴 삽질을 했네요... IntelliJ 문제 같긴했는데 역시나였습니다 ㅎㅎ
다른 분들도 잘 해결 되시길 바랍니다.