feat: 테이블 데이터 저장 시 존재하지 않는 컬럼 자동 필터링
- tableManagementService.addTableData: 테이블 스키마 기반 컬럼 필터링 로직 추가 - 무시된 컬럼 정보를 API 응답에 포함 (skippedColumns, savedColumns) - 프론트엔드 콘솔에 무시된 컬럼 경고 출력 - conditional-container의 UI 제어용 필드(condition) 등으로 인한 저장 에러 방지
This commit is contained in:
parent
ad39374e54
commit
25b7e637de
|
|
@ -901,13 +901,23 @@ export async function addTableData(
|
||||||
}
|
}
|
||||||
|
|
||||||
// 데이터 추가
|
// 데이터 추가
|
||||||
await tableManagementService.addTableData(tableName, data);
|
const result = await tableManagementService.addTableData(tableName, data);
|
||||||
|
|
||||||
logger.info(`테이블 데이터 추가 완료: ${tableName}`);
|
logger.info(`테이블 데이터 추가 완료: ${tableName}`);
|
||||||
|
|
||||||
const response: ApiResponse<null> = {
|
// 무시된 컬럼이 있으면 경고 정보 포함
|
||||||
|
const response: ApiResponse<{
|
||||||
|
skippedColumns?: string[];
|
||||||
|
savedColumns?: string[];
|
||||||
|
}> = {
|
||||||
success: true,
|
success: true,
|
||||||
message: "테이블 데이터를 성공적으로 추가했습니다.",
|
message: result.skippedColumns.length > 0
|
||||||
|
? `테이블 데이터를 추가했습니다. (무시된 컬럼 ${result.skippedColumns.length}개: ${result.skippedColumns.join(", ")})`
|
||||||
|
: "테이블 데이터를 성공적으로 추가했습니다.",
|
||||||
|
data: {
|
||||||
|
skippedColumns: result.skippedColumns.length > 0 ? result.skippedColumns : undefined,
|
||||||
|
savedColumns: result.savedColumns,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
res.status(201).json(response);
|
res.status(201).json(response);
|
||||||
|
|
|
||||||
|
|
@ -2261,11 +2261,12 @@ export class TableManagementService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 테이블에 데이터 추가
|
* 테이블에 데이터 추가
|
||||||
|
* @returns 무시된 컬럼 정보 (디버깅용)
|
||||||
*/
|
*/
|
||||||
async addTableData(
|
async addTableData(
|
||||||
tableName: string,
|
tableName: string,
|
||||||
data: Record<string, any>
|
data: Record<string, any>
|
||||||
): Promise<void> {
|
): Promise<{ skippedColumns: string[]; savedColumns: string[] }> {
|
||||||
try {
|
try {
|
||||||
logger.info(`=== 테이블 데이터 추가 시작: ${tableName} ===`);
|
logger.info(`=== 테이블 데이터 추가 시작: ${tableName} ===`);
|
||||||
logger.info(`추가할 데이터:`, data);
|
logger.info(`추가할 데이터:`, data);
|
||||||
|
|
@ -2296,10 +2297,41 @@ export class TableManagementService {
|
||||||
logger.info(`created_date 자동 추가: ${data.created_date}`);
|
logger.info(`created_date 자동 추가: ${data.created_date}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 컬럼명과 값을 분리하고 타입에 맞게 변환
|
// 🆕 테이블에 존재하는 컬럼만 필터링 (존재하지 않는 컬럼은 무시)
|
||||||
const columns = Object.keys(data);
|
const skippedColumns: string[] = [];
|
||||||
const values = Object.values(data).map((value, index) => {
|
const existingColumns = Object.keys(data).filter((col) => {
|
||||||
const columnName = columns[index];
|
const exists = columnTypeMap.has(col);
|
||||||
|
if (!exists) {
|
||||||
|
skippedColumns.push(col);
|
||||||
|
}
|
||||||
|
return exists;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 무시된 컬럼이 있으면 경고 로그 출력
|
||||||
|
if (skippedColumns.length > 0) {
|
||||||
|
logger.warn(
|
||||||
|
`⚠️ [${tableName}] 테이블에 존재하지 않는 컬럼 ${skippedColumns.length}개 무시됨: ${skippedColumns.join(", ")}`
|
||||||
|
);
|
||||||
|
logger.warn(
|
||||||
|
`⚠️ [${tableName}] 무시된 컬럼 상세:`,
|
||||||
|
skippedColumns.map((col) => ({ column: col, value: data[col] }))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingColumns.length === 0) {
|
||||||
|
throw new Error(
|
||||||
|
`저장할 유효한 컬럼이 없습니다. 테이블: ${tableName}, 전달된 컬럼: ${Object.keys(data).join(", ")}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
`✅ [${tableName}] 저장될 컬럼 ${existingColumns.length}개: ${existingColumns.join(", ")}`
|
||||||
|
);
|
||||||
|
|
||||||
|
// 컬럼명과 값을 분리하고 타입에 맞게 변환 (존재하는 컬럼만)
|
||||||
|
const columns = existingColumns;
|
||||||
|
const values = columns.map((columnName) => {
|
||||||
|
const value = data[columnName];
|
||||||
const dataType = columnTypeMap.get(columnName) || "text";
|
const dataType = columnTypeMap.get(columnName) || "text";
|
||||||
const convertedValue = this.convertValueForPostgreSQL(value, dataType);
|
const convertedValue = this.convertValueForPostgreSQL(value, dataType);
|
||||||
logger.info(
|
logger.info(
|
||||||
|
|
@ -2355,6 +2387,12 @@ export class TableManagementService {
|
||||||
await query(insertQuery, values);
|
await query(insertQuery, values);
|
||||||
|
|
||||||
logger.info(`테이블 데이터 추가 완료: ${tableName}`);
|
logger.info(`테이블 데이터 추가 완료: ${tableName}`);
|
||||||
|
|
||||||
|
// 무시된 컬럼과 저장된 컬럼 정보 반환
|
||||||
|
return {
|
||||||
|
skippedColumns,
|
||||||
|
savedColumns: existingColumns,
|
||||||
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`테이블 데이터 추가 오류: ${tableName}`, error);
|
logger.error(`테이블 데이터 추가 오류: ${tableName}`, error);
|
||||||
throw error;
|
throw error;
|
||||||
|
|
|
||||||
|
|
@ -1063,6 +1063,13 @@ export class ButtonActionExecutor {
|
||||||
dataWithMeta,
|
dataWithMeta,
|
||||||
);
|
);
|
||||||
console.log("✅ [handleSave] RepeaterFieldGroup INSERT 완료:", insertResult.data);
|
console.log("✅ [handleSave] RepeaterFieldGroup INSERT 완료:", insertResult.data);
|
||||||
|
// 무시된 컬럼이 있으면 경고 출력
|
||||||
|
if (insertResult.data?.data?.skippedColumns?.length > 0) {
|
||||||
|
console.warn(
|
||||||
|
`⚠️ [${repeaterTargetTable}] 테이블에 존재하지 않는 컬럼이 무시됨:`,
|
||||||
|
insertResult.data.data.skippedColumns,
|
||||||
|
);
|
||||||
|
}
|
||||||
} else if (item.id) {
|
} else if (item.id) {
|
||||||
// UPDATE (기존 항목)
|
// UPDATE (기존 항목)
|
||||||
const originalData = { id: item.id };
|
const originalData = { id: item.id };
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue