Merge remote-tracking branch 'origin/jenkins_with_weblogic' of C:/eactive/bundle/bundles/20260106/eapim-admin_incremental_2025-12-15.bundle into jenkins_with_weblogic

This commit is contained in:
daekuk
2026-01-06 10:48:02 +09:00
8 changed files with 192 additions and 20 deletions
@@ -1180,17 +1180,54 @@ public class ApiInterfaceService extends OnlBaseService {
apiInterfaceUI.setInboundRestPath(newInboundRestPath);
if ("Y".equals(apiInterfaceUI.getTransformYn())) {
apiInterfaceUI.setInboundRequestLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getInboundRequestLayout()), newBizCd, newApiInterfaceId));
apiInterfaceUI.setOutboundRequestLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getOutboundRequestLayout()), newBizCd, newApiInterfaceId));
apiInterfaceUI.setOutboundResponseLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getOutboundResponseLayout()), newBizCd, newApiInterfaceId));
apiInterfaceUI.setInboundResponseLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getInboundResponseLayout()), newBizCd, newApiInterfaceId));
apiInterfaceUI.setRequestTransform(changeToTargetTransformUI(transform2Service.getTransformUiToExport(apiInterfaceUI.getRequestTransform()), newBizCd, newApiInterfaceId, apiInterfaceUI.getInboundRequestLayout(), apiInterfaceUI.getOutboundRequestLayout()));
apiInterfaceUI.setResponseTransform(changeToTargetTransformUI(transform2Service.getTransformUiToExport(apiInterfaceUI.getResponseTransform()), newBizCd, newApiInterfaceId, apiInterfaceUI.getOutboundResponseLayout(), apiInterfaceUI.getInboundResponseLayout()));
String newInReq = processLayoutIfExist(apiInterfaceUI.getInboundRequestLayout(), newBizCd, newApiInterfaceId);
String newOutReq = processLayoutIfExist(apiInterfaceUI.getOutboundRequestLayout(), newBizCd, newApiInterfaceId);
String newOutRes = processLayoutIfExist(apiInterfaceUI.getOutboundResponseLayout(), newBizCd, newApiInterfaceId);
String newInRes = processLayoutIfExist(apiInterfaceUI.getInboundResponseLayout(), newBizCd, newApiInterfaceId);
apiInterfaceUI.setInboundRequestLayout(newInReq);
apiInterfaceUI.setOutboundRequestLayout(newOutReq);
apiInterfaceUI.setOutboundResponseLayout(newOutRes);
apiInterfaceUI.setInboundResponseLayout(newInRes);
if (newInReq != null && newOutReq != null) {
apiInterfaceUI.setRequestTransform(
changeToTargetTransformUI(
transform2Service.getTransformUiToExport(apiInterfaceUI.getRequestTransform()),
newBizCd, newApiInterfaceId, newInReq, newOutReq
)
);
}
if (newOutRes != null && newInRes != null) {
apiInterfaceUI.setResponseTransform(
changeToTargetTransformUI(
transform2Service.getTransformUiToExport(apiInterfaceUI.getResponseTransform()),
newBizCd, newApiInterfaceId, newOutRes, newInRes
)
);
}
}
importApiInterfaceUi(apiInterfaceUI, importDupliCheck);
return apiInterfaceUI;
}
/*
* 복제시 레이아웃 정보가 있는 경우에만 변환 로직을 수행
*/
private String processLayoutIfExist(String layoutId, String newBizCd, String newApiInterfaceId) {
if (layoutId == null || layoutId.isEmpty()) {
return null;
}
LayoutUI layoutEntity = layoutManService.getLayoutUiToExport(layoutId);
return changeToTargetLayoutUI(layoutEntity, newBizCd, newApiInterfaceId);
}
}
@@ -0,0 +1,83 @@
# API Gateway 통계 테이블 설계
## 요구사항 정리
### 수집 차원
- **시간 단위**: 분 단위
- **분류 차원**: API명, API Gateway Instance, ClientId, Scope, 업무구분코드 (값이 없을 경우 'NONE' 으로 대체)
### 메트릭
- **처리 건수**:
- 총 건수
- 성공 건수
- 오류 건수 (Timeout / System Error / Business Error)
- **응답시간 통계**:
- 평균 응답시간
- 최소 응답시간
- 최대 응답시간
- **추가 검토사항**:
- P50, P95 백분위 응답시간
### 집계 방식
- **집계 주기**: 매분 배치 집계
- **백분위 계산**: HdrHistogram 라이브러리 사용 (근사값, 메모리 효율적)
---
## 테이블 DDL
```sql
-- API Gateway 분단위 통계 테이블
CREATE TABLE API_STATS_MINUTE (
STAT_TIME TIMESTAMP(0) NOT NULL, -- 통계 시간 (분 단위, 초는 00)
API_NAME VARCHAR2(100) NOT NULL, -- API명
GW_INSTANCE_ID VARCHAR2(50) NOT NULL, -- API Gateway 인스턴스 ID
CLIENT_ID VARCHAR2(100) NOT NULL, -- 클라이언트 ID
SCOPE VARCHAR2(100) DEFAULT 'NONE' NOT NULL, -- 스코프
BIZ_DIV_CODE VARCHAR2(50) DEFAULT 'NONE' NOT NULL, -- 업무구분코드
-- 건수 메트릭
TOTAL_CNT NUMBER(12) DEFAULT 0 NOT NULL,
SUCCESS_CNT NUMBER(12) DEFAULT 0 NOT NULL,
TIMEOUT_CNT NUMBER(12) DEFAULT 0 NOT NULL,
SYSTEM_ERR_CNT NUMBER(12) DEFAULT 0 NOT NULL,
BIZ_ERR_CNT NUMBER(12) DEFAULT 0 NOT NULL,
-- 응답시간 메트릭 (ms, 소수점 3자리)
AVG_RESP_TIME NUMBER(10,3) DEFAULT 0,
MIN_RESP_TIME NUMBER(10,3) DEFAULT 0,
MAX_RESP_TIME NUMBER(10,3) DEFAULT 0,
P50_RESP_TIME NUMBER(10,3) DEFAULT 0,
P95_RESP_TIME NUMBER(10,3) DEFAULT 0,
-- 관리 정보
REG_DTIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
UPD_DTIME TIMESTAMP DEFAULT SYSTIMESTAMP,
CONSTRAINT PK_API_STATS_MINUTE PRIMARY KEY (
STAT_TIME, API_NAME, GW_INSTANCE_ID, CLIENT_ID, SCOPE, BIZ_DIV_CODE
)
);
-- 코멘트
COMMENT ON TABLE API_STATS_MINUTE IS 'API Gateway 분단위 처리 통계';
COMMENT ON COLUMN API_STATS_MINUTE.STAT_TIME IS '통계시간(분단위, 초는 00초로 절사)';
COMMENT ON COLUMN API_STATS_MINUTE.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_MINUTE.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_MINUTE.CLIENT_ID IS '클라이언트 ID';
COMMENT ON COLUMN API_STATS_MINUTE.SCOPE IS '스코프 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_MINUTE.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```
---