diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiController.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiController.java index df06370..d354d17 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiController.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpApiController.java @@ -32,11 +32,139 @@ public class ObpApiController extends BaseRestController { } /** - * 전체 API 목록 조회 + * OBP API 전체 목록 조회 (v2) * * @param pretty true면 JSON 들여쓰기 적용 * @return JSON Array */ + @RequestMapping(value = "/api/apis.json", produces = JSON_CONTENT_TYPE) + @ResponseBody + public String getApisV2(@RequestParam(value = "pretty", required = false) Boolean pretty) { + log.debug("OBP API 목록 조회 요청 (v2): pretty={}", pretty); + long startTime = System.currentTimeMillis(); + + DataSourceContextHolder.setDataSourceType( + DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW)); + + try { + List apis = obpApiService.findAllApis(); + + String json = toJson(apis, pretty); + + long elapsed = System.currentTimeMillis() - startTime; + log.info("OBP API 목록 조회 완료 (v2): count={}, size={}, elapsed={}ms", + apis.size(), getFormattedJsonSize(json), elapsed); + + return json; + + } catch (Exception e) { + log.error("OBP API 목록 조회 실패 (v2)", e); + throw e; + } + } + + /** + * OBP API 목록 조회 (providerCode 검증) + * + * @param providerCode Provider 코드 (KJB만 허용, 대소문자 무시) + * @param pretty true면 JSON 들여쓰기 적용 + * @return JSON Array + */ + @RequestMapping( + value = "/api/apis.json", + params = "providerCode", + produces = JSON_CONTENT_TYPE + ) + @ResponseBody + public String getApisByProvider( + @RequestParam("providerCode") String providerCode, + @RequestParam(value = "pretty", required = false) Boolean pretty) { + + log.debug("OBP API 목록 조회 요청 (provider): providerCode={}, pretty={}", providerCode, pretty); + long startTime = System.currentTimeMillis(); + + // 1. providerCode 검증 + ProviderCodeValidator.validateProviderCode(providerCode); + + // 2. 데이터소스 설정 + DataSourceContextHolder.setDataSourceType( + DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW)); + + try { + List apis = obpApiService.findAllApis(); + + String json = toJson(apis, pretty); + + long elapsed = System.currentTimeMillis() - startTime; + log.info("OBP API 목록 조회 완료 (provider): providerCode={}, count={}, size={}, elapsed={}ms", + providerCode, apis.size(), getFormattedJsonSize(json), elapsed); + + return json; + + } catch (Exception e) { + log.error("OBP API 목록 조회 실패 (provider): providerCode={}", providerCode, e); + throw e; + } + } + + /** + * OBP API 목록 조회 (기관별, v2) + * + * @param providerCode Provider 코드 (KJB만 허용, 대소문자 무시) + * @param partnerCode 기관코드 (OBP 파트너코드) + * @param pretty true면 JSON 들여쓰기 적용 + * @return JSON Array (기관 미존재 시 빈 배열) + */ + @RequestMapping( + value = "/api/apis.json", + params = {"providerCode", "partnerCode"}, + produces = JSON_CONTENT_TYPE + ) + @ResponseBody + public String getApisByProviderAndPartner( + @RequestParam("providerCode") String providerCode, + @RequestParam("partnerCode") String partnerCode, + @RequestParam(value = "pretty", required = false) Boolean pretty) { + + log.debug("OBP API 목록 조회 요청 (provider+partner): providerCode={}, partnerCode={}, pretty={}", + providerCode, partnerCode, pretty); + long startTime = System.currentTimeMillis(); + + // 1. providerCode 검증 + ProviderCodeValidator.validateProviderCode(providerCode); + + // 2. 데이터소스 설정 + DataSourceContextHolder.setDataSourceType( + DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW)); + + try { + // 3. 기관별 API 조회 + List apis = obpApiService.findApisByOrgCode(partnerCode); + + String json = toJson(apis, pretty); + + long elapsed = System.currentTimeMillis() - startTime; + log.info("OBP API 목록 조회 완료 (provider+partner): providerCode={}, partnerCode={}, count={}, size={}, elapsed={}ms", + providerCode, partnerCode, apis.size(), getFormattedJsonSize(json), elapsed); + + return json; + + } catch (Exception e) { + log.error("OBP API 목록 조회 실패 (provider+partner): providerCode={}, partnerCode={}", + providerCode, partnerCode, e); + throw e; + } + } + + /** + * 전체 API 목록 조회 + * + * @param pretty true면 JSON 들여쓰기 적용 + * @return JSON Array + * @deprecated Use {@link #getApisV2(Boolean)} or {@link #getApisByProvider(String, Boolean)} instead. + * Will be removed in next major version. + */ + @Deprecated @RequestMapping( value = "/kjb/apis.json", produces = JSON_CONTENT_TYPE @@ -78,7 +206,11 @@ public class ObpApiController extends BaseRestController { * @param orgCode 기관코드 (OBP 파트너코드) * @param pretty true면 JSON 들여쓰기 적용 * @return JSON Array (기관 미존재 시 빈 배열) + * @deprecated Use {@link #getApisByProviderAndPartner(String, String, Boolean)} instead. + * Migrate to /api/apis.json?providerCode=KJB&partnerCode={orgCode} + * Will be removed in next major version. */ + @Deprecated @RequestMapping( value = "/kjb/{orgCode}/apis.json", produces = JSON_CONTENT_TYPE diff --git a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricController.java b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricController.java index 81dc55b..4efd759 100644 --- a/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricController.java +++ b/src/main/java/com/eactive/eai/rms/onl/apim/obp/ObpGwMetricController.java @@ -1,5 +1,8 @@ package com.eactive.eai.rms.onl.apim.obp; +import com.eactive.eai.rms.onl.common.exception.BizException; +import com.eactive.eai.rms.common.datasource.DataSourceContextHolder; +import com.eactive.eai.rms.common.datasource.DataSourceTypeManager; import com.eactive.eai.rms.onl.apim.common.BaseRestController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,6 +14,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.List; /** @@ -25,7 +29,10 @@ public class ObpGwMetricController extends BaseRestController { private static final Logger log = LoggerFactory.getLogger(ObpGwMetricController.class); private static final DateTimeFormatter PATH_FORMATTER = - DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss"); + DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss"); + + private static final DateTimeFormatter QUERY_PARAM_FORMATTER = + DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); private final ObpGwMetricManService obpGwMetricManService; @@ -33,13 +40,79 @@ public class ObpGwMetricController extends BaseRestController { this.obpGwMetricManService = obpGwMetricManService; } + /** + * 특정 시간대 이후의 GwMetric 데이터 조회 (v2) + * + * @param timeslice 조회 시작 시간대 (형식: yyyyMMddHHmmss) + * @param providerCode Provider 코드 (KJB만 허용, 대소문자 무시) + * @param pretty true면 JSON 들여쓰기 적용 + * @return JSON Array (해당 시간대 이후의 모든 지표) + */ + @RequestMapping( + value = "/api/metrics/after-timeslice.json", + produces = JSON_CONTENT_TYPE + ) + @ResponseBody + public String getGwMetricsAfterTimesliceV2( + @RequestParam("timeslice") String timeslice, + @RequestParam("providerCode") String providerCode, + @RequestParam(value = "pretty", required = false) Boolean pretty) { + + log.debug("GwMetric after-timeslice 조회 요청 (v2): timeslice={}, providerCode={}, pretty={}", + timeslice, providerCode, pretty); + long startTime = System.currentTimeMillis(); + + try { + // 1. providerCode 검증 + ProviderCodeValidator.validateProviderCode(providerCode); + + // 2. timeslice 파싱 (새 형식: yyyyMMddHHmmss) + LocalDateTime targetTime; + try { + targetTime = LocalDateTime.parse(timeslice, QUERY_PARAM_FORMATTER); + } catch (DateTimeParseException e) { + throw new BizException( + String.format("Invalid timeslice format. Expected 'yyyyMMddHHmmss', got: %s", timeslice), e); + } + + // 3. 시간을 정각으로 truncate + LocalDateTime timesliceHour = targetTime.withMinute(0).withSecond(0).withNano(0); + + // 4. 데이터소스 설정 (MONITORING) + DataSourceContextHolder.setDataSourceType( + DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.MONITORING)); + + // 5. 데이터 조회 + List metrics = obpGwMetricManService.findByTimesliceAfter(timesliceHour); + + // 6. JSON 변환 + String json = toJson(metrics, pretty); + + long elapsed = System.currentTimeMillis() - startTime; + log.info("GwMetric after-timeslice 조회 완료 (v2): timeslice={}, providerCode={}, count={}, size={}, elapsed={}ms", + timeslice, providerCode, metrics.size(), getFormattedJsonSize(json), elapsed); + + return json; + + } catch (BizException e) { + throw e; + } catch (Exception e) { + log.error("GwMetric after-timeslice 조회 실패 (v2): timeslice={}, providerCode={}", + timeslice, providerCode, e); + throw new BizException("Failed to retrieve metrics: " + e.getMessage(), e); + } + } + /** * 특정 시간대의 GwMetric 데이터 조회 * * @param datetime 조회 시간대 (형식: yyyy-MM-dd_HH:mm:ss) * @param pretty true면 JSON 들여쓰기 적용 * @return JSON Array + * @deprecated Use {@link #getGwMetricsAfterTimesliceV2(String, String, Boolean)} instead. + * Will be removed in next major version. */ + @Deprecated @RequestMapping( value = "/kjb/gw-metrics/{datetime}.json", produces = JSON_CONTENT_TYPE @@ -80,7 +153,11 @@ public class ObpGwMetricController extends BaseRestController { * @param datetime 조회 시작 시간대 (형식: yyyy-MM-dd_HH:mm:ss) * @param pretty true면 JSON 들여쓰기 적용 * @return JSON Array (해당 시간대 이후의 모든 지표) + * @deprecated Use {@link #getGwMetricsAfterTimesliceV2(String, String, Boolean)} instead. + * Migrate to /api/metrics/after-timeslice.json?timeslice={yyyyMMddHHmmss}&providerCode=KJB + * Will be removed in next major version. */ + @Deprecated @RequestMapping( value = "/kjb/gw-metrics/after-timeslice/{datetime}.json", produces = JSON_CONTENT_TYPE