From b33ff3b1fb7427b5285ebcbff16139dc7ff1216f Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 20 Jan 2026 00:22:55 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20flyway=20=EC=A0=84=EC=9A=A9=20DataSo?= =?UTF-8?q?urce=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/datasource/DataSourceConfig.java | 57 +++++++++++++++++++ .../datasource/DataSourceProxyConfig.java | 29 ---------- 2 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java delete mode 100644 src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java diff --git a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java new file mode 100644 index 00000000..f1d2b2b2 --- /dev/null +++ b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java @@ -0,0 +1,57 @@ +package com.example.solidconnection.common.config.datasource; + +import com.example.solidconnection.common.listener.QueryMetricsListener; +import com.zaxxer.hikari.HikariDataSource; +import javax.sql.DataSource; +import lombok.RequiredArgsConstructor; +import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.flyway.FlywayDataSource; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +@RequiredArgsConstructor +@Configuration +public class DataSourceConfig { + + private final QueryMetricsListener queryMetricsListener; + + @Bean + @Primary + public DataSource proxyDataSource(DataSourceProperties props) { + DataSource dataSource = props.initializeDataSourceBuilder().build(); + + return ProxyDataSourceBuilder + .create(dataSource) + .listener(queryMetricsListener) + .name("main") + .build(); + } + + // Flyway 전용 DataSource (Proxy 미적용) + @Bean + @FlywayDataSource + public DataSource flywayDataSource( + @Value("${spring.datasource.url}") String url, + @Value("${spring.flyway.user}") String username, + @Value("${spring.flyway.password}") String password, + @Value("${spring.datasource.driverClassName}") String driverClassName + ) { + HikariDataSource dataSource = new HikariDataSource(); + dataSource.setJdbcUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + dataSource.setDriverClassName(driverClassName); + dataSource.setPoolName("FlywayPool"); + + dataSource.setMinimumIdle(0); + dataSource.setMaximumPoolSize(2); + dataSource.setConnectionTimeout(10000); + dataSource.setIdleTimeout(60000); // 1분으로 단축 + dataSource.setMaxLifetime(300000); // 최대 5분 + + return dataSource; + } +} diff --git a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java deleted file mode 100644 index b7bf0b00..00000000 --- a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.solidconnection.common.config.datasource; - -import com.example.solidconnection.common.listener.QueryMetricsListener; -import javax.sql.DataSource; -import lombok.RequiredArgsConstructor; -import net.ttddyy.dsproxy.support.ProxyDataSourceBuilder; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -@RequiredArgsConstructor -@Configuration -public class DataSourceProxyConfig { - - private final QueryMetricsListener queryMetricsListener; - - @Bean - @Primary - public DataSource proxyDataSource(DataSourceProperties props) { - DataSource dataSource = props.initializeDataSourceBuilder().build(); - - return ProxyDataSourceBuilder - .create(dataSource) - .listener(queryMetricsListener) - .name("main") - .build(); - } -} From 2bb7a612b423d63fd707c8687f9e0234a95d98ba Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 20 Jan 2026 01:18:14 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20fix:=20Flyway=20DataSource=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=97=90=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 테스트 환경에서 flyway.user 미설정 시에도 정상 동작하도록 수정 --- .../common/config/datasource/DataSourceConfig.java | 7 +++---- src/main/resources/secret | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java index f1d2b2b2..d3e70ee3 100644 --- a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java +++ b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java @@ -35,15 +35,14 @@ public DataSource proxyDataSource(DataSourceProperties props) { @FlywayDataSource public DataSource flywayDataSource( @Value("${spring.datasource.url}") String url, - @Value("${spring.flyway.user}") String username, - @Value("${spring.flyway.password}") String password, - @Value("${spring.datasource.driverClassName}") String driverClassName + @Value("${spring.flyway.user:${spring.datasource.username}}") String username, + @Value("${spring.flyway.password:${spring.datasource.password}}") String password ) { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); - dataSource.setDriverClassName(driverClassName); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setPoolName("FlywayPool"); dataSource.setMinimumIdle(0); diff --git a/src/main/resources/secret b/src/main/resources/secret index 1f93968a..29524e2d 160000 --- a/src/main/resources/secret +++ b/src/main/resources/secret @@ -1 +1 @@ -Subproject commit 1f93968a8475d4545d90e8f681b96382d25586af +Subproject commit 29524e2d6dad2042400de0370a11893029aacff2 From d3ae09004cff34bd2b5c79345634e8d52d164f71 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 20 Jan 2026 13:36:26 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EB=A6=AC=EB=B7=B0=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/datasource/DataSourceConfig.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java index d3e70ee3..338208df 100644 --- a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java +++ b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceConfig.java @@ -18,6 +18,19 @@ public class DataSourceConfig { private final QueryMetricsListener queryMetricsListener; + // Driver + public static final String FLYWAY_MYSQL_DRIVER = "com.mysql.cj.jdbc.Driver"; + + // Pool Name + public static final String FLYWAY_POOL_NAME = "FlywayPool"; + + // Connection Pool Settings + public static final int FLYWAY_MINIMUM_IDLE = 0; // 유휴 커넥션을 0으로 설정하면 사용하지 않을 때 커넥션을 즉시 반납 + public static final int FLYWAY_MAXIMUM_POOL_SIZE = 2; + public static final long FLYWAY_CONNECTION_TIMEOUT = 10000L; + public static final long FLYWAY_IDLE_TIMEOUT = 60000L; // 1분 + public static final long FLYWAY_MAX_LIFETIME = 300000L; // 5분 + @Bean @Primary public DataSource proxyDataSource(DataSourceProperties props) { @@ -42,14 +55,14 @@ public DataSource flywayDataSource( dataSource.setJdbcUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); - dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); - dataSource.setPoolName("FlywayPool"); - - dataSource.setMinimumIdle(0); - dataSource.setMaximumPoolSize(2); - dataSource.setConnectionTimeout(10000); - dataSource.setIdleTimeout(60000); // 1분으로 단축 - dataSource.setMaxLifetime(300000); // 최대 5분 + dataSource.setDriverClassName(FLYWAY_MYSQL_DRIVER); + dataSource.setPoolName(FLYWAY_POOL_NAME); + + dataSource.setMinimumIdle(FLYWAY_MINIMUM_IDLE); + dataSource.setMaximumPoolSize(FLYWAY_MAXIMUM_POOL_SIZE); + dataSource.setConnectionTimeout(FLYWAY_CONNECTION_TIMEOUT); + dataSource.setIdleTimeout(FLYWAY_IDLE_TIMEOUT); // 1분으로 단축 + dataSource.setMaxLifetime(FLYWAY_MAX_LIFETIME); // 최대 5분 return dataSource; } From d8b54738a89b1890619d38bf131cd023778c31f1 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 20 Jan 2026 13:43:45 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=EC=84=9C=EB=B8=8C=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20=ED=95=B4=EC=8B=9C=EA=B0=92=20revert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/secret | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/secret b/src/main/resources/secret index 29524e2d..1f93968a 160000 --- a/src/main/resources/secret +++ b/src/main/resources/secret @@ -1 +1 @@ -Subproject commit 29524e2d6dad2042400de0370a11893029aacff2 +Subproject commit 1f93968a8475d4545d90e8f681b96382d25586af