feat: 표준전문 스펙 필수 처리 항목 구현 및 테스트 추가

요청 처리:
- ERP 채널(corp_tlwn_virt_brcd=ERP) HEAD 지점코드 자동 설정 (tx_cmgr_cd, mgmt_brcd 등)
- ERP 채널 EZDATA 전자금융공통영역 자동 설정 (elfn_bnkn_dvcd=10, svr_tx_seqno, elfn_mac, IP)

응답 처리:
- coordinateBeforeResponse: guid_prgs_no +1, dman_rspn_dvcd="R" 설정 추가
- coordinateAfterRecvNonStdSyncResponse: 정상 MSG msg_list_rowcnt=0으로 수정, 정상처리 코드/메시지 업데이트

오류 처리:
- coordinateSetStandardMessageError: MSG_LIST에 outp_msg_desc, err_occu_loct 추가

테스트:
- StandardMessageSpecTest: 요청/응답 스펙 전체 62개 항목 검증
- StandardMessageEzdataJsonFlowTest: EZDATA JSON 흐름 22개 검증

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
curry772
2026-04-21 10:45:08 +09:00
parent 557a071b1e
commit 17d533fe06
5 changed files with 1243 additions and 45 deletions
@@ -47,6 +47,22 @@ 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";
private static final String EZDATA_ELFN_MAC = "EZDATA.elfn_mac";
private static final String EZDATA_PC_OFCL_IPAD = "EZDATA.pc_ofcl_ipad";
private static final String EZDATA_PC_PRVAT_IPAD = "EZDATA.pc_prvat_ipad";
private static final String EZDATA_ELFN_SPR_FILD = "EZDATA.elfn_spr_fild";
// MSG 영역 경로
private static final String MSG_DVCD = "MSG.msg_dvcd";
private static final String MSG_SCOP_LEN = "MSG.msg_scop_len";
@@ -60,6 +76,8 @@ 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) {
}
@@ -73,10 +91,10 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
String guid = GUIDGeneratorDJB.getGUID("EAI");
mapper.setGuid(standardMessage, guid);
// GUID 진행번호 초기화 (최초=1)
// GUID 진행번호 초기화 (최초=001)
mapper.setGuidSeq(standardMessage, "001");
// 원거래GUID = GUID 동일값 설정 (복원이 아닌 경우)
// 원거래GUID = GUID 동일값 설정
mapper.setOrgGuid(standardMessage, guid);
// 최초전문요청일자/시각 설정
@@ -91,8 +109,20 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
EAIServerManager eaiServer = EAIServerManager.getInstance();
standardMessage.setData(HEAD_SYS_ENV_DVCD, getSysEnvDvcd(eaiServer));
// 최초전송 IP / IPv4 / MAC 설정
setNetworkInfo(standardMessage);
// 최초전송 IP / IPv4 / MAC 수집 및 설정
String[] netInfo = collectNetworkInfo();
String ipv4 = netInfo[0];
String mac = netInfo[1];
standardMessage.setData(HEAD_FRST_TRNM_IPAD, ipv4);
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);
}
}
@Override
@@ -102,6 +132,15 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
@Override
public void coordinateBeforeResponse(StandardMessage standardMessage, ProcessVO processVO, Properties prop, String charset) {
StandardMessageManager manager = StandardMessageManager.getInstance();
InterfaceMapper mapper = manager.getMapper();
// GUID 진행번호 +1
mapper.nextGuidSeq(standardMessage);
// 요청응답구분 = 응답(R)
mapper.setSendRecvDivision(standardMessage, STDMessageKeys.SEND_RECV_CD_RECV);
// 응답일자/시각 설정
LocalDateTime now = LocalDateTime.now();
standardMessage.setData(HEAD_MESG_RSPN_DT, now.format(FMT_DATE));
@@ -154,6 +193,8 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
if (row != null) {
if (row.containsKey("outp_msg_cd")) row.get("outp_msg_cd").setValue(siteErrCode);
if (row.containsKey("outp_msg_ctnt")) row.get("outp_msg_ctnt").setValue(siteErrMsg);
if (row.containsKey("outp_msg_desc")) row.get("outp_msg_desc").setValue(siteErrMsg);
if (row.containsKey("err_occu_loct")) row.get("err_occu_loct").setValue(errCode);
}
}
@@ -187,22 +228,12 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
mainMsgItem.setSize(1);
}
// msg_dvcd = NM (정상메시지)
responseMessage.setData(MSG_DVCD, "NM");
// 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, "000000000000");
responseMessage.setData(MSG_OUTP_MSG_CTNT, "정상처리");
responseMessage.setData(MSG_LIST_ROWCNT, "00001");
StandardItem msgList = responseMessage.findItem(MSG_LIST);
if (msgList != null) {
msgList.setSize(1);
LinkedHashMap<String, StandardItem> row = msgList.getArrayChilds(0, true);
if (row != null) {
if (row.containsKey("outp_msg_cd")) row.get("outp_msg_cd").setValue("000000000000");
if (row.containsKey("outp_msg_ctnt")) row.get("outp_msg_ctnt").setValue("정상처리");
}
}
responseMessage.setData(MSG_OUTP_MSG_CD, "NCMM00001 ");
responseMessage.setData(MSG_OUTP_MSG_CTNT, "정상처리되었습니다.");
responseMessage.setData(MSG_LIST_ROWCNT, "00000");
makeMsgScopLen(responseMessage);
}
@@ -217,31 +248,50 @@ public class StandardMessageCoordinatorDJB extends DefaultStandardMessageCoordin
return "D"; // 개발
}
private void setNetworkInfo(StandardMessage standardMessage) {
private String[] collectNetworkInfo() {
String ipv4 = "";
String mac = "";
try {
InetAddress localAddr = InetAddress.getLocalHost();
String ipv4 = localAddr.getHostAddress();
// IPv4 주소 설정
standardMessage.setData(HEAD_FRST_TRNM_IPAD, ipv4);
standardMessage.setData(HEAD_FRST_TRNM_IPV4_ADDR, ipv4);
// MAC 주소 설정
ipv4 = localAddr.getHostAddress();
NetworkInterface ni = NetworkInterface.getByInetAddress(localAddr);
if (ni != null) {
byte[] mac = ni.getHardwareAddress();
if (mac != null) {
byte[] macBytes = ni.getHardwareAddress();
if (macBytes != null) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
for (int i = 0; i < macBytes.length; i++) {
if (i > 0) sb.append(":");
sb.append(String.format("%02X", mac[i]));
sb.append(String.format("%02X", macBytes[i]));
}
standardMessage.setData(HEAD_FRST_TRNM_MAC, sb.toString());
mac = sb.toString();
}
}
} catch (Exception e) {
if (logger.isWarn()) logger.warn("Failed to set network info", e);
if (logger.isWarn()) logger.warn("Failed to collect network info", e);
}
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);
}
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);
}
private void makeupDataScopLen(StandardMessage standardMessage, String charset) {