From c0567ec1c2be4a2d78d0523ab46184562d847b64 Mon Sep 17 00:00:00 2001 From: jade Date: Sun, 9 Aug 2026 17:13:54 +0900 Subject: [PATCH] fix: generate schema based tool request DTOs --- .../dap/lib/util/ToolScaffolder.java | 29 +++++++++++++++---- .../dap/lib/util/ToolScaffolderTest.java | 22 ++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) 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 0fe6757e..c318202f 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 @@ -1,7 +1,6 @@ package io.shinhanlife.dap.lib.util; -import org.springaicommunity.mcp.annotation.McpToolParam; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -179,6 +178,13 @@ public class ToolScaffolder { private String message; } """.formatted(bizPackage, bizPackage, baseName, author, createDate, createDate, author, baseName); + reqContent = reqContent + .replace("import com.fasterxml.jackson.annotation.JsonInclude;", + "import com.fasterxml.jackson.annotation.JsonInclude;\nimport io.swagger.v3.oas.annotations.media.Schema;") + .replaceAll("(?m)^\\s*@McpToolParam\\([^\\r\\n]*\\)\\R", "") + .replaceAll("(?m)^\\s*-\\(\\?:[^\\r\\n]*\\R", "") + .replace("private String phoneNumber;", "@Schema(example = \"01012345678\")\n private String phoneNumber;") + .replace("private String message;", "@Schema(example = \"테스트 메시지입니다.\")\n private String message;"); Files.writeString(dtoDir.resolve(baseName + "Request.java"), reqContent); // Generate Response DTO @@ -308,7 +314,7 @@ public class ToolScaffolder { private final %sConverter converter; @Override - public Object execute(%sRequest req) { + public %sResponse execute(%sRequest req) { log.info("[MCI Tool] {} 요청 수신.", "%s"); try { // MapStruct를 이용한 자동 매핑 (AI DTO -> MCI DTO) @@ -320,10 +326,18 @@ public class ToolScaffolder { mciReq, Object.class ); - return resTransfer.getBody() != null ? resTransfer.getBody() : Map.of("status", "SUCCESS"); + %sResponse response = new %sResponse(); + response.setResultCode("SUCCESS"); + response.setResultMessage(resTransfer.getBody() != null + ? "MCI call completed." + : "MCI call completed without a response body."); + return response; } catch (Exception e) { log.error("[MCI Tool] 연동 중 오류 발생: {}", e.getMessage(), e); - return Map.of("status", "ERROR", "message", e.getMessage() != null ? e.getMessage() : "Unknown error"); + %sResponse response = new %sResponse(); + response.setResultCode("ERROR"); + response.setResultMessage(e.getMessage() != null ? e.getMessage() : "Unknown error"); + return response; } } } @@ -345,9 +359,14 @@ public class ToolScaffolder { (clientPrefixCap.isEmpty() ? "private final AxhubMciComponent mci;" : "private final Mci" + clientPrefixCap + "Client mci;"), baseName, baseName, + baseName, toolName, interfaceId, - interfaceId + interfaceId, + baseName, + baseName, + baseName, + baseName ); } else { serviceImplContent = """ 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 82918a50..39ac1fd0 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,5 +1,6 @@ package io.shinhanlife.dap.lib.util; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.nio.file.Files; @@ -56,4 +57,25 @@ class ToolScaffolderTest { assertTrue(Files.exists(schemas.resolve("claim-search-resource-input-schema.json"))); assertTrue(Files.exists(schemas.resolve("claim-search-resource-output-schema.json"))); } + + @Test + void generatesRequestDtoWithSwaggerSchemaInsteadOfMcpToolParam() throws Exception { + String moduleName = root.resolve("dap-was-pay").toString(); + + ToolScaffolder.scaffold("search hr", "SHEARCH_01", "HR 조회", "pay", "MCI", moduleName, + "tester", "2026.08.09", true, "DFAG"); + + Path requestPath = root.resolve("dap-was-pay/src/main/java/io/shinhanlife/dap/mcc/biz/pay/dto/SearchHrRequest.java"); + String request = Files.readString(requestPath); + + assertTrue(request.contains("import io.swagger.v3.oas.annotations.media.Schema;")); + assertTrue(request.contains("@Schema(example = \"01012345678\")")); + assertTrue(request.contains("@Schema(example = \"테스트 메시지입니다.\")")); + assertFalse(request.contains("McpToolParam")); + + Path implementationPath = root.resolve("dap-was-pay/src/main/java/io/shinhanlife/dap/mcc/biz/pay/usecase/impl/SearchHrUseCaseImpl.java"); + String implementation = Files.readString(implementationPath); + assertTrue(implementation.contains("public SearchHrResponse execute(SearchHrRequest req)")); + assertTrue(implementation.contains("response.setResultCode(\"SUCCESS\")")); + } }