From 4640b31f7f2d1952be0ca915fd7e5d4715970fb3 Mon Sep 17 00:00:00 2001 From: pksup Date: Tue, 13 Jan 2026 16:41:43 +0900 Subject: [PATCH] =?UTF-8?q?property=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collector/ApiStatsCollector.java | 8 +++- .../statistics/config/ApiStatsConfig.java | 46 ++++++++----------- .../scheduler/ApiStatsScheduler.java | 8 ++-- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/statistics/collector/ApiStatsCollector.java b/src/main/java/com/eactive/eai/custom/statistics/collector/ApiStatsCollector.java index 7776abe..658a8f5 100644 --- a/src/main/java/com/eactive/eai/custom/statistics/collector/ApiStatsCollector.java +++ b/src/main/java/com/eactive/eai/custom/statistics/collector/ApiStatsCollector.java @@ -16,6 +16,7 @@ import com.eactive.eai.custom.statistics.dto.TransactionEvent; import com.eactive.eai.data.entity.custom.statistics.ApiStatsHour; import com.eactive.eai.data.entity.custom.statistics.ApiStatsMinute; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; /** @@ -24,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; * - Thread-safe한 ConcurrentHashMap 사용 */ @Service +@RequiredArgsConstructor public class ApiStatsCollector { private static Logger log = Logger.getLogger(Logger.LOGGER_DEFAULT); @@ -46,6 +48,8 @@ public class ApiStatsCollector { */ private final ConcurrentHashMap hourAggregators = new ConcurrentHashMap<>(); + private final ApiStatsConfig apiStatsConfig; + /** * 거래 이벤트 기록 * @@ -63,8 +67,8 @@ public class ApiStatsCollector { */ public void recordEvent(TransactionEvent event, LocalDateTime eventTime) { // 통계 수집 비활성화 체크 (분단위 또는 시간별 중 하나라도 활성화되어야 함) - boolean minuteEnabled = ApiStatsConfig.isMinuteEnabled(); - boolean hourEnabled = ApiStatsConfig.isHourEnabled(); + boolean minuteEnabled = apiStatsConfig.isMinuteEnabled(); + boolean hourEnabled = apiStatsConfig.isHourEnabled(); if (!minuteEnabled && !hourEnabled) { if (log.isDebugEnabled()) { diff --git a/src/main/java/com/eactive/eai/custom/statistics/config/ApiStatsConfig.java b/src/main/java/com/eactive/eai/custom/statistics/config/ApiStatsConfig.java index 1929b13..2da8b65 100644 --- a/src/main/java/com/eactive/eai/custom/statistics/config/ApiStatsConfig.java +++ b/src/main/java/com/eactive/eai/custom/statistics/config/ApiStatsConfig.java @@ -1,17 +1,17 @@ package com.eactive.eai.custom.statistics.config; -import java.util.Properties; +import org.springframework.stereotype.Component; import com.eactive.eai.common.property.PropManager; import com.eactive.eai.common.util.Logger; -import lombok.experimental.UtilityClass; +import lombok.RequiredArgsConstructor; /** - * API 통계 설정 관리 - * - PropManager를 통해 운영 중 동적 변경 가능한 설정값 관리 + * API 통계 설정 관리 - PropManager를 통해 운영 중 동적 변경 가능한 설정값 관리 */ -@UtilityClass +@Component +@RequiredArgsConstructor public class ApiStatsConfig { private static final Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT); @@ -24,15 +24,14 @@ public class ApiStatsConfig { private static final boolean DEFAULT_MINUTE_ENABLED = true; private static final boolean DEFAULT_HOUR_ENABLED = true; + private final PropManager propManager; + /** - * 통계 수집 활성화 여부 (전체 ON/OFF) - * - true: 통계 수집 활성화 (기본값) - * - false: 통계 수집 비활성화 + * 통계 수집 활성화 여부 (전체 ON/OFF) - true: 통계 수집 활성화 (기본값) - false: 통계 수집 비활성화 */ - public static boolean isEnabled() { + public boolean isEnabled() { try { - Properties prop = PropManager.getInstance().getProperties(GROUP_NAME); - String value = prop.getProperty("enabled", String.valueOf(DEFAULT_ENABLED)); + String value = propManager.getProperty(GROUP_NAME, "enabled", String.valueOf(DEFAULT_ENABLED)); return Boolean.parseBoolean(value); } catch (Exception e) { logger.debug("Failed to get enabled from PropManager, using default: " + DEFAULT_ENABLED); @@ -41,18 +40,16 @@ public class ApiStatsConfig { } /** - * 분단위 통계 수집 활성화 여부 - * - true: 분단위 통계 수집 활성화 (기본값) - * - false: 분단위 통계 수집 비활성화 - * - 전체 enabled가 false이면 이 설정과 무관하게 비활성화됨 + * 분단위 통계 수집 활성화 여부 - true: 분단위 통계 수집 활성화 (기본값) - false: 분단위 통계 수집 비활성화 - 전체 + * enabled가 false이면 이 설정과 무관하게 비활성화됨 */ - public static boolean isMinuteEnabled() { + public boolean isMinuteEnabled() { if (!isEnabled()) { return false; } try { - Properties prop = PropManager.getInstance().getProperties(GROUP_NAME); - String value = prop.getProperty("minute.enabled", String.valueOf(DEFAULT_MINUTE_ENABLED)); + String value = propManager.getProperty(GROUP_NAME, "minute.enabled", + String.valueOf(DEFAULT_MINUTE_ENABLED)); return Boolean.parseBoolean(value); } catch (Exception e) { logger.debug("Failed to get minute.enabled from PropManager, using default: " + DEFAULT_MINUTE_ENABLED); @@ -61,18 +58,15 @@ public class ApiStatsConfig { } /** - * 시간별 통계 수집 활성화 여부 - * - true: 시간별 통계 수집 활성화 (기본값) - * - false: 시간별 통계 수집 비활성화 - * - 전체 enabled가 false이면 이 설정과 무관하게 비활성화됨 + * 시간별 통계 수집 활성화 여부 - true: 시간별 통계 수집 활성화 (기본값) - false: 시간별 통계 수집 비활성화 - 전체 + * enabled가 false이면 이 설정과 무관하게 비활성화됨 */ - public static boolean isHourEnabled() { + public boolean isHourEnabled() { if (!isEnabled()) { return false; } try { - Properties prop = PropManager.getInstance().getProperties(GROUP_NAME); - String value = prop.getProperty("hour.enabled", String.valueOf(DEFAULT_HOUR_ENABLED)); + String value = propManager.getProperty(GROUP_NAME, "hour.enabled", String.valueOf(DEFAULT_HOUR_ENABLED)); return Boolean.parseBoolean(value); } catch (Exception e) { logger.debug("Failed to get hour.enabled from PropManager, using default: " + DEFAULT_HOUR_ENABLED); @@ -83,7 +77,7 @@ public class ApiStatsConfig { /** * 설정값 로깅 (초기화 시) */ - public static void logCurrentConfig() { + public void logCurrentConfig() { logger.info("ApiStatsConfig] enabled = " + isEnabled()); logger.info("ApiStatsConfig] minute.enabled = " + isMinuteEnabled()); logger.info("ApiStatsConfig] hour.enabled = " + isHourEnabled()); diff --git a/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java b/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java index 14dd0f3..61e6c22 100644 --- a/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java +++ b/src/main/java/com/eactive/eai/custom/statistics/scheduler/ApiStatsScheduler.java @@ -17,7 +17,6 @@ import com.eactive.eai.data.entity.custom.statistics.ApiStatsHour; import com.eactive.eai.data.entity.custom.statistics.ApiStatsMinute; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; /** * API 통계 스케줄러 @@ -33,6 +32,7 @@ public class ApiStatsScheduler { private final ApiStatsCollector collector; private final ApiStatsMinuteLogger minuteLogger; private final ApiStatsHourLogger hourLogger; + private final ApiStatsConfig apiStatsConfig; // 이전 설정값 추적 (설정 변경 시 flush용) private volatile boolean previousMinuteEnabled = true; @@ -44,7 +44,7 @@ public class ApiStatsScheduler { @PostConstruct public void init() { log.info("ApiStatsScheduler initialized"); - ApiStatsConfig.logCurrentConfig(); + apiStatsConfig.logCurrentConfig(); } /** @@ -54,7 +54,7 @@ public class ApiStatsScheduler { */ @Scheduled(cron = "10 * * * * ?") public void saveMinuteStats() { - boolean currentEnabled = ApiStatsConfig.isMinuteEnabled(); + boolean currentEnabled = apiStatsConfig.isMinuteEnabled(); // 설정이 enabled → disabled로 변경된 경우: 남은 데이터 모두 flush if (previousMinuteEnabled && !currentEnabled) { @@ -122,7 +122,7 @@ public class ApiStatsScheduler { */ @Scheduled(cron = "0 10 * * * ?") public void saveHourStats() { - boolean currentEnabled = ApiStatsConfig.isHourEnabled(); + boolean currentEnabled = apiStatsConfig.isHourEnabled(); // 설정이 enabled → disabled로 변경된 경우: 남은 데이터 모두 flush if (previousHourEnabled && !currentEnabled) {