Post

SpringBoot HikariCP jdbc-url vs url Property

이번에 기존 프로젝트에 db 커넥션을 추가 하게 되었는데… 작업 하신분이 DB 연결이 안된다고 하셔서 분석하다가 특이 한 것을 알아냈다.

1
2
3
4
5
6
spring:
    datasource:
        url: "mysql://127.0.0.1:3306/testdb?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul"
        username: "myusername"
        password: "mypassword"
        driver-class-name: "com.mysql.jdbc.Driver"

위는 전혀 문제 없는 일상적인 단일 DB 설정이다

만약 여러개의 Datasource 를 사용해야 한다면, Spring 의 자동 설정을 사용 할 수 없고, property 를 수동으로 읽어 Bean 을 생성 해 줘야 한다
그 때 가장 많이 쓰는 방법이 @ConfigurationProperties 를 DataSource 에 직접 Mapping 하는 방식인데 DataSourceProperties Bean 생성를 스킵할 수 있기 때문에 편하게 사용 할 수 있어 자주 이용되는 방법인 것 같다, 사실 나는 변수가 아니라 함수에 @ConfigurationProperties 를 써서 Mapping 할 수 있다는 것을 이번에 처음 알았다… 나중에는 써볼지도?

1
2
3
4
5
6
7
spring:
    datasource:
        first:
            url: "mysql://127.0.0.1:3306/testdb?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul"
            username: "myusername"
            password: "mypassword"
            driver-class-name: "com.mysql.jdbc.Driver"
1
2
3
4
5
6
7
8
@Configuration
class DBConfig {
    @Bean(name = ["firstDataSource"])
    @ConfigurationProperties(prefix = "spring.datasource.first")
    fun firstDataSource(): DataSource {
        return DataSourceBuilder.create().type(HikariDataSource::class.java).build()
    }
}

그럼 위와 같은 코드를 생각 하게 될텐데… 이 코드는 동작하지 않는다 DataSourceProperties 에서는 connection 을 url property 로 사용하지만, HikariConfig(HikariDataSource 는 HikariConfig 을 상속받는다) 에서는 url 이 아니라 jdbcUrl 을 사용 하기 때문이다 그래서 yaml 설정을 아래와 같이 바꿔야 한다

1
2
3
4
5
6
7
spring:
    datasource:
        first:
            jdbc-url: "mysql://127.0.0.1:3306/testdb?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Seoul"
            username: "myusername"
            password: "mypassword"
            driver-class-name: "com.mysql.jdbc.Driver"

하지만 난 이렇게 혼돈을 일으키는 코드를 선호하지 않으므로 … 그냥 DataSourceProperties 을 Bean 으로 생성 하는 방법을 앞으로도 선호할 것 같다

This post is licensed under CC BY 4.0 by the author.