From f590490d96a73f0ac0a52632a0fa166b731e1fb6 Mon Sep 17 00:00:00 2001 From: jade Date: Thu, 9 Jul 2026 09:57:56 +0900 Subject: [PATCH] feat(core): add MciTemplate to simplify MCI communication boilerplate --- .../exception/MciCommunicationException.java | 26 +++++++ .../biz/mcp/adapter/support/MciTemplate.java | 67 +++++++++++++++++++ .../sample/service/SampleMciCallService.java | 35 ++-------- 3 files changed, 98 insertions(+), 30 deletions(-) create mode 100644 axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/exception/MciCommunicationException.java create mode 100644 axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/MciTemplate.java diff --git a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/exception/MciCommunicationException.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/exception/MciCommunicationException.java new file mode 100644 index 0000000..d058fb3 --- /dev/null +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/exception/MciCommunicationException.java @@ -0,0 +1,26 @@ +package io.shinhanlife.axhub.biz.mcp.adapter.exception; + +/** + * @package io.shinhanlife.axhub.biz.mcp.adapter.exception + * @className MciCommunicationException + * @description AX HUB 시스템 처리 클래스 + * @author 김형식 + * @create 2026.09.01 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.09.01  김형식    최초생성
+ * 
+ * 
+ */ +public class MciCommunicationException extends RuntimeException { + + public MciCommunicationException(String message) { + super(message); + } + + public MciCommunicationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/MciTemplate.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/MciTemplate.java new file mode 100644 index 0000000..8e3bb60 --- /dev/null +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/MciTemplate.java @@ -0,0 +1,67 @@ +package io.shinhanlife.axhub.biz.mcp.adapter.support; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.shinhanlife.axhub.biz.mcp.adapter.exception.MciCommunicationException; +import io.shinhanlife.axhub.biz.mcp.adapter.sender.EimsSender; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @package io.shinhanlife.axhub.biz.mcp.adapter.support + * @className MciTemplate + * @description AX HUB 시스템 처리 클래스 + * @author 김형식 + * @create 2026.09.01 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.09.01  김형식    최초생성
+ * 
+ * 
+ */ +@Slf4j +@Component +@RequiredArgsConstructor +public class MciTemplate { + + private final EimsSender eimsSender; + private final ObjectMapper objectMapper; + + /** + * MCI 인터페이스를 호출하고 결과를 지정된 타입으로 반환합니다. + * + * @param interfaceId 호출할 MCI 인터페이스 ID + * @param requestDto 요청 데이터 객체 + * @param responseType 응답을 매핑할 클래스 타입 + * @param 요청 객체 타입 + * @param 응답 객체 타입 + * @return 매핑된 응답 객체 + * @throws MciCommunicationException 통신 또는 파싱 실패 시 예외 발생 + */ + public R call(String interfaceId, T requestDto, Class responseType) { + log.info("📞 [MciTemplate] 시작 - Interface ID: {}", interfaceId); + + try { + String payload = objectMapper.writeValueAsString(requestDto); + log.debug("📤 [MciTemplate] 전송 페이로드: {}", payload); + + String responseJson = eimsSender.send(interfaceId, payload); + log.debug("📥 [MciTemplate] 수신 응답 JSON: {}", responseJson); + + R response = objectMapper.readValue(responseJson, responseType); + log.info("✅ [MciTemplate] 완료 - Interface ID: {}", interfaceId); + + return response; + + } catch (JsonProcessingException e) { + log.error("❌ [MciTemplate] JSON 변환 중 오류 발생", e); + throw new MciCommunicationException("MCI 통신 중 JSON 파싱 오류", e); + } catch (Exception e) { + log.error("❌ [MciTemplate] 통신 중 오류 발생", e); + throw new MciCommunicationException("MCI 통신 실패", e); + } + } +} diff --git a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/sample/service/SampleMciCallService.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/sample/service/SampleMciCallService.java index 0128694..c546d80 100644 --- a/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/sample/service/SampleMciCallService.java +++ b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/sample/service/SampleMciCallService.java @@ -1,8 +1,6 @@ package io.shinhanlife.axhub.biz.mcp.sample.service; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.axhub.biz.mcp.adapter.sender.EimsSender; +import io.shinhanlife.axhub.biz.mcp.adapter.support.MciTemplate; import io.shinhanlife.axhub.biz.mcp.sample.dto.SampleMciReqDto; import io.shinhanlife.axhub.biz.mcp.sample.dto.SampleMciResDto; import lombok.RequiredArgsConstructor; @@ -28,39 +26,16 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class SampleMciCallService { - private final EimsSender eimsSender; - private final ObjectMapper objectMapper; + private final MciTemplate mciTemplate; /** - * MCI 인터페이스를 호출하는 샘플 메서드 + * MCI 인터페이스를 호출하는 샘플 메서드 (MciTemplate 시범 적용) * * @param request MCI 호출을 위한 요청 데이터 * @return MCI 서버의 응답 데이터 */ public SampleMciResDto callSampleMci(SampleMciReqDto request) { - log.info("📞 [MciCall] 시작 - Interface ID: {}", request.getInterfaceId()); - - try { - // 1. 요청 객체(DTO)를 JSON 문자열로 변환 (직렬화) - String payload = objectMapper.writeValueAsString(request); - log.debug("📤 [MciCall] 전송 페이로드: {}", payload); - - // 2. HTTP/2 기반의 EimsSender를 통해 실제 MCI 호출 - String responseJson = eimsSender.send(request.getInterfaceId(), payload); - log.debug("📥 [MciCall] 수신 응답 JSON: {}", responseJson); - - // 3. 수신받은 JSON 문자열을 응답 객체(DTO)로 역직렬화 후 반환 - SampleMciResDto response = objectMapper.readValue(responseJson, SampleMciResDto.class); - log.info("✅ [MciCall] 완료 - 응답 코드: {}", response.getResCode()); - - return response; - - } catch (JsonProcessingException e) { - log.error("❌ [MciCall] JSON 변환 중 오류 발생", e); - throw new RuntimeException("MCI 통신 중 JSON 파싱 오류", e); - } catch (Exception e) { - log.error("❌ [MciCall] 통신 중 오류 발생", e); - throw new RuntimeException("MCI 통신 실패", e); - } + // 기존 20줄 이상의 통신 로직이 단 1줄로 완벽하게 은닉화 되었습니다. + return mciTemplate.call(request.getInterfaceId(), request, SampleMciResDto.class); } } \ No newline at end of file