문제 상황
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") 어노테이션을 사용해 설정을 바인딩하려 할 때, 필터 설정이 잘못되면 바인딩 단계에서 예외가 발생하며, 전체 애플리케이션 초기화가 실패한다.
해결 방법
- log4j 1.x 의존성 추가
log4j1.2.17을 프로젝트에 명시적으로 추가한다.
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
이 의존성을 추가하면, Druid가 log4j 필터를 로드할 수 있게 되며, Priority 클래스도 정상적으로 로드된다.
- 필터 설정 재검토 (권장)
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필터 제거: 이는log4j1.x에만 유효하며,log4j2와 호환되지 않는다.stat,wall은 Druid의 주요 성능 모니터링 및 보안 필터로 충분히 기능을 제공한다.
이렇게 변경하면 log4j 의존성 없이도 문제 없이 데이터소스가 생성된다.
- 외부 라이브러리 대체 (선택 사항)
필요 없다면,
druid-spring-boot-starter를 사용하면log4j관련 설정을 자동으로 처리하고, 불필요한 의존성을 줄일 수 있다.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.18</version>
</dependency>
이 스타터는 @ConfigurationProperties 설정을 자동으로 처리하며, log4j 의존성 없이도 동작한다.