From 8b9bd4de16402db1af8d3976ffcf8764dcddb7fd Mon Sep 17 00:00:00 2001 From: jade Date: Mon, 31 Aug 2026 10:12:31 +0900 Subject: [PATCH] refactor: remove retryEnabled from tool metadata --- .../java/io/shinhanlife/dat/lib/annotation/GrowToolHint.java | 1 - .../io/shinhanlife/dat/lib/manifest/ToolManifestMeta.java | 1 - .../io/shinhanlife/dat/lib/manifest/ToolManifestService.java | 2 -- .../io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapper.java | 1 - .../shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java | 3 +-- .../main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java | 3 --- .../main/java/io/shinhanlife/dat/mcc/dto/ToolMetadata.java | 2 -- .../io/shinhanlife/dat/lib/annotation/GrowToolHintTest.java | 1 - .../shinhanlife/dat/lib/manifest/ToolManifestServiceTest.java | 2 -- .../io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapperTest.java | 4 ++-- .../dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java | 3 +-- .../java/io/shinhanlife/dat/lib/util/ToolScaffolderTest.java | 1 - 12 files changed, 4 insertions(+), 20 deletions(-) diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/GrowToolHint.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/GrowToolHint.java index 936e26b9e..8a26b17d0 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/GrowToolHint.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/annotation/GrowToolHint.java @@ -30,7 +30,6 @@ public @interface GrowToolHint { String inputSchemaResource() default ""; String outputSchemaResource() default ""; long timeoutMillis() default 5000L; - boolean retryEnabled() default true; int retryMaxAttempts() default 3; // Meta 정보 추가 (보고용 샘플) diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestMeta.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestMeta.java index 030596960..abec6fd17 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestMeta.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestMeta.java @@ -7,7 +7,6 @@ import java.util.List; public record ToolManifestMeta( String version, long timeoutMillis, - boolean retryEnabled, int retryMaxAttempts, boolean enabled, List exampleQueries, diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestService.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestService.java index 1efb9ef17..2697191f9 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestService.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/manifest/ToolManifestService.java @@ -22,7 +22,6 @@ import org.springframework.stereotype.Service; public class ToolManifestService { private static final long DEFAULT_TIMEOUT_MILLIS = 5000L; - private static final boolean DEFAULT_RETRY_ENABLED = true; private static final int DEFAULT_RETRY_MAX_ATTEMPTS = 3; private static final AtomicLong LAST_ISSUED_REVISION = new AtomicLong(); private final Supplier> toolSupplier; @@ -91,7 +90,6 @@ public class ToolManifestService { isTrue(tool.getIdempotentHint()), isTrue(tool.getOpenWorldHint())), new ToolManifestMeta(defaultString(tool.getSemver(), "1.0.0"), positiveOrDefault(tool.getTimeoutMillis(), DEFAULT_TIMEOUT_MILLIS), - tool.getRetryEnabled() == null ? DEFAULT_RETRY_ENABLED : tool.getRetryEnabled(), positiveOrDefault(tool.getRetryMaxAttempts(), DEFAULT_RETRY_MAX_ATTEMPTS), tool.getEnabled() == null || tool.getEnabled(), defaultList(tool.getExampleQueries()), defaultList(tool.getTags()), diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapper.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapper.java index 548e543df..99a5a1aad 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapper.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapper.java @@ -41,7 +41,6 @@ public final class ToolMetadataMcpMapper { put(meta, "required_env_keys", metadata.getRequiredEnvKeys()); put(meta, "owner_org", metadata.getOwnerOrg()); meta.put("timeoutMillis", positiveOrDefault(metadata.getTimeoutMillis(), 5000L)); - meta.put("retryEnabled", metadata.getRetryEnabled() == null || metadata.getRetryEnabled()); meta.put("retryMaxAttempts", positiveOrDefault(metadata.getRetryMaxAttempts(), 3)); return Map.copyOf(meta); } diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java index 29b85e300..65271d340 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSender.java @@ -131,7 +131,6 @@ public class ToolRegistryHeartbeatSender { meta.setName(subToolName); meta.setSemver("1.0.0"); meta.setTimeoutMillis(hintAnnotation == null ? 5000L : positiveOrDefault(hintAnnotation.timeoutMillis(), 5000L)); - meta.setRetryEnabled(hintAnnotation == null || hintAnnotation.retryEnabled()); meta.setRetryMaxAttempts(hintAnnotation == null ? 3 : positiveOrDefault(hintAnnotation.retryMaxAttempts(), 3)); meta.setEnabled(true); meta.setDescription(functionAnnotation.description()); @@ -327,4 +326,4 @@ public class ToolRegistryHeartbeatSender { */ private record ToolAnnotationMetadata(McpTool mcpTool, GrowToolHint growToolHint) { } -} \ No newline at end of file +} diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java index d54246839..6a63908d5 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/lib/util/ToolScaffolder.java @@ -233,7 +233,6 @@ public class ToolScaffolder { .append(" requiresApproval = ").append(isMutation).append(",\n") .append(" categoryKey = \"").append(tool.group().toLowerCase(Locale.ROOT)).append("\",\n") .append(" timeoutMillis = 5000L,\n") - .append(" retryEnabled = true,\n") .append(" retryMaxAttempts = 3,\n"); if (tool.interfaceId() != null && !tool.interfaceId().isBlank()) { methods.append(" mappingId = \"").append(javaText(tool.interfaceId())).append("\",\n"); @@ -388,7 +387,6 @@ public class ToolScaffolder { .append(" requiresApproval = ").append(isMutation).append(",\n") .append(" categoryKey = \"").append(tool.group().toLowerCase(Locale.ROOT)).append("\",\n") .append(" timeoutMillis = 5000L,\n") - .append(" retryEnabled = true,\n") .append(" retryMaxAttempts = 3,\n"); String mappingId = option(tool.interfaceId(), tool.httpApiName()); if (mappingId != null && !mappingId.isBlank()) { @@ -773,7 +771,6 @@ public class ToolScaffolder { sb.append(" requiresApproval = ").append(isMutation).append(",\n"); sb.append(" categoryKey = \"").append(group.toLowerCase(Locale.ROOT)).append("\",\n"); sb.append(" timeoutMillis = 5000L,\n"); - sb.append(" retryEnabled = true,\n"); sb.append(" retryMaxAttempts = 3,\n"); if (interfaceId != null && !interfaceId.isBlank()) { sb.append(" mappingId = \"").append(interfaceId).append("\",\n"); diff --git a/dat-was-lib/src/main/java/io/shinhanlife/dat/mcc/dto/ToolMetadata.java b/dat-was-lib/src/main/java/io/shinhanlife/dat/mcc/dto/ToolMetadata.java index 6eafeaa71..eec485aad 100644 --- a/dat-was-lib/src/main/java/io/shinhanlife/dat/mcc/dto/ToolMetadata.java +++ b/dat-was-lib/src/main/java/io/shinhanlife/dat/mcc/dto/ToolMetadata.java @@ -121,8 +121,6 @@ public class ToolMetadata { @Builder.Default private OperationType operationType = OperationType.READ; - @Builder.Default - private Boolean retryEnabled = true; @Builder.Default private Integer retryMaxAttempts = 3; diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/annotation/GrowToolHintTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/annotation/GrowToolHintTest.java index 6a15f32d5..c49cf30e1 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/annotation/GrowToolHintTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/annotation/GrowToolHintTest.java @@ -9,7 +9,6 @@ class GrowToolHintTest { @Test void exposesResilienceDefaults() throws Exception { assertEquals(5000L, GrowToolHint.class.getMethod("timeoutMillis").getDefaultValue()); - assertEquals(true, GrowToolHint.class.getMethod("retryEnabled").getDefaultValue()); assertEquals(3, GrowToolHint.class.getMethod("retryMaxAttempts").getDefaultValue()); } } diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/manifest/ToolManifestServiceTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/manifest/ToolManifestServiceTest.java index 9282e0dff..410e4f091 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/manifest/ToolManifestServiceTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/manifest/ToolManifestServiceTest.java @@ -35,7 +35,6 @@ class ToolManifestServiceTest { assertTrue(item.annotations().readOnlyHint()); assertEquals("1.2.0", item.meta().version()); assertEquals(3000, item.meta().timeoutMillis()); - assertEquals(false, item.meta().retryEnabled()); assertEquals(5, item.meta().retryMaxAttempts()); assertEquals(List.of("계약 상태를 알려줘", "내 계약을 조회해줘", "계약번호로 찾아줘"), item.meta().exampleQueries()); @@ -97,7 +96,6 @@ class ToolManifestServiceTest { "required", List.of("contractNo"), "additionalProperties", false)) .semver(version) .timeoutMillis(timeoutMillis) - .retryEnabled(false) .retryMaxAttempts(5) .enabled(true) .readOnlyHint(true) diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapperTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapperTest.java index 7bfcbfa05..5888e3805 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapperTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolMetadataMcpMapperTest.java @@ -1,6 +1,7 @@ package io.shinhanlife.dat.lib.mcp; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import io.shinhanlife.dat.mcc.dto.ToolMetadata; import java.util.Map; @@ -12,14 +13,13 @@ class ToolMetadataMcpMapperTest { void exposesResilienceSettingsInMcpToolMeta() { ToolMetadata metadata = ToolMetadata.builder() .timeoutMillis(12000L) - .retryEnabled(false) .retryMaxAttempts(5) .build(); Map meta = ToolMetadataMcpMapper.meta(metadata); assertEquals(12000L, meta.get("timeoutMillis")); - assertEquals(false, meta.get("retryEnabled")); + assertFalse(meta.containsKey("retryEnabled")); assertEquals(5, meta.get("retryMaxAttempts")); } } diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java index cc02d3114..71c015107 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/mcp/ToolRegistryHeartbeatSenderTest.java @@ -57,7 +57,6 @@ class ToolRegistryHeartbeatSenderTest { var metadata = sender.getAllScannedTools().getFirst(); assertThat(metadata.getTimeoutMillis()).isEqualTo(12000L); - assertThat(metadata.getRetryEnabled()).isFalse(); assertThat(metadata.getRetryMaxAttempts()).isEqualTo(1); } @@ -100,7 +99,7 @@ class ToolRegistryHeartbeatSenderTest { static class SampleTool { @McpTool(name = "test_sample_tool") - @GrowToolHint(timeoutMillis = 12000L, retryEnabled = false, retryMaxAttempts = 1) + @GrowToolHint(timeoutMillis = 12000L, retryMaxAttempts = 1) void execute() { } } diff --git a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolScaffolderTest.java b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolScaffolderTest.java index 6e8a5abf5..853e2fccb 100644 --- a/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolScaffolderTest.java +++ b/dat-was-lib/src/test/java/io/shinhanlife/dat/lib/util/ToolScaffolderTest.java @@ -147,7 +147,6 @@ class ToolScaffolderTest { assertTrue(useCase.contains("name = \"smp_employee_search\""), useCase); assertTrue(useCase.contains("timeoutMillis = 5000L"), useCase); - assertTrue(useCase.contains("retryEnabled = true"), useCase); assertTrue(useCase.contains("retryMaxAttempts = 3"), useCase); assertTrue(useCase.contains("whenToUse = \"사용자가 이 업무 기능의 실행 또는 조회를 요청할 때 사용합니다.\""), useCase); assertTrue(useCase.contains("exampleQueries = {\"직원 조회 정보를 보여줘\""), useCase);