diff --git a/src/main/java/com/eactive/apim/gateway/data/statistics/repository/GwAuthClientRepository.java b/src/main/java/com/eactive/apim/gateway/data/statistics/repository/GwAuthClientRepository.java index 46dd8d7..720f1c0 100644 --- a/src/main/java/com/eactive/apim/gateway/data/statistics/repository/GwAuthClientRepository.java +++ b/src/main/java/com/eactive/apim/gateway/data/statistics/repository/GwAuthClientRepository.java @@ -22,4 +22,10 @@ public interface GwAuthClientRepository extends JpaRepository findClientIdsByOrgId(@Param("orgId") String orgId); + + /** + * 다건 org 소속 CLIENTID 목록 (인덱스 페이지 전체 통계 집계용). + */ + @Query("SELECT c.clientId FROM GwAuthClient c WHERE c.orgId IN :orgIds") + List findClientIdsByOrgIdIn(@Param("orgIds") List orgIds); } diff --git a/src/main/java/com/eactive/apim/portal/apps/main/dto/IndexStatisticsDTO.java b/src/main/java/com/eactive/apim/portal/apps/main/dto/IndexStatisticsDTO.java index 03039d6..bc33a6a 100644 --- a/src/main/java/com/eactive/apim/portal/apps/main/dto/IndexStatisticsDTO.java +++ b/src/main/java/com/eactive/apim/portal/apps/main/dto/IndexStatisticsDTO.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; * 인덱스 페이지 하단 통계 DTO * - API 활용 기업: 법인으로 등록된 수의 합계 (정상 상태) * - 서비스 이용 수: 전체 법인이 생성한 앱의 합계 (이용 가능 상태) - * - API 이용 건수: 전체 법인이 생성한 앱의 API 수의 합계 (이용 가능 상태) + * - API 이용 건수 (월누적): 전체 법인 소속 게이트웨이 클라이언트의 이번 달 1일~오늘 누적 API 호출 건수 */ @Data @Builder @@ -37,8 +37,8 @@ public class IndexStatisticsDTO { private int activeAppCount; /** - * API 이용 건수 - * 정상 상태 법인이 생성한 이용 가능 앱에 연결된 API의 총 수 + * API 이용 건수 (월누적) + * 정상 상태 법인 소속 게이트웨이 클라이언트의 이번 달 1일~오늘 누적 API 호출 건수 */ private int totalApiCount; } diff --git a/src/main/java/com/eactive/apim/portal/apps/main/service/IndexStatisticsService.java b/src/main/java/com/eactive/apim/portal/apps/main/service/IndexStatisticsService.java index 609e3d1..07cbcdc 100644 --- a/src/main/java/com/eactive/apim/portal/apps/main/service/IndexStatisticsService.java +++ b/src/main/java/com/eactive/apim/portal/apps/main/service/IndexStatisticsService.java @@ -1,14 +1,20 @@ package com.eactive.apim.portal.apps.main.service; -import com.eactive.apim.portal.app.entity.Credential; +import com.eactive.apim.gateway.data.statistics.repository.ApiStatsDayRepository; +import com.eactive.apim.gateway.data.statistics.repository.ApiStatsHourRepository; +import com.eactive.apim.gateway.data.statistics.repository.GwAuthClientRepository; import com.eactive.apim.portal.app.repository.CredentialRepository; import com.eactive.apim.portal.apps.main.dto.IndexStatisticsDTO; +import com.eactive.apim.portal.apps.statistics.dto.ApiStatisticsSummaryDto; import com.eactive.apim.portal.apps.user.repository.PortalOrgRepository; import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.ApprovalStatus; import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.OrgStatus; import com.eactive.apim.portal.portalproperty.service.PortalPropertyService; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -31,6 +37,9 @@ public class IndexStatisticsService { private final PortalOrgRepository portalOrgRepository; private final CredentialRepository credentialRepository; + private final GwAuthClientRepository gwAuthClientRepository; + private final ApiStatsDayRepository apiStatsDayRepository; + private final ApiStatsHourRepository apiStatsHourRepository; private final PortalPropertyService portalPropertyService; // 캐시된 통계 데이터 @@ -91,11 +100,13 @@ public class IndexStatisticsService { // 3. 서비스 이용 수: 정상 기관의 이용 가능 앱 수 activeAppCount = (int) credentialRepository.countActiveAppsByOrgIds(activeOrgIds); - // 4. API 이용 건수: 정상 기관의 이용 가능 앱에 연결된 API 수 - List activeApps = credentialRepository.findActiveAppsByOrgIds(activeOrgIds); - totalApiCount = activeApps.stream() - .mapToInt(credential -> credential.getApiList() != null ? credential.getApiList().size() : 0) - .sum(); + // 4. API 이용 건수 (월누적): 정상 기관 소속 게이트웨이 클라이언트의 이번 달 1일~오늘 누적 호출 건수 + List clientIds = gwAuthClientRepository.findClientIdsByOrgIdIn(activeOrgIds).stream() + .filter(id -> id != null && !id.trim().isEmpty()) + .collect(Collectors.toList()); + if (!clientIds.isEmpty()) { + totalApiCount = (int) getMonthlyApiCallCount(clientIds); + } } cachedStatistics = IndexStatisticsDTO.builder() @@ -125,6 +136,30 @@ public class IndexStatisticsService { } } + /** + * 게이트웨이 클라이언트들의 이번 달 1일~오늘 누적 API 호출 건수(TOTAL_CNT 합산). + * 어제까지는 API_STATS_DAY(일별 집계), 오늘은 아직 DAY 미집계이므로 API_STATS_HOUR로 합산한다. + * ({@link com.eactive.apim.portal.apps.statistics.service.ApiStatisticsService#combineDayAndToday}와 동일 패턴) + */ + private long getMonthlyApiCallCount(List clientIds) { + LocalDate today = LocalDate.now(); + LocalDate monthStart = today.withDayOfMonth(1); + LocalDate dayEnd = today.minusDays(1); + + long total = 0L; + if (!monthStart.isAfter(dayEnd)) { + total += nz(apiStatsDayRepository.findSummary(clientIds, monthStart, dayEnd).getTotalCount()); + } + ApiStatisticsSummaryDto todaySummary = apiStatsHourRepository.findSummary( + clientIds, today.atStartOfDay(), today.atTime(LocalTime.MAX)); + total += nz(todaySummary.getTotalCount()); + return total; + } + + private static long nz(Long value) { + return value != null ? value : 0L; + } + /** * PortalProperty에서 통계 노출 여부 조회 * 프로퍼티가 없으면 기본값 "Y"를 DB에 저장 후 반환