diff --git a/dat-gateway/src/main/java/io/shinhanlife/dat/mcg/presentation/ScaffoldingController.java b/dat-gateway/src/main/java/io/shinhanlife/dat/mcg/presentation/ScaffoldingController.java index 3c0c6163..1394141a 100644 --- a/dat-gateway/src/main/java/io/shinhanlife/dat/mcg/presentation/ScaffoldingController.java +++ b/dat-gateway/src/main/java/io/shinhanlife/dat/mcg/presentation/ScaffoldingController.java @@ -385,6 +385,73 @@ public class ScaffoldingController { } } + @PostMapping("/mci-request/analyze") + public ResponseEntity analyzeMciRequest(@RequestBody MciResponseAnalyzeRequest request) { + if (request == null || request.source() == null || request.source().isBlank()) { + return ResponseEntity.badRequest().body(Map.of("error", "XXXX_I.java 소스를 입력해주세요.")); + } + try { + MciResponseScaffolder.ParsedSource parsed = MciResponseScaffolder.parse(request.source()); + String fieldsJson = objectMapper.writeValueAsString(parsed.types().stream() + .flatMap(type -> type.fields().stream().map(field -> Map.of( + "ownerType", type.name(), + "sourceName", field.name(), + "description", field.description(), + "javaType", field.type(), + "sensitive", field.sensitive()))) + .toList()); + String prompt = """ + You rename legacy Korean financial-system request fields for an MCP Tool request DTO. + Return JSON only with this exact shape: + {"mappings":[{"ownerType":"SourceOwnerClass","sourceName":"legacyField","targetName":"businessMeaningInEnglish","include":true}]} + + Rules: + - Return exactly one mapping for every input field, preserving ownerType and sourceName verbatim. + - targetName must be a concise, descriptive English Java camelCase identifier. + - Derive the business meaning primarily from description; use sourceName only as supporting metadata. + - Expand abbreviations: No -> Number, Cd -> Code, Nm -> Name, Ymd/Dt -> Date when the description supports it. + - Do not invent fields, examples, descriptions, values, or business rules. + - Keep include=true. Sensitive fields must still be named accurately; the UI will show a warning for human review. + - targetName values must be unique within each ownerType. + + Source fields: + %s + """.formatted(fieldsJson); + String aiResponse = generateAiContent(prompt, request.model()); + AiMciMappingDraft draft = objectMapper.readValue(stripCodeFence(aiResponse), AiMciMappingDraft.class); + List mappings = normalizeAiMappings(parsed, draft); + return ResponseEntity.ok(new MciResponseAnalyzeResponse(parsed, mappings)); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(Map.of("error", safeMessage(e))); + } catch (Exception e) { + return ResponseEntity.internalServerError() + .body(Map.of("error", "MCI Request AI 분석 실패: " + safeMessage(e))); + } + } + + @PostMapping("/mci-request/generate") + public ResponseEntity generateMciRequest(@RequestBody MciRequestGenerateRequest request) { + if (request == null || request.source() == null || request.source().isBlank()) { + return ResponseEntity.badRequest().body(Map.of("error", "XXXX_I.java 소스를 입력해주세요.")); + } + try { + MciResponseScaffolder.ParsedSource parsed = MciResponseScaffolder.parse(request.source()); + MciResponseScaffolder.GeneratedRequestSources generated = MciResponseScaffolder.generateRequest( + parsed, + request.requestPackage(), + request.requestClassName(), + request.converterPackage(), + request.converterClassName(), + request.mappings()); + return ResponseEntity.ok(generated); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(Map.of("error", safeMessage(e))); + } catch (Exception e) { + return ResponseEntity.internalServerError() + .body(Map.of("error", "MCI Request 소스 생성 실패: " + safeMessage(e))); + } + } + @PostMapping("/tool/update") public String updateTool(@RequestBody Map req) { try { @@ -667,6 +734,14 @@ public class ScaffoldingController { List mappings) { } + public record MciRequestGenerateRequest(String source, + String requestPackage, + String requestClassName, + String converterPackage, + String converterClassName, + List mappings) { + } + private record AiMciMappingDraft(List mappings) { } diff --git a/dat-gateway/src/main/resources/static/admin/scaffold.html b/dat-gateway/src/main/resources/static/admin/scaffold.html index cc2d0f21..f6db6651 100644 --- a/dat-gateway/src/main/resources/static/admin/scaffold.html +++ b/dat-gateway/src/main/resources/static/admin/scaffold.html @@ -1139,16 +1139,23 @@
-

Glow MCI 응답을 LLM Response로 변환

-
XXXX_O.java의 전문 구조와 @GlowTrgmField.description은 원문 그대로 읽고, AI는 축약 필드명을 업무 의미가 드러나는 영문 camelCase로만 제안합니다.
+

Glow MCI 응답을 LLM Response로 변환

+
XXXX_O.java의 전문 구조와 @GlowTrgmField.description은 원문 그대로 읽고, AI는 축약 필드명을 업무 의미가 드러나는 영문 camelCase로만 제안합니다.
구조: Parser · 이름: AI · 출력: MapStruct
-
- +
+ + +
+
+
파일을 선택하면 아래 소스 입력란에 UTF-8 텍스트로 불러옵니다. 소스를 직접 붙여넣어도 됩니다.
@@ -1171,7 +1178,7 @@
- +
@@ -1182,11 +1189,11 @@