에러

Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource>

 

[ 에러 화면 ]

 

에러 상세

Description:

Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource>:

    Property: spring.datasource.type
    Value: org.apache.tomcat.jdbc.pool.DataSource
    Origin: class path resource [application.properties]:1:24
    Reason: No converter found capable of converting from type [java.lang.String] to type [java.lang.Class<javax.sql.DataSource>]

Action:

Update your application's configuration

 

 

개발 환경

OS : Windows 10

IDE : Eclipse

Framework : Spring Boot 2.1.6

Java : JDK 1.8

 

 

상황

Spring Boot 를 사용해서 DB를 설정한 후 실행을 하자마자 바로 Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource> 에러라는 발생했고, 서버를 구동하는 것을 실패했습니다. 현재 에러가 발생하는 상황에서 pom.xmlapplicaiton.properties의 내용은 아래와 같습니다.

 

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

application.properties

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

 

 

원인

데이터베이스 커넥션 풀(Database Connection Pool)의 설정이 잘못되서 발생한 에러입니다. 이 에러의 원인을 파악하기 전에 커넥션 풀에 대한 개념을 알아두는 것이 좋습니다. 커넥션 풀이란, 애플리케이션(Application)과 데이터베이스(Database)를 효과적으로 연동되도록 제공하는 것입니다.

 

애플리케이션이 데이터베이스를 읽고(Read), 쓰는(Write) 작업을 할 때마다, 매번 DB에 "연결-작업-연결해제"를 반복할 것입니다. 만약에, 애플리케이션이 데이터베이스에서 정말로 해야하는 작업(ex, Insert, Upate 등)들만 수행하고, 연결과 연결 해제 등의 불필요한 반복작업들을 줄인다면 둘 사이에서 처리되어야 하는 작업의 속도는 빨라질 것입니다. 이러한 이유로, 대부분은 아래 그림처럼 애플리케이션과 DB 사이에 하나의 풀(Pool)을 두고, 둘을 연결(Connection)짓는 객체들을 여러개 미리 만들어 놓는 구조를 사용하고 있습니다.

 

[ App과 DB간의 커넥션 풀 ]

 

위 그림의 중간에 그려진 커넥션 풀(Connection Pool)을 제공하고 있는 라이브러리로는 (Apache) Commons DBCP, Tomcat-JDBC, BoneCP, HikariCP 등이 있습니다. 그리고, Spring Framework로 개발하 때는, 이 라이브러리들 중에 무엇을 사용할지 설정을 해야합니다. 이번 포스팅에서 발생한 에러는 바로 이 라이브러리의 설정이 제대로 되지않았던 것이기 때문에, 이 설정을 바로 잡으면 됩니다.

 

위 에러가 발생한 원인은, 커넥션 풀을 제공하는 라이브러로 Spring에서 기본제공하는 HikariCP가 아닌 Commons CBCP를 사용하기 위해 application.properties에 spring.datasource.type을 "org.apache.tomcat.jdbc.pool.DataSource"로 설정했지만 실행할 때 해당 패키지를 찾을 수 없기 때문에 발생한 에러이다.

 

 

해결

위 에러를 해결하기 위해 글쓴이가 이번에 찾아낸 방법은 두가지를 설명하겠습니다. 하나는 Apahce의 Commons DBCP를 사용하는 방법과 다른 하나는 HikariCP를 사용하는 방법입니다.  만약에 다른 라이브러리를 사용한다면, 이 포스팅에서 설명하는 해결방법처럼 해당 라이브러리를 사용하는 설정부분과 관련된 부분을 다시한번 확인해보면 해결될 것이라고 생각됩니다.

 

[방법 1] HikariCP를 사용

만약에, "spring-boot-starter-data-jpa" 혹은 "spring-boot-starter-jdbc"를 사용하는 경우, 자동으로 HikariCP가 설정됩니다. 따라서, 이 방법을 사용하는 경우에는 pom.xml에 위 라이브러리를 dependency로 추가하기만 자동으로 HikariCP가 제공하는 커넥션 풀을 사용하게 됩니다. 참고로, 이때는 application.properties에 spring.datasource.type을 추가할 필요가 없습니다. 

 

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

application.properties

#spring.datasource.type 사용하지 않으므로 주석 or 제거

 

 

[방법 2] (Apache) Commons DBCP를 사용

만약에, [방법 1]처럼 Spring에서 기본으로 제공하는 커넥션 풀인 HikariCP를 사용하지 않고, (Apach) Commons DBCP를 사용하고 싶을 때는 아래처럼 추가 설정을 해주면 된다. pom.xml에는 Commons DBCP를 제공하는 라이브러리인 "org.apache.tomcat"을 추가해서 프로젝트에서 사용할 수있도록 하고, application.properties에는 spring.datasource.type을 추가해서, Commons DBCP 내에 포함된 커넥션 풀인 "org.apache.tomcat.jdbc.pool.DataSource"로 설정하면 됩니다.

 

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.tomcat</groupId>
	<artifactId>tomcat-jdbc</artifactId>
	<version>9.0.10</version>
</dependency>

 

application.properties

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

 

 

참고

Spring Boot 2.1.6.RELEASE 데이터 커넥션 부분

https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/htmlsingle/#boot-features-connect-to-production-database