From 323d227eee295242171c8984d897f6c0de8b3a0e Mon Sep 17 00:00:00 2001 From: jade Date: Thu, 23 Jul 2026 09:19:09 +0900 Subject: [PATCH] feat: Add AxhubEaiComponent and MCI/EAI mock frameworks --- .../eai/component/AxhubEaiComponent.java | 84 +++++++++++ .../mci/component/AxhubMciComponent.java | 133 ++++++++++++++++-- .../mci/enums/IndvCtinRoleTyp.java | 12 ++ .../dap/common/session/dto/SessionDto.java | 11 ++ .../glow/communication/dto/CommonHeader.java | 8 ++ .../communication/dto/HeaderDefaults.java | 6 + .../exception/ItrfException.java | 10 ++ .../eai/component/GlowEaiComponent.java | 26 ++++ .../util/CommonHeaderFactory.java | 18 +++ .../src/main/resources/static/index.html | 43 ++++++ 10 files changed, 341 insertions(+), 10 deletions(-) create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/eai/component/AxhubEaiComponent.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/enums/IndvCtinRoleTyp.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/CommonHeader.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/HeaderDefaults.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/glow/communication/exception/ItrfException.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/glow/communication/module/eai/component/GlowEaiComponent.java create mode 100644 dap-tool-core/src/main/java/io/shinhanlife/glow/communication/util/CommonHeaderFactory.java create mode 100644 dap-tool-payment/src/main/resources/static/index.html diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/eai/component/AxhubEaiComponent.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/eai/component/AxhubEaiComponent.java new file mode 100644 index 0000000..a9f9035 --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/eai/component/AxhubEaiComponent.java @@ -0,0 +1,84 @@ +package io.shinhanlife.dap.common.integration.eai.component; + +import io.shinhanlife.dap.dapmt.config.GlowCommunicationProperties; +import io.shinhanlife.glow.communication.dto.CommonHeader; +import io.shinhanlife.glow.communication.dto.Transfer; +import io.shinhanlife.glow.communication.module.eai.component.GlowEaiComponent; +import io.shinhanlife.glow.communication.util.CommonHeaderFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 신한라이프 내부 Glow 표준 EAI 컴포넌트 어댑터 (AXHUB) + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AxhubEaiComponent { + + @SuppressWarnings("rawtypes") + private final GlowEaiComponent eai; + private final GlowCommunicationProperties communicationProperties; + + @SuppressWarnings("unchecked") + private Transfer syncEai(Transfer request) { + // LOG 저장 (AXHUB 방식 로깅) + CommonHeader reqHeader = (CommonHeader) request.getHeader(); + log.info("[AxhubEaiComponent] {} EAI 호출시작 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId()); + + Transfer response = (Transfer) eai.sync(request); + + log.info("[AxhubEaiComponent] {} EAI 호출종료 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId()); + + return response; + } + + /** + * EAI 호출 + */ + public Transfer call(String itrfId, String rcvSvcId, I inputDto) throws Exception { + CommonHeader header = CommonHeaderFactory.createRequestHeader(itrfId, rcvSvcId); + + Transfer request = Transfer.builder() + .header(header) + .body(inputDto) + .build(); + + return syncEai(request); + } + + /** + * EAI 호출 (응답 타입 명시) + */ + @SuppressWarnings("unchecked") + public Transfer call(String itrfId, String rcvSvcId, I inputDto, Class resBodyClass) throws Exception { + CommonHeader header = CommonHeaderFactory.createRequestHeader(itrfId, rcvSvcId); + + Transfer request = Transfer.builder() + .header(header) + .body(inputDto) + .resBodyClass((Class) (Class) resBodyClass) + .build(); + + return syncEai(request); + } + + /** + * EAI 호출 (rcvSvcId 없는 경우) + */ + public Transfer call(String itrfId, I inputDTO, Class resBodyClass) throws Exception { + String className = inputDTO.getClass().getSimpleName(); + String rcvSvcId = className.replace("_I", ""); + return call(itrfId, rcvSvcId, inputDTO, resBodyClass); + } + + /** + * EAI 호출 (Res body class와 rcvSvcId 없는 경우) + */ + public Transfer call(String itrfId, I inputDTO) throws Exception { + String className = inputDTO.getClass().getSimpleName(); + String rcvSvcId = className.replace("_I", ""); + return call(itrfId, rcvSvcId, inputDTO); + } +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java index 34bbf10..5d431e2 100644 --- a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/component/AxhubMciComponent.java @@ -1,13 +1,22 @@ package io.shinhanlife.dap.common.integration.mci.component; +import io.shinhanlife.dap.common.session.dto.SessionDto; +import io.shinhanlife.dap.common.util.SessionUtil; +import io.shinhanlife.dap.dapmt.config.GlowCommunicationProperties; +import io.shinhanlife.glow.communication.dto.CommonHeader; +import io.shinhanlife.glow.communication.dto.HeaderDefaults; import io.shinhanlife.glow.communication.dto.Transfer; import io.shinhanlife.glow.communication.module.mci.component.GlowMciComponent; +import io.shinhanlife.glow.communication.util.CommonHeaderFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.HashMap; +import java.util.Map; + /** - * 신한라이프 내부 Glow 표준 컴포넌트 어댑터 + * 신한라이프 내부 Glow 표준 컴포넌트 어댑터 (AXHUB) */ @Slf4j @Component @@ -16,14 +25,93 @@ public class AxhubMciComponent { @SuppressWarnings("rawtypes") private final GlowMciComponent mci; + private final GlowCommunicationProperties communicationProperties; + + /** 전문생성채널유형코드 : 1 (채널계) */ + private final static String TGRM_CREA_CHNN_TYPE_CD_1 = "1"; + private static final String SUCO_UNBL_CODE = "NNB00147"; // 청약불가 + + /** + * 전문 Common Header 생성 + * @param itrfName 인터페이스Id + * @param rcvSvcId 수신서비스Id + * @return Map + */ + private Map createCommonHeaderMap(String itrfName, String rcvSvcId) { + SessionDto sessionDto = SessionUtil.getSession(); + Map commonHeaderMap = new HashMap<>(); + + commonHeaderMap.put(HeaderDefaults.ITRF_ID, itrfName); + commonHeaderMap.put(HeaderDefaults.RCV_SVC_ID, rcvSvcId); + + if (sessionDto != null) { + commonHeaderMap.put(HeaderDefaults.STR_YMD, sessionDto.getStrYmd()); + commonHeaderMap.put(HeaderDefaults.ACNT_OGNZ_NO, sessionDto.getBrafNo()); + commonHeaderMap.put(HeaderDefaults.PSMR_ASRT_CD, sessionDto.getPsmrAsrtCd()); + commonHeaderMap.put(HeaderDefaults.SBSN_RULP_ASRT_CD, sessionDto.getSbsnRulpAsrtCd()); + commonHeaderMap.put(HeaderDefaults.BSDU_CD, sessionDto.getBsduCd()); + commonHeaderMap.put(HeaderDefaults.BSQU_CD, sessionDto.getBsquCd()); + commonHeaderMap.put(HeaderDefaults.OGNZ_ASRT_CD, sessionDto.getOgnzAsrtCd()); + commonHeaderMap.put(HeaderDefaults.OGNZ_LEVE_CD, sessionDto.getOgnzLeveCd()); + commonHeaderMap.put(HeaderDefaults.SCRN_ID, sessionDto.getPrgrId()); + } + + commonHeaderMap.put(HeaderDefaults.INDV_CTIN_ROLE_CD, io.shinhanlife.dap.common.integration.mci.enums.IndvCtinRoleTyp.CD_Z99.getCode()); + commonHeaderMap.put(HeaderDefaults.TGRM_CREA_CHNN_TYPE_CD, TGRM_CREA_CHNN_TYPE_CD_1); + + if (communicationProperties != null && communicationProperties.getCommon() != null) { + commonHeaderMap.put(HeaderDefaults.ENVR_TYPE_CD, communicationProperties.getCommon().getEnvType()); + } + + return commonHeaderMap; + } @SuppressWarnings("unchecked") - public Transfer callTo(String itrfName, String rcvSvcId, I inputDto, Class resBodyClass) { - log.info("[AxhubMciComponent] MCI 호출 준비 - 인터페이스: {}, 수신서비스: {}", itrfName, rcvSvcId); - - // Header 세팅 로직 생략 (Mock) - + private Transfer syncMci(Transfer request) { + // LOG 저장 (AXHUB 방식 로깅) + CommonHeader reqHeader = (CommonHeader) request.getHeader(); + log.info("[AxhubMciComponent] {} MCI 호출시작 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId()); + Transfer response = (Transfer) mci.sync(request); + log.info("[AxhubMciComponent] {} MCI 호출종료 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId()); + + if (response != null && response.getHeader() != null) { + CommonHeader resHeader = (CommonHeader) response.getHeader(); + String tgrmDalRsltCd = resHeader.getTgrmDalRsltCd(); + // TODO 추가 메시지 처리 및 오류 코드 제어 로직 + } + + return response; + } + + public Transfer callTo(String itrfName, String rcvSvcId, I inputDto) throws Exception { + Map commonHeaderMap = createCommonHeaderMap(itrfName, rcvSvcId); + CommonHeader header = CommonHeaderFactory.createRequestHeader(commonHeaderMap); + Transfer request = Transfer.builder() + .header(header) + .body(inputDto) + .build(); + + return syncMci(request); + } + + /** + * 대내 mci 호출 + * @param itrfName 인터페이스Id + * @param rcvSvcId 수신서비스Id + * @param inputDto inputDto + * @param resBodyClass resBodyClass + * @return Transfer + * @param resBodyClass 제너릭 + * @param inputDto 제너릭 + */ + @SuppressWarnings("unchecked") + public Transfer callTo(String itrfName, String rcvSvcId, I inputDto, Class resBodyClass) throws Exception { + Map commonHeaderMap = createCommonHeaderMap(itrfName, rcvSvcId); + CommonHeader header = CommonHeaderFactory.createRequestHeader(commonHeaderMap); + + Transfer request = Transfer.builder() + .header(header) .body(inputDto) .resBodyClass((Class) (Class) resBodyClass) .build(); @@ -31,9 +119,34 @@ public class AxhubMciComponent { return syncMci(request); } - @SuppressWarnings("unchecked") - private Transfer syncMci(Transfer request) { - log.info("[AxhubMciComponent] GlowMciComponent.sync() 호출"); - return (Transfer) mci.sync(request); + /** + * 대내 mci 호출 (rcvSvcId 없는 경우) + * @param itrfName 인터페이스Id + * @param inputDTO 수신서비스Id (클래스명 대체) + * @param resBodyClass resBodyClass + * @return Transfer + * @param resBodyClass 제너릭 + * @param inputDto 제너릭 + * @throws Exception Exception + */ + public Transfer callTo(String itrfName, I inputDTO, Class resBodyClass) throws Exception { + String className = inputDTO.getClass().getSimpleName(); + String rcvSvcId = className.replace("_I", ""); + return callTo(itrfName, rcvSvcId, inputDTO, resBodyClass); + } + + /** + * 대내 mci 호출 (Res body class와 rcvSvcId 없는 경우) + * @param itrfName 인터페이스Id + * @param inputDTO 수신서비스Id (클래스명 대체) + * @return Transfer + * @param resBodyClass 제너릭 + * @param inputDto 제너릭 + * @throws Exception Exception + */ + public Transfer callTo(String itrfName, I inputDTO) throws Exception { + String className = inputDTO.getClass().getSimpleName(); + String rcvSvcId = className.replace("_I", ""); + return callTo(itrfName, rcvSvcId, inputDTO); } } diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/enums/IndvCtinRoleTyp.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/enums/IndvCtinRoleTyp.java new file mode 100644 index 0000000..ba634bc --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/integration/mci/enums/IndvCtinRoleTyp.java @@ -0,0 +1,12 @@ +package io.shinhanlife.dap.common.integration.mci.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum IndvCtinRoleTyp { + CD_Z99("Z99"); + + private final String code; +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/session/dto/SessionDto.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/session/dto/SessionDto.java index cdd7fb1..7b0f76a 100644 --- a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/session/dto/SessionDto.java +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/session/dto/SessionDto.java @@ -58,6 +58,17 @@ public class SessionDto { private List roleNmList; private List tgtrPrafNoList; private List tgtrOgnzNoList; + + // 추가된 LICO 연동 공통 헤더 필수 필드들 + private String strYmd; + private String brafNo; + private String psmrAsrtCd; + private String sbsnRulpAsrtCd; + private String bsduCd; + private String bsquCd; + private String ognzAsrtCd; + private String ognzLeveCd; + private String prgrId; // 유틸성 diff --git a/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/CommonHeader.java b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/CommonHeader.java new file mode 100644 index 0000000..7c991d5 --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/CommonHeader.java @@ -0,0 +1,8 @@ +package io.shinhanlife.glow.communication.dto; +import lombok.Data; +@Data +public class CommonHeader { + private String itrfId; + private String rcvSvcId; + private String tgrmDalRsltCd; +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/HeaderDefaults.java b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/HeaderDefaults.java new file mode 100644 index 0000000..7df3c0a --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/dto/HeaderDefaults.java @@ -0,0 +1,6 @@ +package io.shinhanlife.glow.communication.dto; + +public enum HeaderDefaults { + ITRF_ID, RCV_SVC_ID, STR_YMD, ACNT_OGNZ_NO, PSMR_ASRT_CD, SBSN_RULP_ASRT_CD, BSDU_CD, BSQU_CD, + INDV_CTIN_ROLE_CD, SCRN_ID, OGNZ_ASRT_CD, OGNZ_LEVE_CD, TGRM_CREA_CHNN_TYPE_CD, ENVR_TYPE_CD +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/exception/ItrfException.java b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/exception/ItrfException.java new file mode 100644 index 0000000..464cc52 --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/exception/ItrfException.java @@ -0,0 +1,10 @@ +package io.shinhanlife.glow.communication.exception; + +public class ItrfException extends Exception { + public ItrfException(String msg) { + super(msg); + } + public ItrfException(String msgCd, String msgPrnAttrCd, String msgCt, String anxMsgCt) { + super(msgCd + ": " + msgCt); + } +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/module/eai/component/GlowEaiComponent.java b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/module/eai/component/GlowEaiComponent.java new file mode 100644 index 0000000..99bc00b --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/module/eai/component/GlowEaiComponent.java @@ -0,0 +1,26 @@ +package io.shinhanlife.glow.communication.module.eai.component; + +import io.shinhanlife.glow.communication.dto.Transfer; + +import org.springframework.stereotype.Component; + +/** + * TODO: 실제 Glow Framework 의존성(JAR)이 추가되면 이 Mock 클래스를 삭제하세요. + */ +@Component +public class GlowEaiComponent { + public Transfer sync(Transfer request) { + // Mock 구현 + Transfer response = new Transfer<>(); + response.setHeader(request.getHeader()); + response.setResBodyClass((Class) request.getResBodyClass()); + return response; + } + + public Transfer call(Transfer request, Class resBody) { + Transfer response = new Transfer<>(); + response.setHeader(request.getHeader()); + response.setResBodyClass(resBody); + return response; + } +} diff --git a/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/util/CommonHeaderFactory.java b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/util/CommonHeaderFactory.java new file mode 100644 index 0000000..fbb154c --- /dev/null +++ b/dap-tool-core/src/main/java/io/shinhanlife/glow/communication/util/CommonHeaderFactory.java @@ -0,0 +1,18 @@ +package io.shinhanlife.glow.communication.util; +import io.shinhanlife.glow.communication.dto.CommonHeader; +import io.shinhanlife.glow.communication.dto.HeaderDefaults; +import java.util.Map; +public class CommonHeaderFactory { + public static CommonHeader createRequestHeader(Map commonHeaderMap) { + CommonHeader header = new CommonHeader(); + header.setItrfId(commonHeaderMap.get(HeaderDefaults.ITRF_ID)); + header.setRcvSvcId(commonHeaderMap.get(HeaderDefaults.RCV_SVC_ID)); + return header; + } + public static CommonHeader createRequestHeader(String itrfId, String rcvSvcId) { + CommonHeader header = new CommonHeader(); + header.setItrfId(itrfId); + header.setRcvSvcId(rcvSvcId); + return header; + } +} diff --git a/dap-tool-payment/src/main/resources/static/index.html b/dap-tool-payment/src/main/resources/static/index.html new file mode 100644 index 0000000..b8b20ae --- /dev/null +++ b/dap-tool-payment/src/main/resources/static/index.html @@ -0,0 +1,43 @@ + + + + + + Payment Tool + + + +
+

💳 Payment Tool

+

Axhub Payment Module is successfully running!

+
+ +