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:
@@ -193,6 +193,10 @@ var url_view = '<c:url value="/onl/admin/common/propertyMan.view" />';
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$("#btn_delete").click(function() {
|
$("#btn_delete").click(function() {
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var postData = $('#ajaxForm').serializeArray();
|
var postData = $('#ajaxForm').serializeArray();
|
||||||
postData.push({
|
postData.push({
|
||||||
name : "cmd",
|
name : "cmd",
|
||||||
|
|||||||
@@ -313,6 +313,10 @@
|
|||||||
$('#btn_import').click(onclickExcelImport);
|
$('#btn_import').click(onclickExcelImport);
|
||||||
|
|
||||||
$("#btn_delete").click(function () {
|
$("#btn_delete").click(function () {
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var id = "grid";
|
var id = "grid";
|
||||||
var delArr = new Array();
|
var delArr = new Array();
|
||||||
var ids = $("#grid").jqGrid('getDataIDs');
|
var ids = $("#grid").jqGrid('getDataIDs');
|
||||||
|
|||||||
@@ -238,6 +238,10 @@ $(document).ready(function() {
|
|||||||
$('#btn_clone').click(onclickBtnClone);
|
$('#btn_clone').click(onclickBtnClone);
|
||||||
|
|
||||||
$("#btn_delete").click(function(){
|
$("#btn_delete").click(function(){
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var id = "grid";
|
var id = "grid";
|
||||||
var cnvsnNameArr = new Array();
|
var cnvsnNameArr = new Array();
|
||||||
var eaiSvcNameArr = new Array();
|
var eaiSvcNameArr = new Array();
|
||||||
|
|||||||
@@ -703,7 +703,15 @@
|
|||||||
transformRows = json.transformRows;
|
transformRows = json.transformRows;
|
||||||
//eaiSvcName combo
|
//eaiSvcName combo
|
||||||
$("input[name=eaiSvcName]").val('${param.eaiSvcName }');
|
$("input[name=eaiSvcName]").val('${param.eaiSvcName }');
|
||||||
$("input[name=eaiSvcDesc]").val('${param.eaiSvcDesc }');
|
|
||||||
|
var rawDesc = '${param.eaiSvcDesc}';
|
||||||
|
|
||||||
|
if (rawDesc && rawDesc !== "") {
|
||||||
|
$("input[name=eaiSvcDesc]").val(decodeURIComponent(rawDesc));
|
||||||
|
} else {
|
||||||
|
$("input[name=eaiSvcDesc]").val("");
|
||||||
|
}
|
||||||
|
|
||||||
//$("input[name=cnvsnDesc]").val('${param.cnvsnDesc }');
|
//$("input[name=cnvsnDesc]").val('${param.cnvsnDesc }');
|
||||||
|
|
||||||
new makeOptions("CODE","NAME").setObj($("#functionCombo")).setData(json.functionRows).setNoValueInclude(true).setNoValue("", "<%=localeMessage.getString("transformManDetail.none")%>").setFormat(codeName3OptionFormat).rendering();
|
new makeOptions("CODE","NAME").setObj($("#functionCombo")).setData(json.functionRows).setNoValueInclude(true).setNoValue("", "<%=localeMessage.getString("transformManDetail.none")%>").setFormat(codeName3OptionFormat).rendering();
|
||||||
@@ -1065,6 +1073,10 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("#btn_delete").click(function(){
|
$("#btn_delete").click(function(){
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var postData = [];
|
var postData = [];
|
||||||
const cnvsnName = $("select[name=transformForEaiSvcNameCombo]").val();
|
const cnvsnName = $("select[name=transformForEaiSvcNameCombo]").val();
|
||||||
const cnvsnType = cnvsnName.slice(-3);
|
const cnvsnType = cnvsnName.slice(-3);
|
||||||
|
|||||||
@@ -154,6 +154,10 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$("#btn_delete").click(function(){
|
$("#btn_delete").click(function(){
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var disabled = $('#ajaxForm').find(':input:disabled').removeAttr('disabled');
|
var disabled = $('#ajaxForm').find(':input:disabled').removeAttr('disabled');
|
||||||
var postData = $('#ajaxForm').serializeArray();
|
var postData = $('#ajaxForm').serializeArray();
|
||||||
disabled.attr('disabled','disabled');
|
disabled.attr('disabled','disabled');
|
||||||
|
|||||||
@@ -62,12 +62,22 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 어댑터, 메서드 라이브 서치 사용시 width 깨짐 방지 */
|
/* 어댑터, 메서드 select2 사용시 width 깨짐 방지 */
|
||||||
.select2-container {
|
.select2-container {
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 버튼 내용이 길어질 경우 말줄임표(...) 처리 */
|
||||||
|
.btn-ellipsis {
|
||||||
|
max-width: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<script language="javascript" >
|
<script language="javascript" >
|
||||||
var isDetail = false;
|
var isDetail = false;
|
||||||
@@ -319,17 +329,27 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setStandardMessageItemsLabel(items, buttonId) {
|
function setStandardMessageItemsLabel(items, buttonId) {
|
||||||
const label = items.map(function(item) {
|
const label = items.map(function(item) {
|
||||||
return item.COLUMNNAME + '=' + item.COLUMNVALUE;
|
return item.COLUMNNAME + '=' + item.COLUMNVALUE;
|
||||||
}).join(';');
|
}).join(';');
|
||||||
|
|
||||||
if(items.length > 0) {
|
const $btn = $('#' + buttonId);
|
||||||
$('#'+buttonId).text('수정 ['+label+']');
|
|
||||||
} else {
|
if (items.length > 0) {
|
||||||
$('#'+buttonId).text('수정');
|
$btn.text('수정 [' + label + ']');
|
||||||
}
|
|
||||||
}
|
$btn.attr('title', '수정 [' + label + ']');
|
||||||
|
|
||||||
|
$btn.addClass('btn-ellipsis');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$btn.text('수정');
|
||||||
|
$btn.removeAttr('title');
|
||||||
|
|
||||||
|
$btn.removeClass('btn-ellipsis');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function setupStdCommonValueModal(type) {
|
function setupStdCommonValueModal(type) {
|
||||||
currentStandardMessageType = type;
|
currentStandardMessageType = type;
|
||||||
@@ -984,6 +1004,10 @@
|
|||||||
|
|
||||||
$("#btn_modify").click(modifyApi);
|
$("#btn_modify").click(modifyApi);
|
||||||
$("#btn_delete").click(function(){
|
$("#btn_delete").click(function(){
|
||||||
|
if(!confirm("삭제하시겠습니까?")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var postData = $('#ajaxForm').serializeArray();
|
var postData = $('#ajaxForm').serializeArray();
|
||||||
postData.push({ name: "cmd" , value:"DELETE"});
|
postData.push({ name: "cmd" , value:"DELETE"});
|
||||||
|
|
||||||
@@ -1303,7 +1327,7 @@
|
|||||||
alert(e.responseText);
|
alert(e.responseText);
|
||||||
},
|
},
|
||||||
complete: function() {
|
complete: function() {
|
||||||
$("[id^='btn_']").prop("disabled", false);
|
$("[id=doCloneInterfaceButton]").prop("disabled", false);
|
||||||
$("#doCloneInterfaceButton").text("복제");
|
$("#doCloneInterfaceButton").text("복제");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1180,17 +1180,54 @@ public class ApiInterfaceService extends OnlBaseService {
|
|||||||
apiInterfaceUI.setInboundRestPath(newInboundRestPath);
|
apiInterfaceUI.setInboundRestPath(newInboundRestPath);
|
||||||
|
|
||||||
if ("Y".equals(apiInterfaceUI.getTransformYn())) {
|
if ("Y".equals(apiInterfaceUI.getTransformYn())) {
|
||||||
apiInterfaceUI.setInboundRequestLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getInboundRequestLayout()), newBizCd, newApiInterfaceId));
|
|
||||||
apiInterfaceUI.setOutboundRequestLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getOutboundRequestLayout()), newBizCd, newApiInterfaceId));
|
String newInReq = processLayoutIfExist(apiInterfaceUI.getInboundRequestLayout(), newBizCd, newApiInterfaceId);
|
||||||
apiInterfaceUI.setOutboundResponseLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getOutboundResponseLayout()), newBizCd, newApiInterfaceId));
|
String newOutReq = processLayoutIfExist(apiInterfaceUI.getOutboundRequestLayout(), newBizCd, newApiInterfaceId);
|
||||||
apiInterfaceUI.setInboundResponseLayout(changeToTargetLayoutUI(layoutManService.getLayoutUiToExport(apiInterfaceUI.getInboundResponseLayout()), newBizCd, newApiInterfaceId));
|
String newOutRes = processLayoutIfExist(apiInterfaceUI.getOutboundResponseLayout(), newBizCd, newApiInterfaceId);
|
||||||
|
String newInRes = processLayoutIfExist(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()));
|
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);
|
importApiInterfaceUi(apiInterfaceUI, importDupliCheck);
|
||||||
|
|
||||||
return apiInterfaceUI;
|
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)';
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
Reference in New Issue
Block a user