diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServer.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServer.java
new file mode 100644
index 00000000..a5634cb8
--- /dev/null
+++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServer.java
@@ -0,0 +1,61 @@
+package io.shinhanlife.dap.lib.adapter.test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.Map;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Local HTTP mock server for scaffolded HTTP Tools.
+ *
+ *
Each Tool Pod returns the JSON generated under
+ * {@code src/main/resources/mock-responses/{toolName}.json}. It is enabled only
+ * when {@code axhub.mock.http.enabled=true}, which the HTTP Scaffold adds to local configuration.
+ */
+@Slf4j
+@RestController
+@RequiredArgsConstructor
+@ConditionalOnProperty(prefix = "axhub.mock.http", name = "enabled", havingValue = "true")
+@RequestMapping("/api")
+public class MockEimsHttpServer {
+
+ private final ObjectMapper objectMapper;
+
+ @PostMapping("/mock/http/{toolName:[a-z0-9_-]+}")
+ public ResponseEntity mockToolHttpResponse(
+ @PathVariable String toolName,
+ @RequestBody(required = false) JsonNode request) {
+ ClassPathResource resource = new ClassPathResource("mock-responses/" + toolName + ".json");
+ if (!resource.exists()) {
+ return ResponseEntity.notFound().build();
+ }
+ try {
+ log.info("[MockEimsHttpServer] HTTP mock request. toolName={}, body={}", toolName, request);
+ return ResponseEntity.ok(objectMapper.readTree(resource.getInputStream()));
+ } catch (Exception e) {
+ log.warn("[MockEimsHttpServer] Unable to read mock response. toolName={}", toolName, e);
+ return ResponseEntity.internalServerError().build();
+ }
+ }
+
+ @PostMapping("/gateway")
+ public ResponseEntity> mockEimsReceiver(
+ @RequestHeader(value = "X-Trace-Id", required = false) String traceId,
+ @RequestBody Map request) {
+ String interfaceId = String.valueOf(request.getOrDefault("interfaceId", ""));
+ log.info("[MockEimsHttpServer] Legacy gateway mock request. traceId={}, interfaceId={}", traceId, interfaceId);
+ return ResponseEntity.ok(Map.of(
+ "status", "404",
+ "message", "MOCK data is not defined for interfaceId: " + interfaceId));
+ }
+}
diff --git a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java
index d698c5a6..43015e23 100644
--- a/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java
+++ b/dap-was-lib/src/main/java/io/shinhanlife/dap/lib/util/ToolScaffolder.java
@@ -853,12 +853,17 @@ public class ToolScaffolder {
Path projectRoot = moduleRoot.getParent();
Path wireMockBodyPath = projectRoot.resolve(Paths.get("mci-mock", "__files", toolName + ".json"));
Path wireMockMappingPath = projectRoot.resolve(Paths.get("mci-mock", "mappings", toolName + ".json"));
+ Path podMockResponsePath = moduleRoot.resolve(Paths.get("src/main/resources/mock-responses", toolName + ".json"));
Files.createDirectories(wireMockBodyPath.getParent());
Files.createDirectories(wireMockMappingPath.getParent());
+ Files.createDirectories(podMockResponsePath.getParent());
Files.writeString(wireMockBodyPath, mockResponse);
Files.writeString(wireMockMappingPath, wireMockMappingContent(interfaceId, wireMockBodyPath.getFileName().toString()));
+ Files.writeString(podMockResponsePath, mockResponse);
+ ensureLocalHttpApiConfiguration(moduleRoot, httpApiName, toolName);
log.append("[WireMock Response] ").append(wireMockBodyPath).append("\n");
log.append("[WireMock Mapping] ").append(wireMockMappingPath).append("\n");
+ log.append("[Pod Mock Response] ").append(podMockResponsePath).append("\n");
} else {
Path mockResponsePath = rootDir.resolve(Paths.get(moduleName, "src/main/resources/mock-responses", toolName + ".json"));
Files.createDirectories(mockResponsePath.getParent());
@@ -884,6 +889,36 @@ public class ToolScaffolder {
.toLowerCase(Locale.ROOT);
}
+ private static void ensureLocalHttpApiConfiguration(Path moduleRoot, String httpApiName, String toolName) throws IOException {
+ Path localConfigPath = moduleRoot.resolve("src/main/resources/application-local.yml");
+ Files.createDirectories(localConfigPath.getParent());
+ String existing = Files.exists(localConfigPath) ? Files.readString(localConfigPath) : "";
+ if (java.util.regex.Pattern.compile("(?m)^\\s*-\\s+name:\\s*"
+ + java.util.regex.Pattern.quote(httpApiName) + "\\s*$").matcher(existing).find()) {
+ return;
+ }
+ String environmentKey = toPackageSegment(httpApiName).toUpperCase(Locale.ROOT).replace('-', '_');
+ String config = """
+
+ axhub:
+ mock:
+ http:
+ enabled: true
+
+ glow:
+ communication:
+ http:
+ api-list:
+ - name: %s
+ domain: ${AXHUB_%s_HTTP_DOMAIN:http://localhost:${server.port}}
+ url: ${AXHUB_%s_HTTP_URL:/api/mock/http/%s}
+ method: POST
+ content-type: application/json;charset=UTF-8
+ biz-pod: false
+ """.formatted(httpApiName, environmentKey, environmentKey, toolName);
+ Files.writeString(localConfigPath, existing + config);
+ }
+
private static String dtoContent(String packageName, String className, List fields,
String author, String createDate, boolean request) {
String body = fieldLines(fields, request ? Set.of() : Set.of("resultCode", "resultMessage"));
@@ -999,21 +1034,24 @@ public class ToolScaffolder {
import %s.dto.%sRequest;
import %s.dto.%sResponse;
- import %s.%s.io.%sHttpRequest;
- import %s.%s.io.%sHttpResponse;
+ import %s.io.%sHttpRequest;
+ import %s.io.%sHttpResponse;
import org.mapstruct.Mapper;
+ import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface %sConverter {
+ // Field names differ? Add mappings like this before the method.
+ // @Mapping(source = "sourceField", target = "targetField")
%sHttpRequest toHttpRequest(%sRequest request);
%sResponse toResponse(%sHttpResponse httpResponse);
}
""".formatted(bizPackage,
bizPackage, baseName,
bizPackage, baseName,
- BASE_PACKAGE, httpPackage, baseName,
- BASE_PACKAGE, httpPackage, baseName,
+ httpPackage, baseName,
+ httpPackage, baseName,
baseName, baseName, baseName, baseName, baseName);
}
@@ -1032,9 +1070,13 @@ public class ToolScaffolder {
import %s.%s.io.%s_I;
import %s.%s.io.%s_O;
import org.mapstruct.Mapper;
+ import org.mapstruct.Mapping;
+ import org.mapstruct.ReportingPolicy;
- @Mapper(componentModel = "spring")
+ @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface %sConverter {
+ // Field names differ? Add mappings like this before the method.
+ // @Mapping(source = "sourceField", target = "targetField")
%s_I toLegacyRequest(%sRequest request);
%sRequest toRequest(%s_I mciRequest);
%sResponse toResponse(%s_O mciRes);
@@ -1053,10 +1095,13 @@ public class ToolScaffolder {
import %s.legacy.%sLegacyRequest;
import %s.legacy.%sLegacyResponse;
import org.mapstruct.Mapper;
+ import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface %sConverter {
+ // Field names differ? Add mappings like this before the method.
+ // @Mapping(source = "sourceField", target = "targetField")
%sLegacyRequest toLegacyRequest(%sRequest request);
%sRequest toRequest(%sLegacyRequest legacyRequest);
%sResponse toResponse(%sLegacyResponse legacyResponse);
diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServerTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServerTest.java
new file mode 100644
index 00000000..773659d4
--- /dev/null
+++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/adapter/test/MockEimsHttpServerTest.java
@@ -0,0 +1,19 @@
+package io.shinhanlife.dap.lib.adapter.test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class MockEimsHttpServerTest {
+
+ @Test
+ void returnsTheScaffoldGeneratedJsonResponse() {
+ MockEimsHttpServer server = new MockEimsHttpServer(new ObjectMapper());
+
+ var response = server.mockToolHttpResponse("cmm_memo_retriever", null);
+
+ assertThat(response.getStatusCode().is2xxSuccessful()).isTrue();
+ assertThat(response.getBody().path("resultCode").asText()).isEqualTo("SUCCESS");
+ }
+}
diff --git a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java
index 8cd3b178..69452da9 100644
--- a/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java
+++ b/dap-was-lib/src/test/java/io/shinhanlife/dap/lib/util/ToolScaffolderTest.java
@@ -1,6 +1,7 @@
package io.shinhanlife.dap.lib.util;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.nio.file.Files;
@@ -166,6 +167,8 @@ class ToolScaffolderTest {
String httpClient = Files.readString(root.resolve("dap-was-http/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/sample/SampleClient.java"));
assertFalse(converter.contains("phoneNumber"), converter);
assertTrue(converter.contains("infra.itrf.http.sample.io.EmployeeSearchHttpRequest"), converter);
+ assertFalse(converter.contains("io.shinhanlife.dap.mcc.io.shinhanlife.dap.mcc"), converter);
+ assertTrue(converter.contains("// @Mapping(source = \"sourceField\", target = \"targetField\")"), converter);
assertTrue(httpRequest.contains("private String employeeId;"), httpRequest);
assertTrue(httpResponse.contains("private String employeeName;"), httpResponse);
assertTrue(httpClient.contains("http.call(API_NAME, request, responseType)"), httpClient);
@@ -182,6 +185,19 @@ class ToolScaffolderTest {
assertTrue(Files.exists(wireMockResponse), wireMockResponse.toString());
assertTrue(Files.exists(wireMockMapping), wireMockMapping.toString());
assertTrue(Files.readString(wireMockMapping).contains("\"urlPath\" : \"/HR_EMPLOYEE_SEARCH\""));
+ Path localConfig = root.resolve("dap-was-http/src/main/resources/application-local.yml");
+ assertTrue(Files.exists(localConfig), localConfig.toString());
+ assertTrue(Files.readString(localConfig).contains("name: sample"));
+ assertTrue(Files.readString(localConfig).contains("url: ${AXHUB_SAMPLE_HTTP_URL:/api/mock/http/smp_employee_search}"));
+ Path podMockResponse = root.resolve("dap-was-http/src/main/resources/mock-responses/smp_employee_search.json");
+ assertTrue(Files.exists(podMockResponse), podMockResponse.toString());
+
+ ToolScaffolder.scaffold("employee search", "HR_EMPLOYEE_SEARCH", "Employee search", "smp", "HTTP", moduleName,
+ "tester", "2026.08.11", false, null, null, null, inputFields, outputFields);
+ long apiNameCount = Files.readAllLines(localConfig).stream()
+ .filter(line -> line.trim().equals("- name: sample"))
+ .count();
+ assertEquals(1, apiNameCount);
}
@Test
void generatesSeparateToolTitleAndDescription() throws Exception {
diff --git a/dap-was-lib/src/test/resources/mock-responses/cmm_memo_retriever.json b/dap-was-lib/src/test/resources/mock-responses/cmm_memo_retriever.json
new file mode 100644
index 00000000..a949502b
--- /dev/null
+++ b/dap-was-lib/src/test/resources/mock-responses/cmm_memo_retriever.json
@@ -0,0 +1,3 @@
+{
+ "resultCode": "SUCCESS"
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/converter/MemoListRetrieverConverter.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/converter/MemoListRetrieverConverter.java
new file mode 100644
index 00000000..ba759323
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/converter/MemoListRetrieverConverter.java
@@ -0,0 +1,17 @@
+package io.shinhanlife.dap.mcc.biz.cmm.converter;
+
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
+import io.shinhanlife.dap.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpRequest;
+import io.shinhanlife.dap.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpResponse;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface MemoListRetrieverConverter {
+ // Field names differ? Add mappings like this before the method.
+ // @Mapping(source = "sourceField", target = "targetField")
+ MemoListRetrieverHttpRequest toHttpRequest(MemoListRetrieverRequest request);
+ MemoListRetrieverResponse toResponse(MemoListRetrieverHttpResponse httpResponse);
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverRequest.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverRequest.java
new file mode 100644
index 00000000..9cc7c4d3
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverRequest.java
@@ -0,0 +1,16 @@
+package io.shinhanlife.dap.mcc.biz.cmm.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MemoListRetrieverRequest {
+ @Schema(description = "조회할 의뢰서 상태", example = "OPEN", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String memoStatus;
+
+ @Schema(description = "검색 키워드", example = "프로젝트", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String searchKeyword;
+
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverResponse.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverResponse.java
new file mode 100644
index 00000000..79f704d8
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/dto/MemoListRetrieverResponse.java
@@ -0,0 +1,13 @@
+package io.shinhanlife.dap.mcc.biz.cmm.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MemoListRetrieverResponse {
+ private String resultCode;
+
+ private String resultMessage;
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java
new file mode 100644
index 00000000..13cb3645
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCase.java
@@ -0,0 +1,27 @@
+package io.shinhanlife.dap.mcc.biz.cmm.usecase;
+
+import org.springaicommunity.mcp.annotation.McpTool;
+import io.shinhanlife.dap.lib.annotation.ToolHint;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
+
+/**
+ * @package io.shinhanlife.dap.mcc.biz.cmm.usecase
+ * @className MemoListRetrieverUseCase
+ * @description AX HUB ?쒖뒪??泥섎━ ?대옒??
+ * @author Admin
+ * @create 2026.08.11
+ *
+ * ---------- 媛쒖젙?대젰 ----------
+ * ?섏젙?? ?섏젙?? ?섏젙?댁슜
+ * ---------- -------- ---------------------------
+ * 2026.08.11 Admin 理쒖큹?앹꽦
+ *
+ *
+ */
+public interface MemoListRetrieverUseCase {
+
+ @McpTool(name = "cmm_memo_retriever", title = "의뢰서 목록 조회", description = "의뢰서 목록을 조회하여 의뢰 정보를 반환합니다.")
+ @ToolHint(register = false, categoryKey = "cmm", mappingId = "MEMO0000001")
+ MemoListRetrieverResponse execute(MemoListRetrieverRequest req);
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/impl/MemoListRetrieverUseCaseImpl.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/impl/MemoListRetrieverUseCaseImpl.java
new file mode 100644
index 00000000..474832e5
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/impl/MemoListRetrieverUseCaseImpl.java
@@ -0,0 +1,30 @@
+package io.shinhanlife.dap.mcc.biz.cmm.usecase.impl;
+
+import io.shinhanlife.dap.mcc.biz.cmm.converter.MemoListRetrieverConverter;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
+import io.shinhanlife.dap.mcc.infra.itrf.http.memo.MemoClient;
+import io.shinhanlife.dap.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpRequest;
+import io.shinhanlife.dap.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpResponse;
+import io.shinhanlife.dap.mcc.biz.cmm.usecase.MemoListRetrieverUseCase;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class MemoListRetrieverUseCaseImpl implements MemoListRetrieverUseCase {
+
+ private final MemoListRetrieverConverter converter;
+ private final MemoClient memoClient;
+
+ @Override
+ public MemoListRetrieverResponse execute(MemoListRetrieverRequest req) {
+ MemoListRetrieverHttpRequest httpRequest = converter.toHttpRequest(req);
+ MemoListRetrieverHttpResponse httpResponse = memoClient.call(httpRequest, MemoListRetrieverHttpResponse.class);
+
+ MemoListRetrieverResponse response = converter.toResponse(httpResponse);
+ response.setResultCode("SUCCESS");
+ response.setResultMessage("HTTP API call completed.");
+ return response;
+ }
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/MemoClient.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/MemoClient.java
new file mode 100644
index 00000000..53026602
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/MemoClient.java
@@ -0,0 +1,17 @@
+package io.shinhanlife.dap.mcc.infra.itrf.http.memo;
+
+import io.shinhanlife.dap.lib.integration.http.component.AxhubHttpComponent;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class MemoClient {
+ private static final String API_NAME = "memo";
+
+ private final AxhubHttpComponent http;
+
+ public O call(I request, Class responseType) {
+ return http.call(API_NAME, request, responseType);
+ }
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpRequest.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpRequest.java
new file mode 100644
index 00000000..0a90902c
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpRequest.java
@@ -0,0 +1,16 @@
+package io.shinhanlife.dap.mcc.infra.itrf.http.memo.io;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MemoListRetrieverHttpRequest {
+ @Schema(description = "조회할 의뢰서 상태", example = "OPEN", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String memoStatus;
+
+ @Schema(description = "검색 키워드", example = "프로젝트", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String searchKeyword;
+
+}
diff --git a/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpResponse.java b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpResponse.java
new file mode 100644
index 00000000..191aeea2
--- /dev/null
+++ b/dap-was-sms/src/main/java/io/shinhanlife/dap/mcc/infra/itrf/http/memo/io/MemoListRetrieverHttpResponse.java
@@ -0,0 +1,13 @@
+package io.shinhanlife.dap.mcc.infra.itrf.http.memo.io;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MemoListRetrieverHttpResponse {
+ private String resultCode;
+
+ private String resultMessage;
+}
diff --git a/dap-was-sms/src/main/resources/application-local.yml b/dap-was-sms/src/main/resources/application-local.yml
index d4add358..c325e571 100644
--- a/dap-was-sms/src/main/resources/application-local.yml
+++ b/dap-was-sms/src/main/resources/application-local.yml
@@ -26,3 +26,17 @@ axhub:
url: http://localhost:8081
tool:
url: ${AXHUB_TOOL_URL:http://localhost:${server.port}}
+ mock:
+ http:
+ enabled: true
+
+glow:
+ communication:
+ http:
+ api-list:
+ - name: memo
+ domain: ${AXHUB_MEMO_HTTP_DOMAIN:http://localhost:${server.port}}
+ url: ${AXHUB_MEMO_HTTP_URL:/api/mock/http/cmm_memo_retriever}
+ method: POST
+ content-type: application/json;charset=UTF-8
+ biz-pod: false
diff --git a/dap-was-sms/src/main/resources/mock-responses/cmm_memo_retriever.json b/dap-was-sms/src/main/resources/mock-responses/cmm_memo_retriever.json
new file mode 100644
index 00000000..a949502b
--- /dev/null
+++ b/dap-was-sms/src/main/resources/mock-responses/cmm_memo_retriever.json
@@ -0,0 +1,3 @@
+{
+ "resultCode": "SUCCESS"
+}
diff --git a/dap-was-sms/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCaseTest.java b/dap-was-sms/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCaseTest.java
new file mode 100644
index 00000000..61d6f7f4
--- /dev/null
+++ b/dap-was-sms/src/test/java/io/shinhanlife/dap/mcc/biz/cmm/usecase/MemoListRetrieverUseCaseTest.java
@@ -0,0 +1,16 @@
+package io.shinhanlife.dap.mcc.biz.cmm.usecase;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverRequest;
+import io.shinhanlife.dap.mcc.biz.cmm.dto.MemoListRetrieverResponse;
+import org.junit.jupiter.api.Test;
+
+class MemoListRetrieverUseCaseTest {
+
+ @Test
+ void createsToolRequestAndResponseDtos() {
+ assertNotNull(new MemoListRetrieverRequest());
+ assertNotNull(new MemoListRetrieverResponse());
+ }
+}
diff --git a/mci-mock/__files/cmm_memo_retriever.json b/mci-mock/__files/cmm_memo_retriever.json
new file mode 100644
index 00000000..9f9a02a5
--- /dev/null
+++ b/mci-mock/__files/cmm_memo_retriever.json
@@ -0,0 +1,3 @@
+{
+ "resultCode" : "SUCCESS"
+}
diff --git a/mci-mock/mappings/cmm_memo_retriever.json b/mci-mock/mappings/cmm_memo_retriever.json
new file mode 100644
index 00000000..d592009c
--- /dev/null
+++ b/mci-mock/mappings/cmm_memo_retriever.json
@@ -0,0 +1,13 @@
+{
+ "request" : {
+ "method" : "POST",
+ "urlPath" : "/MEMO0000001"
+ },
+ "response" : {
+ "status" : 200,
+ "headers" : {
+ "Content-Type" : "application/json;charset=UTF-8"
+ },
+ "bodyFileName" : "cmm_memo_retriever.json"
+ }
+}