package com.kamco.cd.kamcoback.config; import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor public class StartupLogger { private final Environment environment; private final DataSource dataSource; @EventListener(ApplicationReadyEvent.class) public void logStartupInfo() { String[] activeProfiles = environment.getActiveProfiles(); String profileInfo = activeProfiles.length > 0 ? String.join(", ", activeProfiles) : "default"; // Database connection information String dbUrl = environment.getProperty("spring.datasource.url"); String dbUsername = environment.getProperty("spring.datasource.username"); String dbDriver = environment.getProperty("spring.datasource.driver-class-name"); // HikariCP pool settings String poolInfo = ""; if (dataSource instanceof HikariDataSource hikariDs) { poolInfo = String.format( """ │ Pool Size : min=%d, max=%d │ Connection Timeout: %dms │ Idle Timeout : %dms │ Max Lifetime : %dms""", hikariDs.getMinimumIdle(), hikariDs.getMaximumPoolSize(), hikariDs.getConnectionTimeout(), hikariDs.getIdleTimeout(), hikariDs.getMaxLifetime()); } // JPA/Hibernate settings String showSql = environment.getProperty("spring.jpa.show-sql", "false"); String ddlAuto = environment.getProperty("spring.jpa.hibernate.ddl-auto", "none"); String batchSize = environment.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size", "N/A"); String batchFetchSize = environment.getProperty("spring.jpa.properties.hibernate.default_batch_fetch_size", "N/A"); String startupMessage = String.format( """ ╔════════════════════════════════════════════════════════════════════════════════╗ ║ 🚀 APPLICATION STARTUP INFORMATION ║ ╠════════════════════════════════════════════════════════════════════════════════╣ ║ PROFILE CONFIGURATION ║ ╠────────────────────────────────────────────────────────────────────────────────╣ │ Active Profile(s): %s ╠════════════════════════════════════════════════════════════════════════════════╣ ║ DATABASE CONFIGURATION ║ ╠────────────────────────────────────────────────────────────────────────────────╣ │ Database URL : %s │ Username : %s │ Driver : %s ╠════════════════════════════════════════════════════════════════════════════════╣ ║ HIKARICP CONNECTION POOL ║ ╠────────────────────────────────────────────────────────────────────────────────╣ %s ╠════════════════════════════════════════════════════════════════════════════════╣ ║ JPA/HIBERNATE CONFIGURATION ║ ╠────────────────────────────────────────────────────────────────────────────────╣ │ Show SQL : %s │ DDL Auto : %s │ JDBC Batch Size : %s │ Fetch Batch Size : %s ╚════════════════════════════════════════════════════════════════════════════════╝ """, profileInfo, dbUrl != null ? dbUrl : "N/A", dbUsername != null ? dbUsername : "N/A", dbDriver != null ? dbDriver : "PostgreSQL JDBC Driver (auto-detected)", poolInfo, showSql, ddlAuto, batchSize, batchFetchSize); log.info(startupMessage); } }