diff --git a/backend-spring/src/main/java/com/erp/controller/DdlController.java b/backend-spring/src/main/java/com/erp/controller/DdlController.java index e627ca48..2e643504 100644 --- a/backend-spring/src/main/java/com/erp/controller/DdlController.java +++ b/backend-spring/src/main/java/com/erp/controller/DdlController.java @@ -34,7 +34,7 @@ public class DdlController { @RequestBody Map body) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } String tableName = (String) body.get("table_name"); @@ -71,7 +71,7 @@ public class DdlController { @RequestBody Map body) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } @SuppressWarnings("unchecked") @@ -105,7 +105,7 @@ public class DdlController { @RequestAttribute("user_id") String userId) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Map result = ddlService.dropColumn(tableName, columnName, companyCode, userId); @@ -131,7 +131,7 @@ public class DdlController { @RequestAttribute("user_id") String userId) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Map result = ddlService.dropTable(tableName, companyCode, userId); @@ -155,7 +155,7 @@ public class DdlController { @RequestBody Map body) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } String tableName = (String) body.get("table_name"); @@ -187,7 +187,7 @@ public class DdlController { @RequestParam(required = false) String ddlType) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } List> logs = ddlService.getDdlLogs(limit, userId, ddlType); @@ -206,7 +206,7 @@ public class DdlController { @RequestParam(required = false) String toDate) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Map statistics = ddlService.getDdlStatistics(fromDate, toDate); @@ -223,7 +223,7 @@ public class DdlController { @RequestAttribute(value = "role", required = false) String role) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } List> history = ddlService.getTableDdlHistory(tableName); @@ -242,7 +242,7 @@ public class DdlController { @RequestAttribute(value = "role", required = false) String role) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Map tableInfo = ddlService.getTableInfo(tableName); @@ -268,7 +268,7 @@ public class DdlController { @RequestParam(required = false, defaultValue = "90") int retentionDays) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } int deletedCount = ddlService.cleanupOldLogs(retentionDays); @@ -286,7 +286,7 @@ public class DdlController { @RequestAttribute(value = "role", required = false) String role) { if (!isSuperAdmin(companyCode, role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } return ResponseEntity.ok(ApiResponse.success(Map.of( diff --git a/backend-spring/src/main/java/com/erp/controller/TableManagementController.java b/backend-spring/src/main/java/com/erp/controller/TableManagementController.java index 3f091bb6..1c650af4 100644 --- a/backend-spring/src/main/java/com/erp/controller/TableManagementController.java +++ b/backend-spring/src/main/java/com/erp/controller/TableManagementController.java @@ -274,7 +274,7 @@ public class TableManagementController { @RequestBody Map body, @RequestAttribute("role") String role) { if (!isSuperAdmin(role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } @SuppressWarnings("unchecked") List columns = (List) body.get("columns"); @@ -293,7 +293,7 @@ public class TableManagementController { @RequestBody Map body, @RequestAttribute("role") String role) { if (!isSuperAdmin(role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } String columnName = (String) body.get("column_name"); String indexType = (String) body.get("index_type"); @@ -322,7 +322,7 @@ public class TableManagementController { @RequestAttribute("role") String role, @RequestAttribute("company_code") String companyCode) { if (!isSuperAdmin(role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Object nullableObj = body.get("nullable"); if (tableName == null || columnName == null || !(nullableObj instanceof Boolean)) { @@ -344,7 +344,7 @@ public class TableManagementController { @RequestAttribute("role") String role, @RequestAttribute("company_code") String companyCode) { if (!isSuperAdmin(role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } Object uniqueObj = body.get("unique"); if (tableName == null || columnName == null || !(uniqueObj instanceof Boolean)) { @@ -569,7 +569,7 @@ public class TableManagementController { @RequestBody Map body, @RequestAttribute("role") String role) { if (!isSuperAdmin(role)) { - return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자 권한이 필요합니다.")); + return ResponseEntity.status(403).body(ApiResponse.error("최고 관리자(SUPER_ADMIN) 권한이 필요합니다.")); } @SuppressWarnings("unchecked") List logColumns = (List) body.get("log_columns"); diff --git a/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx b/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx index 3087601a..2ae86a37 100644 --- a/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx +++ b/frontend/app/(main)/admin/systemMng/tableMngList/page.tsx @@ -279,11 +279,9 @@ export default function TableManagementPage() { if (response.success && response.data) { setSecondLevelMenus(response.data); } else { - console.warn("⚠️ 2레벨 메뉴 로드 실패:", response); setSecondLevelMenus([]); // 빈 배열로 설정하여 로딩 상태 해제 } } catch (error) { - console.error("❌ 2레벨 메뉴 로드 에러:", error); setSecondLevelMenus([]); // 에러 발생 시에도 빈 배열로 설정 } }; @@ -326,12 +324,6 @@ export default function TableManagementPage() { if (response.data.success) { const data = response.data.data; - console.log("📥 원본 API 응답:", { - hasColumns: !!(data.columns || data), - firstColumn: (data.columns || data)[0], - statusColumn: (data.columns || data).find((col: any) => col.column_name === "status"), - }); - // 컬럼 데이터에 기본값 설정 const processedColumns = (data.columns || data).map((col: any) => { let hierarchyRole: "large" | "medium" | "small" | undefined = undefined; @@ -648,7 +640,6 @@ export default function TableManagementPage() { }; finalDetailSettings = JSON.stringify(entitySettings); - console.log("🔧 Entity 설정 JSON 생성:", entitySettings); } // 🎯 Code 타입인 경우 hierarchyRole을 detailSettings에 포함 @@ -668,7 +659,6 @@ export default function TableManagementPage() { }; finalDetailSettings = JSON.stringify(codeSettings); - console.log("🔧 Code 계층 역할 설정 JSON 생성:", codeSettings); } const columnSetting = { @@ -686,49 +676,22 @@ export default function TableManagementPage() { // console.log("저장할 컬럼 설정:", columnSetting); - console.log("💾 저장할 컬럼 정보:", { - columnName: column.column_name, - inputType: column.input_type, - categoryMenus: column.category_menus, - hasCategoryMenus: !!column.category_menus, - categoryMenusLength: column.category_menus?.length || 0, - }); - const response = await apiClient.post(`/table-management/tables/${selectedTable}/columns/settings`, [ columnSetting, ]); if (response.data.success) { - console.log("✅ 컬럼 설정 저장 성공"); - // 🆕 Category 타입인 경우 컬럼 매핑 처리 - console.log("🔍 카테고리 조건 체크:", { - isCategory: column.input_type === "category", - hasCategoryMenus: !!column.category_menus, - length: column.category_menus?.length || 0, - }); - if (column.input_type === "category" && !column.category_ref) { // 참조가 아닌 자체 카테고리만 메뉴 매핑 처리 - console.log("기존 카테고리 메뉴 매핑 삭제 시작:", { - tableName: selectedTable, - columnName: column.column_name, - }); - try { - const deleteResponse = await deleteColumnMappingsByColumn(selectedTable, column.column_name); - console.log("🗑️ 기존 매핑 삭제 결과:", deleteResponse); + await deleteColumnMappingsByColumn(selectedTable, column.column_name); } catch (error) { console.error("❌ 기존 매핑 삭제 실패:", error); } // 2. 새로운 매핑 추가 (선택된 메뉴가 있는 경우만) if (column.category_menus && column.category_menus.length > 0) { - console.log("📥 카테고리 메뉴 매핑 시작:", { - columnName: column.column_name, - categoryMenus: column.category_menus, - count: column.category_menus.length, - }); // 직렬 await 대신 Promise.allSettled 로 병렬 호출 (메뉴가 많으면 직렬은 수십 초 멈춤) const mappingResults = await Promise.allSettled( @@ -890,29 +853,14 @@ export default function TableManagementPage() { // 자체 카테고리 컬럼만 메뉴 매핑 처리 (참조 컬럼 제외) const categoryColumns = columns.filter((col) => col.input_type === "category" && !col.category_ref); - console.log("📥 전체 저장: 카테고리 컬럼 확인", { - totalColumns: columns.length, - categoryColumns: categoryColumns.length, - categoryColumnsData: categoryColumns.map((col) => ({ - columnName: col.column_name, - categoryMenus: col.category_menus, - })), - }); - if (categoryColumns.length > 0) { let totalSuccessCount = 0; let totalFailCount = 0; for (const column of categoryColumns) { // 1. 먼저 기존 매핑 모두 삭제 - console.log("🗑️ 기존 카테고리 메뉴 매핑 삭제:", { - tableName: selectedTable, - columnName: column.column_name, - }); - try { - const deleteResponse = await deleteColumnMappingsByColumn(selectedTable, column.column_name); - console.log("🗑️ 기존 매핑 삭제 결과:", deleteResponse); + await deleteColumnMappingsByColumn(selectedTable, column.column_name); } catch (error) { console.error("❌ 기존 매핑 삭제 실패:", error); } @@ -938,8 +886,6 @@ export default function TableManagementPage() { } } - console.log("📊 전체 매핑 결과:", { totalSuccessCount, totalFailCount }); - if (totalSuccessCount > 0) { toast.success(`테이블 설정 및 ${totalSuccessCount}개 카테고리 메뉴 매핑이 저장되었습니다.`); } else if (totalFailCount > 0) { diff --git a/frontend/components/admin/CreateTableModal.tsx b/frontend/components/admin/CreateTableModal.tsx index ec591e91..12f665f2 100644 --- a/frontend/components/admin/CreateTableModal.tsx +++ b/frontend/components/admin/CreateTableModal.tsx @@ -19,8 +19,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Loader2, Info, AlertCircle, CheckCircle2, Plus, Activity } from "lucide-react"; +import { Loader2, Info, AlertCircle, CheckCircle2, Plus } from "lucide-react"; import { toast } from "sonner"; import { ColumnDefinitionTable } from "./ColumnDefinitionTable"; import { ddlApi } from "../../lib/api/ddl"; @@ -57,8 +56,6 @@ export function CreateTableModal({ const [validating, setValidating] = useState(false); const [tableNameError, setTableNameError] = useState(""); const [validationResult, setValidationResult] = useState(null); - const [useLogTable, setUseLogTable] = useState(false); - /** * 모달 리셋 */ @@ -76,7 +73,6 @@ export function CreateTableModal({ ]); setTableNameError(""); setValidationResult(null); - setUseLogTable(false); }; /** @@ -107,15 +103,11 @@ export function CreateTableModal({ try { // 1. 테이블 컬럼 정보 조회 const columnsResponse = await tableManagementApi.getColumnList(tableName); - - console.log("🔍 컬럼 조회 응답:", columnsResponse); - + if (columnsResponse.success && columnsResponse.data) { // API는 { columns, total, page, size } 형태로 반환 const columnsList = columnsResponse.data.columns; - - console.log("🔍 컬럼 리스트:", columnsList); - + if (columnsList && columnsList.length > 0) { // 첫 번째 컬럼에서 테이블 설명 가져오기 (모든 컬럼이 같은 테이블 설명을 가짐) const firstColumn = columnsList[0]; @@ -285,23 +277,6 @@ export function CreateTableModal({ if (result.success) { toast.success(result.message); - - // 로그 테이블 생성 옵션이 선택되었다면 로그 테이블 생성 - if (useLogTable) { - try { - const pkColumn = { columnName: "id", dataType: "integer" }; - const logResult = await tableManagementApi.createLogTable(tableName, pkColumn); - - if (logResult.success) { - toast.success(`${tableName}_log 테이블이 생성되었습니다.`); - } else { - toast.warning(`테이블은 생성되었으나 로그 테이블 생성 실패: ${logResult.message}`); - } - } catch (logError) { - toast.warning("테이블은 생성되었으나 로그 테이블 생성 중 오류가 발생했습니다."); - } - } - onSuccess(result); onClose(); } else { @@ -380,29 +355,6 @@ export function CreateTableModal({ - {/* 로그 테이블 생성 옵션 - 통합 변경 이력 시스템으로 대체됨 (숨김 처리) */} - {/*
- setUseLogTable(checked as boolean)} - disabled={loading} - /> -
- -

- 선택 시 {tableName || "table"}_log 테이블이 - 자동으로 생성되어 INSERT/UPDATE/DELETE 변경 이력을 기록합니다. -

-
-
*/} - {/* 자동 추가 컬럼 안내 */}