• 개발환경
    • 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. 빌드 및 실행

프로젝트를 생성하고 빌드를 할 경우, 아래와 같은 에러가 발생할 것입니다.



스프링부트에서 밀고있는 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 문제 같긴했는데 역시나였습니다 ㅎㅎ

다른 분들도 잘 해결 되시길 바랍니다.


  1. sorry 2019.10.07 20:44

    3번 방법으로 해결했습니다 감사합니다~

+ Recent posts