From 0365b743f54a3cbc29139848ab81ad34b8c0bbc6 Mon Sep 17 00:00:00 2001 From: johngreen Date: Thu, 14 May 2026 08:32:48 +0900 Subject: [PATCH] =?UTF-8?q?fix(=ED=85=8C=EC=9D=B4=EB=B8=94=ED=83=80?= =?UTF-8?q?=EC=9E=85):=20constraints=20API=20PgArray=20=EB=94=94=EC=BD=94?= =?UTF-8?q?=EB=94=A9=20+=20primary=5Fkey=20key=20=EB=A7=A4=EC=B9=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테이블 타입 관리 페이지에서 PK/IDX 토글 후 UI 상태가 갱신되지 않던 버그. 1. Backend: TableManagementService.parseColumnArray - PostgreSQL ARRAY_AGG 가 java.sql.Array (PgArray) 로 오는데 List/String 만 처리해서 항상 List.of() 반환 → columns 빈 배열 - 조치: java.sql.Array 분기 추가, arr.getArray() → Object[] → List 2. Frontend: loadConstraints - 백엔드는 result.put("primary_key", ...) 로 snake_case 반환 - 프론트가 data.primaryKey 로 camelCase 로 읽어 undefined → 항상 빈 PK - 조치: data.primary_key 로 통일 이전 PR (#14) 의 IDX payload 수정과 합쳐, PK/IDX 토글이 API 호출/DB 적용/ UI 반영까지 한 사이클로 동작. 검증: - gradle compileJava BUILD SUCCESSFUL - solution.invyone.com 에서 IDX 토글 양방향 확인 예정 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../com/erp/service/TableManagementService.java | 15 +++++++++++++++ .../(main)/admin/systemMng/tableMngList/page.tsx | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/backend-spring/src/main/java/com/erp/service/TableManagementService.java b/backend-spring/src/main/java/com/erp/service/TableManagementService.java index af045a51..138064c6 100644 --- a/backend-spring/src/main/java/com/erp/service/TableManagementService.java +++ b/backend-spring/src/main/java/com/erp/service/TableManagementService.java @@ -10,6 +10,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.sql.SQLException; import java.util.*; import java.util.stream.Collectors; @@ -941,6 +942,20 @@ public class TableManagementService extends BaseService { @SuppressWarnings("unchecked") private List parseColumnArray(Object cols) { if (cols instanceof List) return (List) cols; + if (cols instanceof java.sql.Array arr) { + try { + Object raw = arr.getArray(); + if (raw instanceof Object[] arrObj) { + return Arrays.stream(arrObj) + .filter(Objects::nonNull) + .map(Object::toString) + .filter(s -> !s.isBlank()) + .collect(Collectors.toList()); + } + } catch (SQLException e) { + log.warn("parseColumnArray: java.sql.Array decode 실패 — fallback", e); + } + } if (cols instanceof String s) { return Arrays.stream(s.replace("{", "").replace("}", "").split(",")) .filter(c -> !c.isBlank()) diff --git a/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx b/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx index 0167f4db..f3e41f02 100644 --- a/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx +++ b/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx @@ -381,7 +381,7 @@ export default function TableManagementPage() { if (response.data.success) { const data = response.data.data; setConstraints({ - primaryKey: data.primaryKey ?? { name: "", columns: [] }, + primaryKey: data.primary_key ?? { name: "", columns: [] }, indexes: data.indexes ?? [], }); } -- 2.52.0