From 99a159736e413610da4bcf6d25a9347e3e2b0656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EA=B1=B4=ED=9D=AC?= Date: Tue, 9 Dec 2025 14:14:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20MySQL,=20PostgreSQL=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=97=90=20LazyConnectionDataSourceProxy=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../log4u/common/config/MySqlConfig.java | 36 +++++++++++++------ .../log4u/common/config/PostgreSqlConfig.java | 28 +++++++++++---- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/example/log4u/common/config/MySqlConfig.java b/src/main/java/com/example/log4u/common/config/MySqlConfig.java index 744e6ea..c18f47b 100644 --- a/src/main/java/com/example/log4u/common/config/MySqlConfig.java +++ b/src/main/java/com/example/log4u/common/config/MySqlConfig.java @@ -17,6 +17,9 @@ import org.springframework.transaction.PlatformTransactionManager; import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; @Configuration @EnableJpaRepositories( @@ -41,27 +44,35 @@ public class MySqlConfig { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource") - public DataSource mysqlDataSource() { + public HikariDataSource mysqlHikariDataSource() { HikariDataSource dataSource = DataSourceBuilder.create() .type(HikariDataSource.class) .build(); - // Hikari 커넥션 풀 설정 - dataSource.setMaximumPoolSize(10); // 최대 커넥션 수 - dataSource.setMinimumIdle(10); // 최소 유휴 커넥션 - dataSource.setIdleTimeout(30000); // 유휴 커넥션 유지 시간 (30초) - dataSource.setConnectionTimeout(3000); // 커넥션 대기 시간 (3초) - dataSource.setMaxLifetime(1800000); // 커넥션 최대 수명 (30분) + dataSource.setMaximumPoolSize(10); + dataSource.setMinimumIdle(10); + dataSource.setIdleTimeout(30000); + dataSource.setConnectionTimeout(3000); + dataSource.setMaxLifetime(1800000); return dataSource; } + @Bean(name = "mysqlDataSource") + @Primary + public DataSource mysqlDataSource( + @Qualifier("mysqlHikariDataSource") HikariDataSource hikariDataSource + ) { + return new LazyConnectionDataSourceProxy(hikariDataSource); + } @Bean(name = "mysqlEntityManagerFactory") @Primary - public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() { + public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory( + @Qualifier("mysqlDataSource") DataSource dataSource + ) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(mysqlDataSource()); + em.setDataSource(dataSource); em.setPackagesToScan( "com.example.log4u.common", "com.example.log4u.domain.comment", @@ -75,6 +86,7 @@ public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() { "com.example.log4u.domain.subscription", "com.example.log4u.domain.hashtag" ); + HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setShowSql(true); vendorAdapter.setGenerateDdl(true); @@ -91,9 +103,11 @@ public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() { @Bean(name = "mysqlTransactionManager") @Primary - public PlatformTransactionManager mysqlTransactionManager() { + public PlatformTransactionManager mysqlTransactionManager( + @Qualifier("mysqlEntityManagerFactory") LocalContainerEntityManagerFactoryBean mysqlEmf + ) { JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(mysqlEntityManagerFactory().getObject()); + transactionManager.setEntityManagerFactory(mysqlEmf.getObject()); return transactionManager; } } diff --git a/src/main/java/com/example/log4u/common/config/PostgreSqlConfig.java b/src/main/java/com/example/log4u/common/config/PostgreSqlConfig.java index 17e9e44..e7956d6 100644 --- a/src/main/java/com/example/log4u/common/config/PostgreSqlConfig.java +++ b/src/main/java/com/example/log4u/common/config/PostgreSqlConfig.java @@ -14,6 +14,9 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; @Configuration @EnableJpaRepositories( @@ -27,14 +30,25 @@ public class PostgreSqlConfig { @Bean @ConfigurationProperties(prefix = "spring.second-datasource") - public DataSource postgresqlDataSource() { - return DataSourceBuilder.create().build(); + public HikariDataSource postgresqlHikariDataSource() { + return DataSourceBuilder.create() + .type(HikariDataSource.class) + .build(); + } + + @Bean(name = "postgresqlDataSource") + public DataSource postgresqlDataSource( + @Qualifier("postgresqlHikariDataSource") HikariDataSource hikariDataSource + ) { + return new LazyConnectionDataSourceProxy(hikariDataSource); } @Bean(name = "postgresqlEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory() { + public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory( + @Qualifier("postgresqlDataSource") DataSource dataSource + ) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); - em.setDataSource(postgresqlDataSource()); + em.setDataSource(dataSource); em.setPackagesToScan("com.example.log4u.domain.map.entity"); HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); @@ -52,9 +66,11 @@ public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory() { } @Bean(name = "postgresqlTransactionManager") - public PlatformTransactionManager postgresqlTransactionManager() { + public PlatformTransactionManager postgresqlTransactionManager( + @Qualifier("postgresqlEntityManagerFactory") LocalContainerEntityManagerFactoryBean postgresqlEmf + ) { JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(postgresqlEntityManagerFactory().getObject()); + transactionManager.setEntityManagerFactory(postgresqlEmf.getObject()); return transactionManager; } }