Spring Boot에서 Druid 데이터소스 설정 시 'spring.datasource' 바인딩 실패 문제 해결

문제 상황 Spring Boot 프로젝트에서 Druid를 사용하여 데이터소스를 구성할 때, application.yml 파일에 정의된 설정이 javax.sql.DataSource에 바인딩되지 않으며, 다음과 같은 오류가 발생한다:

Failed to bind properties under 'spring.datasource' to javax.sql.DataSource
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Priority

이는 spring.datasource.filters 속성 값으로 stat,wall,log4j를 지정했을 때, Drui의 필터 로드 과정에서 org.apache.log4j.Priority 클래스를 찾지 못하기 때문이다.

원인 분석 Druid는 특정 필터(예: log4j)를 활성화하려면 해당 라이브러리가 존재해야 하며, 특히 log4j 1.x 버전의 org.apache.log4j.Priority 클래스가 필요하다. 그러나 현재 프로젝트에 log4j 의존성이 포함되어 있지 않아 클래스 로드 실패가 발생한다.

또한, @ConfigurationProperties(prefix = "spring.datasource") 어노테이션을 사용해 설정을 바인딩하려 할 때, 필터 설정이 잘못되면 바인딩 단계에서 예외가 발생하며, 전체 애플리케이션 초기화가 실패한다.

해결 방법

  1. log4j 1.x 의존성 추가 log4j 1.2.17을 프로젝트에 명시적으로 추가한다.
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

이 의존성을 추가하면, Druid가 log4j 필터를 로드할 수 있게 되며, Priority 클래스도 정상적으로 로드된다.

  1. 필터 설정 재검토 (권장) log4j 필터는 구식이며, 현대적인 애플리케이션에서는 log4j2 또는 다른 로깅 프레임워크를 사용하는 것이 일반적이다. 따라서 다음과 같이 필터 설정을 수정하는 것이 더 적절하다:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    filters: stat,wall
  • log4j 필터 제거: 이는 log4j 1.x에만 유효하며, log4j2와 호환되지 않는다.
  • stat, wall은 Druid의 주요 성능 모니터링 및 보안 필터로 충분히 기능을 제공한다.

이렇게 변경하면 log4j 의존성 없이도 문제 없이 데이터소스가 생성된다.

  1. 외부 라이브러리 대체 (선택 사항) 필요 없다면, druid-spring-boot-starter를 사용하면 log4j 관련 설정을 자동으로 처리하고, 불필요한 의존성을 줄일 수 있다.
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.18</version>
</dependency>

이 스타터는 @ConfigurationProperties 설정을 자동으로 처리하며, log4j 의존성 없이도 동작한다.

태그: Spring Boot Druid DataSource configuration-properties Log4j

6월 23일 23:50에 게시됨