refactor: CSV 기본값 이관 및 EZDATA 조건 평가 동적화

- standard-layout-djb.csv: HEAD ERP 고정값(tx_cmgr_cd=S004, mgmt_brcd/tx_brcd/insl_brcd/blng_brcd=260),
  정상 MSG 필드(outp_msg_cd=NCMM00001, outp_msg_ctnt=정상처리되었습니다.) 기본값 추가,
  msg_list_rowcnt 기본값 00000→0 수정
- StandardMessageCoordinatorDJB: setErpHeadFields() 및 관련 상수 제거,
  coordinateAfterRecvNonStdSyncResponse 명시적 setData 호출 제거 (CSV 기본값으로 대체),
  evaluateBlockCondition() 추가로 EZDATA 활성화 조건을 CSV refPath/refValue에서 동적 평가,
  elfn_spr_fild 설정값을 ezdataItem.getRefValue()로 CSV에서 읽도록 변경
- StandardMessageSpecTest: tx_cmgr_cd가 항상 CSV 기본값으로 설정되므로 비ERP_ERP_HEAD_필드_미설정 테스트 제거
- 작업내역_20260421.md: 리팩터링 내용 반영

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
curry772
2026-04-21 11:30:17 +09:00
parent 17d533fe06
commit 1508d01afb
4 changed files with 392 additions and 52 deletions
@@ -47,14 +47,6 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
private static final String HEAD_MESG_RSPN_DT = "HEAD.mesg_rspn_dt";
private static final String HEAD_MESG_RSPN_TIME = "HEAD.mesg_rspn_time";
// HEAD ERP 채널 필드 경로
private static final String HEAD_TX_CMGR_CD = "HEAD.tx_cmgr_cd";
private static final String HEAD_MGMT_BRCD = "HEAD.mgmt_brcd";
private static final String HEAD_TX_BRCD = "HEAD.tx_brcd";
private static final String HEAD_INSL_BRCD = "HEAD.insl_brcd";
private static final String HEAD_BLNG_BRCD = "HEAD.blng_brcd";
private static final String HEAD_CORP_TLWN_VIRT_BRCD = "HEAD.corp_tlwn_virt_brcd";
// EZDATA 영역 경로
private static final String EZDATA_ELFN_BNKN_DVCD = "EZDATA.elfn_bnkn_dvcd";
private static final String EZDATA_SVR_TX_SEQNO = "EZDATA.svr_tx_seqno";
@@ -76,8 +68,6 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
// DATA 영역 경로
private static final String DATA_SCOP_LEN = "DATA.data_scop_len";
private static final String ERP_CODE = "ERP";
@Override
public void coordinateAfterParsing(StandardMessage standardMessage, Object paramObject, Properties prop) {
}
@@ -117,11 +107,10 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
standardMessage.setData(HEAD_FRST_TRNM_IPV4_ADDR, ipv4);
standardMessage.setData(HEAD_FRST_TRNM_MAC, mac);
// ERP 채널 전자금융공통영역(EZDATA) 설정
String corpTlwn = StringUtils.trimToEmpty(standardMessage.findItemValue(HEAD_CORP_TLWN_VIRT_BRCD));
if (ERP_CODE.equals(corpTlwn)) {
setErpHeadFields(standardMessage);
setEzdataFields(standardMessage, ipv4, mac);
// ERP 채널 전자금융공통영역(EZDATA) 설정 — CSV refPath/refValue 조건 평가
StandardItem ezdataItem = standardMessage.findItem("EZDATA");
if (ezdataItem != null && evaluateBlockCondition(standardMessage, ezdataItem)) {
setEzdataFields(standardMessage, ezdataItem, ipv4, mac);
}
}
@@ -228,12 +217,8 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
mainMsgItem.setSize(1);
}
// msg_dvcd = NM (정상메시지), msg_list 없음(rowcnt=0)
responseMessage.setData(MSG_DVCD, "NM");
responseMessage.setData(MSG_OUTP_ATRB_CD, "0");
responseMessage.setData(MSG_OUTP_MSG_CD, "NCMM00001 ");
responseMessage.setData(MSG_OUTP_MSG_CTNT, "정상처리되었습니다.");
responseMessage.setData(MSG_LIST_ROWCNT, "00000");
// msg_dvcd=NM, outp_atrb_cd=0, outp_msg_cd, outp_msg_ctnt, msg_list_rowcnt=00000
// → 모두 CSV 기본값 사용
makeMsgScopLen(responseMessage);
}
@@ -272,26 +257,40 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
return new String[]{ipv4, mac};
}
private void setErpHeadFields(StandardMessage standardMessage) {
standardMessage.setData(HEAD_TX_CMGR_CD, "S004");
standardMessage.setData(HEAD_MGMT_BRCD, "260");
standardMessage.setData(HEAD_TX_BRCD, "260");
standardMessage.setData(HEAD_INSL_BRCD, "260");
standardMessage.setData(HEAD_BLNG_BRCD, "260");
}
private void setEzdataFields(StandardMessage standardMessage, String ipv4, String mac) {
StandardItem ezdataItem = standardMessage.findItem("EZDATA");
if (ezdataItem != null) {
ezdataItem.setHidden(false);
ezdataItem.setSize(1);
}
private void setEzdataFields(StandardMessage standardMessage, StandardItem ezdataItem, String ipv4, String mac) {
ezdataItem.setHidden(false);
ezdataItem.setSize(1);
standardMessage.setData(EZDATA_ELFN_BNKN_DVCD, "10");
standardMessage.setData(EZDATA_SVR_TX_SEQNO, String.valueOf(System.currentTimeMillis() / 1000L));
standardMessage.setData(EZDATA_ELFN_MAC, mac);
standardMessage.setData(EZDATA_PC_OFCL_IPAD, ipv4);
standardMessage.setData(EZDATA_PC_PRVAT_IPAD, ipv4);
standardMessage.setData(EZDATA_ELFN_SPR_FILD, ERP_CODE);
standardMessage.setData(EZDATA_ELFN_SPR_FILD, ezdataItem.getRefValue());
}
/**
* StandardItem의 refPath/refValue를 현재 메시지 필드값과 비교해 조건 충족 여부를 반환한다.
* refValue 앞에 '!'를 붙이면 NOT 조건, '|'로 구분하면 OR 조건이다.
* refPath 또는 refValue가 없으면 조건 없음(true)으로 처리한다.
*/
private boolean evaluateBlockCondition(StandardMessage standardMessage, StandardItem item) {
String refPath = item.getRefPath();
String refValue = item.getRefValue();
if (StringUtils.isBlank(refPath) || StringUtils.isBlank(refValue)) {
return true;
}
String actualValue = StringUtils.trimToEmpty(standardMessage.findItemValue(refPath));
boolean negate = refValue.startsWith("!");
String compareValue = negate ? refValue.substring(1) : refValue;
boolean matched = matchesAny(compareValue, actualValue);
return negate ? !matched : matched;
}
private boolean matchesAny(String refValue, String actualValue) {
for (String v : refValue.split("\\|")) {
if (v.equals(actualValue)) return true;
}
return false;
}
private void makeupDataScopLen(StandardMessage standardMessage, String charset) {
+8 -8
View File
@@ -56,11 +56,11 @@ mesg_cnty_seqno,2,2,1,1,3,2,,,
msg_trnm_tycd,2,2,1,1,1,1,,,
msg_trnm_brcd,2,2,1,1,3,1,,,
msg_trnm_tlrno,2,2,1,1,6,1,,,
tx_cmgr_cd,2,2,1,1,4,1,,,
mgmt_brcd,2,2,1,1,3,1,,,
tx_brcd,2,2,1,1,3,1,,,
insl_brcd,2,2,1,1,3,1,,,
blng_brcd,2,2,1,1,3,1,,,
tx_cmgr_cd,2,2,1,1,4,1,,,S004
mgmt_brcd,2,2,1,1,3,1,,,260
tx_brcd,2,2,1,1,3,1,,,260
insl_brcd,2,2,1,1,3,1,,,260
blng_brcd,2,2,1,1,3,1,,,260
corp_tlwn_virt_brcd,2,2,1,1,3,1,,,
tlrno,2,2,1,1,6,1,,,
telr_jcls_cd,2,2,1,1,2,1,,,
@@ -151,11 +151,11 @@ msg_dvcd,2,2,0,1,2,1,,,NM
msg_scop_len,2,2,0,1,8,2,,,
MAIN_MSG,2,3,0,1,0,1,,,
outp_atrb_cd,3,2,1,1,1,1,,,0
outp_msg_cd,3,2,1,1,12,1,,,
outp_msg_ctnt,3,2,1,1,200,1,,,
outp_msg_cd,3,2,1,1,12,1,,,NCMM00001
outp_msg_ctnt,3,2,1,1,200,1,,,정상처리되었습니다.
outp_msg_desc,3,2,1,1,300,1,,,
mngm_msg_cd,3,2,1,1,12,1,,,
msg_list_rowcnt,3,2,0,1,5,2,,,00000
msg_list_rowcnt,3,2,0,1,5,2,,,0
msg_list,2,4,0,1,0,1,MSG.MAIN_MSG.msg_list_rowcnt,,
outp_msg_cd,3,2,0,1,12,1,,,
outp_msg_ctnt,3,2,0,1,200,1,,,
1 #-----------------------------------------------------------------------------
56 msg_trnm_tycd,2,2,1,1,1,1,,,
57 msg_trnm_brcd,2,2,1,1,3,1,,,
58 msg_trnm_tlrno,2,2,1,1,6,1,,,
59 tx_cmgr_cd,2,2,1,1,4,1,,, tx_cmgr_cd,2,2,1,1,4,1,,,S004
60 mgmt_brcd,2,2,1,1,3,1,,, mgmt_brcd,2,2,1,1,3,1,,,260
61 tx_brcd,2,2,1,1,3,1,,, tx_brcd,2,2,1,1,3,1,,,260
62 insl_brcd,2,2,1,1,3,1,,, insl_brcd,2,2,1,1,3,1,,,260
63 blng_brcd,2,2,1,1,3,1,,, blng_brcd,2,2,1,1,3,1,,,260
64 corp_tlwn_virt_brcd,2,2,1,1,3,1,,,
65 tlrno,2,2,1,1,6,1,,,
66 telr_jcls_cd,2,2,1,1,2,1,,,
151 msg_scop_len,2,2,0,1,8,2,,,
152 MAIN_MSG,2,3,0,1,0,1,,,
153 outp_atrb_cd,3,2,1,1,1,1,,,0
154 outp_msg_cd,3,2,1,1,12,1,,, outp_msg_cd,3,2,1,1,12,1,,,NCMM00001
155 outp_msg_ctnt,3,2,1,1,200,1,,, outp_msg_ctnt,3,2,1,1,200,1,,,정상처리되었습니다.
156 outp_msg_desc,3,2,1,1,300,1,,,
157 mngm_msg_cd,3,2,1,1,12,1,,,
158 msg_list_rowcnt,3,2,0,1,5,2,,,00000 msg_list_rowcnt,3,2,0,1,5,2,,,0
159 msg_list,2,4,0,1,0,1,MSG.MAIN_MSG.msg_list_rowcnt,,
160 outp_msg_cd,3,2,0,1,12,1,,,
161 outp_msg_ctnt,3,2,0,1,200,1,,,
@@ -422,14 +422,6 @@ class StandardMessageSpecTest {
assertEquals("ERP", msg.findItemValue("EZDATA.elfn_spr_fild").trim());
}
@Test
void 비ERP_ERP_HEAD_필드_미설정() throws Exception {
StandardMessage msg = parseReq();
coordinator.coordinateAfterCreateMessageByRule(msg, null, null);
String txCmgrCd = msg.findItemValue("HEAD.tx_cmgr_cd");
assertTrue(txCmgrCd == null || txCmgrCd.trim().isEmpty(),
"비ERP 요청에서 tx_cmgr_cd는 설정되면 안 됨");
}
}
// ================================================================