8 Commits

Author SHA1 Message Date
curry772 d81aeeef67 chore: DJErp InterfaceID 설정 TODO 주석 추가
표준전문 InterfaceID에 SEND_RECV_DIVISION·IN_EX_DIVISION 포함 여부 결정 전까지
mapper.setInterfaceId() 호출을 주석 처리 및 TODO 표기.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 14:10:54 +09:00
curry772 5dae063fe5 fix: FLAT 직렬화 시 비활성 조건부 GROUP 블록 바이트 포함 버그 수정
toByteArray() / getBytesDataLength() GROUP 케이스에서
size==0 이면 refPath/refValue 유무와 무관하게 무조건 skip 하도록 변경.
(toJson() 동작과 일치)

기존 로직은 refPath 또는 refValue 가 없는 경우에만 skip 하여,
조건부 블록(EZDATA, MSG 등)이 비활성 상태(size=0, isHidden=false)일 때도
FLAT 바이트에 잘못 포함되는 문제가 있었음.
→ FlatReader 파싱 시 오프셋 불일치로 overflow 예외 또는 DATA 필드 오염 발생.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-23 10:34:22 +09:00
curry772 024b24af49 Merge branch 'master' into feature/standard-message-djb 2026-04-22 15:50:23 +09:00
curry772 6807e2b947 Merge branch 'feature/jejubank-oauth-bypass' 2026-04-22 15:49:37 +09:00
curry772 56fc66faa0 fix: 표준헤더 진행번호(SendTime) 처리 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 15:40:49 +09:00
curry772 126f41624d Merge branch 'feature/standard-message-djb' into master 2026-04-21 16:00:25 +09:00
curry772 ae6ed9b262 fix: DJBank 표준전문 대응 프레임워크 수정
- BaseFCProcess.setGUID(): nextGuidSeq 자동 호출 비활성화
  (guid_prgs_no 증가는 Coordinator에서 처리)
- DefaultProcess: 오류 응답 시 nextGuidSeq 자동 호출 비활성화
- RequestProcessor: GUID 조합(guid+seq) 로직 비활성화,
  logger.error에 exception 객체 추가
- StandardMessageManager: config 기본 경로 ./resources/ → ./ 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 15:48:20 +09:00
curry772 6f5af2ac69 fix: toJson 직렬화 시 빈 항목 제외 처리
itemPart가 비어있을 경우 구분자와 내용을 출력하지 않도록 수정.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 09:08:31 +09:00
5 changed files with 36 additions and 40 deletions
@@ -427,15 +427,15 @@ public class BaseFCProcess extends Process {
public void setGUID() throws Exception {
InterfaceMapper mapper = this.resEaiMsg.getMapper();
StandardMessage standardMessage = this.resEaiMsg.getStandardMessage();
String guid = mapper.getGuid(standardMessage);
String guidseq = mapper.getGuidSeq(standardMessage);
if (logger.isDebug())
logger.debug(guidLogPrefix + " REQ Current GUID [" + guid + "][" + guidseq + "]");
mapper.nextGuidSeq(standardMessage);
guidseq = mapper.getGuidSeq(standardMessage);
if (logger.isDebug())
logger.debug(guidLogPrefix + " REQ ADD PATHSEQ GUID [" + guid + "][" + guidseq + "]");
// String guid = mapper.getGuid(standardMessage);
// String guidseq = mapper.getGuidSeq(standardMessage);
//
// if (logger.isDebug())
// logger.debug(guidLogPrefix + " REQ Current GUID [" + guid + "][" + guidseq + "]");
// mapper.nextGuidSeq(standardMessage);
// guidseq = mapper.getGuidSeq(standardMessage);
// if (logger.isDebug())
// logger.debug(guidLogPrefix + " REQ ADD PATHSEQ GUID [" + guid + "][" + guidseq + "]");
String svcTsmtUsgTp = this.reqEaiMsg.getSvcTsmtUsgTp(); // 기동 호출방식
String psvItfTp = this.reqEaiMsg.getCurrentSvcMsg().getPsvItfTp(); // 수동 호출방식
@@ -368,6 +368,9 @@ public class RequestProcessor extends RequestProcessorSupport {
logUnknownMessage(vo,orgMessage);
throw new RequestProcessorException(vo.getRspErrorMsg());
}else {
// TODO : DJErp - 표준전문의 InterfaceID는 SEND_RECV_DIVISION, IN_EX_DIVISION 포함해야 할지에 따라 결정
// mapper.setInterfaceId(standardMessage, eaiSvcCd);
/**
* MCI Sync-Async 응답을 대표인터페이스로 구현하기 위해 추가
* 조건)MCI 거래 && 일반거래 && 응답 거래
@@ -1301,17 +1304,17 @@ public class RequestProcessor extends RequestProcessorSupport {
STDMessageKeys.SEND_RECV_CD_SEND.equals(returnType) ) {
try {
retEaiMsg.setLogPssSno(400);
String retGuid = mapper.getGuid(retEaiMsg.getStandardMessage());
String retGuidSeq = mapper.getGuidSeq(retEaiMsg.getStandardMessage());
String newGuid = retGuid + StringUtils.defaultString(StringUtils.leftPad(retGuidSeq, UUIDGenerator.GUID_SEQ_LENGTH, '0'));
mapper.setGuid(retEaiMsg.getStandardMessage(), newGuid);
// String retGuid = mapper.getGuid(retEaiMsg.getStandardMessage());
// String retGuidSeq = mapper.getGuidSeq(retEaiMsg.getStandardMessage());
// String newGuid = retGuid + StringUtils.defaultString(StringUtils.leftPad(retGuidSeq, UUIDGenerator.GUID_SEQ_LENGTH, '0'));
// mapper.setGuid(retEaiMsg.getStandardMessage(), newGuid);
mapper.setSendTime(retEaiMsg.getStandardMessage(), DatetimeUtil.getCurrentTimeMillis());
EAILogSender.send(retEaiMsg, null);
} catch(Exception e) {
vo.setRspErrorCode("RECEAIIRP100");
vo.setRspErrorMsg(ExceptionUtil.make(e, vo.getRspErrorCode(), new String[]{vo.getEaiSvcCd()} ));
if (logger.isError()) logger.error(guidLogPrefix + " : " + vo.getRspErrorMsg());
if (logger.isError()) logger.error(guidLogPrefix + " : " + vo.getRspErrorMsg(), e);
}
if (logger.isInfo()) logger.info(guidLogPrefix + " : LOG(" + eaiMsg.getLogPssSno() + ") EAIMessage : "+eaiMsg.getEAISvcCd());
}
@@ -783,12 +783,15 @@ public class StandardItem implements Serializable, Cloneable {
if(p>0) sb.append(",");
sb.append("{");
while(keyIter.hasNext()) {
if(ai>0) sb.append(",");
String key = keyIter.next();
StandardItem item = group.get(key);
if(showPretty) sb.append("\n");
sb.append(item.toJson(showPretty, withBizData));
ai++;
String itemPart = item.toJson(showPretty, withBizData);
if(StringUtils.isNotEmpty(itemPart)) {
if(ai>0) sb.append(",");
if(showPretty) sb.append("\n");
sb.append(itemPart);
ai++;
}
}
if(showPretty) {
@@ -1020,20 +1023,15 @@ public class StandardItem implements Serializable, Cloneable {
totalSize += getLength();
break;
case StandardType.GROUP :
// skip variable group
if( getSize() == 0
//카카오뱅크 => 카카오카드 400응답시 아래 로직을 추가해야 전체건수에서 메시지부가 처리됨
//메시지부 size 0 refPath refValue 사용 해서 있고 없고 처리
&& (StringUtils.isBlank(getRefPath())
|| StringUtils.isBlank(getRefValue()))
) {
// skip inactive/conditional group (size==0 means not activated)
if( getSize() == 0 ) {
break;
}
if (isHidden) break;
keyIter = childs.keySet().iterator();
while(keyIter.hasNext()) {
String key = keyIter.next();
StandardItem item = childs.get(key);
StandardItem item = childs.get(key);
totalSize +=item.getBytesDataLength(charset);
}
break;
@@ -1120,20 +1118,15 @@ public class StandardItem implements Serializable, Cloneable {
}
break;
case StandardType.GROUP :
// skip variable group
if( getSize() == 0
//카카오뱅크 => 카카오카드 400응답시 아래 로직을 추가해야 전체건수에서 메시지부가 처리됨
//메시지부 size 0 refPath refValue 사용 해서 있고 없고 처리
&& (StringUtils.isBlank(getRefPath())
|| StringUtils.isBlank(getRefValue()))
) {
// skip inactive/conditional group (size==0 means not activated)
if( getSize() == 0 ) {
break;
}
if (isHidden) break;
keyIter = childs.keySet().iterator();
while(keyIter.hasNext()) {
String key = keyIter.next();
StandardItem item = childs.get(key);
StandardItem item = childs.get(key);
bos.write(item.toByteArray(withBizData,charset)); //하위로 내려갈때 withBizDat 값이 없어져서 추가 jun's 20231101
}
break;
@@ -47,7 +47,7 @@ reader.XML=com.eactive.eai.message.parser.XmlReader
reader.FLAT=com.eactive.eai.message.parser.FlatReader
*/
public static String STANDARD_MESSAGE_CONFIG = "standard.message.config";
private String DEFAULT_CONFIG_PATH = "./resources/standard-message-config.properties";
private String DEFAULT_CONFIG_PATH = "./standard-message-config.properties";
private String DEFAULT_CONFIG_FILE = "standard-message-config.properties";
private String LAYOUT_FILE_TYPE = "layout.file.type";
@@ -359,10 +359,10 @@ public abstract class DefaultProcess extends Process {
// GUID SET
mapper.nextGuidSeq(standardMessage);
String guid = mapper.getGuid(standardMessage);
String guidSeq = mapper.getGuidSeq(standardMessage);
mapper.setGuid(standardMessage,
guid + StringUtils.defaultString(StringUtils.leftPad(guidSeq, UUIDGenerator.GUID_SEQ_LENGTH, '0')));
// String guid = mapper.getGuid(standardMessage);
// String guidSeq = mapper.getGuidSeq(standardMessage);
// mapper.setGuid(standardMessage,
// guid + StringUtils.defaultString(StringUtils.leftPad(guidSeq, UUIDGenerator.GUID_SEQ_LENGTH, '0')));
// 시스템구분
// stdmsg.setData("stdheader.Inter_chn", EAIServerManager.getInstance().getSystemGubun());
@@ -776,7 +776,7 @@ public abstract class DefaultProcess extends Process {
}
standardMessage.setBizData(this.resObject, this.inboundCharset);
try {
mapper.nextGuidSeq(standardMessage);
//mapper.nextGuidSeq(standardMessage);
mapper.setSendRecvDivision(standardMessage, STDMessageKeys.SEND_RECV_CD_RECV);
StandardMessageManager standardManager = StandardMessageManager.getInstance();
standardManager.getMessageCoordinator().coordinateSetStandardMessageError(standardMessage, mapper,