feat: Add AxhubEaiComponent and MCI/EAI mock frameworks
Some checks failed
Deploy to OCIWP / deploy (push) Failing after 3m26s

This commit is contained in:
jade
2026-07-23 09:19:09 +09:00
parent 74b50482bf
commit 323d227eee
10 changed files with 341 additions and 10 deletions

View File

@@ -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 <O> Transfer<O> syncEai(Transfer<Object> request) {
// LOG 저장 (AXHUB 방식 로깅)
CommonHeader reqHeader = (CommonHeader) request.getHeader();
log.info("[AxhubEaiComponent] {} EAI 호출시작 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId());
Transfer<O> response = (Transfer<O>) eai.sync(request);
log.info("[AxhubEaiComponent] {} EAI 호출종료 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId());
return response;
}
/**
* EAI 호출
*/
public <O, I> Transfer<O> call(String itrfId, String rcvSvcId, I inputDto) throws Exception {
CommonHeader header = CommonHeaderFactory.createRequestHeader(itrfId, rcvSvcId);
Transfer<Object> request = Transfer.builder()
.header(header)
.body(inputDto)
.build();
return syncEai(request);
}
/**
* EAI 호출 (응답 타입 명시)
*/
@SuppressWarnings("unchecked")
public <O, I> Transfer<O> call(String itrfId, String rcvSvcId, I inputDto, Class<O> resBodyClass) throws Exception {
CommonHeader header = CommonHeaderFactory.createRequestHeader(itrfId, rcvSvcId);
Transfer<Object> request = Transfer.builder()
.header(header)
.body(inputDto)
.resBodyClass((Class<Object>) (Class<?>) resBodyClass)
.build();
return syncEai(request);
}
/**
* EAI 호출 (rcvSvcId 없는 경우)
*/
public <O, I> Transfer<O> call(String itrfId, I inputDTO, Class<O> 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 <O, I> Transfer<O> call(String itrfId, I inputDTO) throws Exception {
String className = inputDTO.getClass().getSimpleName();
String rcvSvcId = className.replace("_I", "");
return call(itrfId, rcvSvcId, inputDTO);
}
}

View File

@@ -1,13 +1,22 @@
package io.shinhanlife.dap.common.integration.mci.component; 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.dto.Transfer;
import io.shinhanlife.glow.communication.module.mci.component.GlowMciComponent; import io.shinhanlife.glow.communication.module.mci.component.GlowMciComponent;
import io.shinhanlife.glow.communication.util.CommonHeaderFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/** /**
* 신한라이프 내부 Glow 표준 컴포넌트 어댑터 * 신한라이프 내부 Glow 표준 컴포넌트 어댑터 (AXHUB)
*/ */
@Slf4j @Slf4j
@Component @Component
@@ -16,14 +25,93 @@ public class AxhubMciComponent {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private final GlowMciComponent mci; 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<HeaderDefaults, String>
*/
private Map<HeaderDefaults, String> createCommonHeaderMap(String itrfName, String rcvSvcId) {
SessionDto sessionDto = SessionUtil.getSession();
Map<HeaderDefaults, String> 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") @SuppressWarnings("unchecked")
public <O, I> Transfer<O> callTo(String itrfName, String rcvSvcId, I inputDto, Class<O> resBodyClass) { private <O> Transfer<O> syncMci(Transfer<Object> request) {
log.info("[AxhubMciComponent] MCI 호출 준비 - 인터페이스: {}, 수신서비스: {}", itrfName, rcvSvcId); // LOG 저장 (AXHUB 방식 로깅)
CommonHeader reqHeader = (CommonHeader) request.getHeader();
// Header 세팅 로직 생략 (Mock) log.info("[AxhubMciComponent] {} MCI 호출시작 (수신서비스: {})", reqHeader.getItrfId(), reqHeader.getRcvSvcId());
Transfer<O> response = (Transfer<O>) 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 <O, I> Transfer<O> callTo(String itrfName, String rcvSvcId, I inputDto) throws Exception {
Map<HeaderDefaults, String> commonHeaderMap = createCommonHeaderMap(itrfName, rcvSvcId);
CommonHeader header = CommonHeaderFactory.createRequestHeader(commonHeaderMap);
Transfer<Object> request = Transfer.builder() Transfer<Object> 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 <O> resBodyClass 제너릭
* @param <I> inputDto 제너릭
*/
@SuppressWarnings("unchecked")
public <O, I> Transfer<O> callTo(String itrfName, String rcvSvcId, I inputDto, Class<O> resBodyClass) throws Exception {
Map<HeaderDefaults, String> commonHeaderMap = createCommonHeaderMap(itrfName, rcvSvcId);
CommonHeader header = CommonHeaderFactory.createRequestHeader(commonHeaderMap);
Transfer<Object> request = Transfer.builder()
.header(header)
.body(inputDto) .body(inputDto)
.resBodyClass((Class<Object>) (Class<?>) resBodyClass) .resBodyClass((Class<Object>) (Class<?>) resBodyClass)
.build(); .build();
@@ -31,9 +119,34 @@ public class AxhubMciComponent {
return syncMci(request); return syncMci(request);
} }
@SuppressWarnings("unchecked") /**
private <O> Transfer<O> syncMci(Transfer<Object> request) { * 대내 mci 호출 (rcvSvcId 없는 경우)
log.info("[AxhubMciComponent] GlowMciComponent.sync() 호출"); * @param itrfName 인터페이스Id
return (Transfer<O>) mci.sync(request); * @param inputDTO 수신서비스Id (클래스명 대체)
* @param resBodyClass resBodyClass
* @return Transfer
* @param <O> resBodyClass 제너릭
* @param <I> inputDto 제너릭
* @throws Exception Exception
*/
public <O, I> Transfer<O> callTo(String itrfName, I inputDTO, Class<O> 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 <O> resBodyClass 제너릭
* @param <I> inputDto 제너릭
* @throws Exception Exception
*/
public <O, I> Transfer<O> callTo(String itrfName, I inputDTO) throws Exception {
String className = inputDTO.getClass().getSimpleName();
String rcvSvcId = className.replace("_I", "");
return callTo(itrfName, rcvSvcId, inputDTO);
} }
} }

View File

@@ -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;
}

View File

@@ -58,6 +58,17 @@ public class SessionDto {
private List<String> roleNmList; private List<String> roleNmList;
private List<String> tgtrPrafNoList; private List<String> tgtrPrafNoList;
private List<String> tgtrOgnzNoList; private List<String> 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;
// 유틸성 // 유틸성

View File

@@ -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;
}

View File

@@ -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
}

View File

@@ -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);
}
}

View File

@@ -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<I, O> {
public Transfer<O> sync(Transfer<I> request) {
// Mock 구현
Transfer<O> response = new Transfer<>();
response.setHeader(request.getHeader());
response.setResBodyClass((Class<O>) request.getResBodyClass());
return response;
}
public <S, R> Transfer<R> call(Transfer<S> request, Class<R> resBody) {
Transfer<R> response = new Transfer<>();
response.setHeader(request.getHeader());
response.setResBodyClass(resBody);
return response;
}
}

View File

@@ -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<HeaderDefaults, String> 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;
}
}

View File

@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Payment Tool</title>
<style>
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
font-family: 'Inter', 'Apple SD Gothic Neo', sans-serif;
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: #fff;
}
.container {
text-align: center;
background: rgba(255, 255, 255, 0.1);
padding: 3rem;
border-radius: 15px;
backdrop-filter: blur(10px);
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
}
h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
p {
font-size: 1.2rem;
opacity: 0.9;
}
</style>
</head>
<body>
<div class="container">
<h1>💳 Payment Tool</h1>
<p>Axhub Payment Module is successfully running!</p>
</div>
</body>
</html>