From 151de4148c15ec529e7d9812886408f3e8853d5a Mon Sep 17 00:00:00 2001 From: kjs Date: Wed, 1 Oct 2025 15:48:29 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20UPDATE=20=EC=95=A1=EC=85=98=20=EB=8F=99?= =?UTF-8?q?=EC=A0=81=20=EA=B8=B0=EB=B3=B8=ED=82=A4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문제: - UPDATE 액션 실행 시 ID 필요 에러 - executeUpdate가 하드코딩된 id 필드만 찾음 - 실제 테이블 기본키는 다를 수 있음 해결: 1. 테이블 기본키 동적 조회 2. 기본키 값 동적 추출 3. 동적 UPDATE 쿼리 생성 4. 상세 로깅 추가 결과: - 모든 테이블의 UPDATE 동작 - 동적 기본키 처리 --- .../dataflowExecutionController.ts | 51 ++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/backend-node/src/controllers/dataflowExecutionController.ts b/backend-node/src/controllers/dataflowExecutionController.ts index 14df0cda..71514633 100644 --- a/backend-node/src/controllers/dataflowExecutionController.ts +++ b/backend-node/src/controllers/dataflowExecutionController.ts @@ -170,23 +170,60 @@ async function executeInsert(tableName: string, data: Record): Prom */ async function executeUpdate(tableName: string, data: Record): Promise { try { - // ID 또는 기본키를 기준으로 업데이트 - const { id, ...updateData } = data; + logger.info(`UPDATE 액션 시작:`, { tableName, receivedData: data }); - if (!id) { - throw new Error('UPDATE를 위한 ID가 필요합니다'); + // 1. 테이블의 실제 기본키 조회 + const primaryKeyQuery = ` + SELECT a.attname as column_name + FROM pg_index i + JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) + WHERE i.indrelid = $1::regclass AND i.indisprimary + `; + + const pkResult = await query<{ column_name: string }>(primaryKeyQuery, [tableName]); + + if (!pkResult || pkResult.length === 0) { + throw new Error(`테이블 ${tableName}의 기본키를 찾을 수 없습니다`); } + const primaryKeyColumn = pkResult[0].column_name; + logger.info(`테이블 ${tableName}의 기본키:`, primaryKeyColumn); + + // 2. 기본키 값 추출 + const primaryKeyValue = data[primaryKeyColumn]; + + if (!primaryKeyValue && primaryKeyValue !== 0) { + logger.error(`UPDATE 실패: 기본키 값이 없음`, { + primaryKeyColumn, + receivedData: data, + availableKeys: Object.keys(data), + }); + throw new Error(`UPDATE를 위한 기본키 값이 필요합니다 (${primaryKeyColumn})`); + } + + // 3. 업데이트할 데이터에서 기본키 제외 + const updateData = { ...data }; + delete updateData[primaryKeyColumn]; + + logger.info(`UPDATE 데이터 준비:`, { + primaryKeyColumn, + primaryKeyValue, + updateFields: Object.keys(updateData), + }); + + // 4. 동적 UPDATE 쿼리 생성 const setClause = Object.keys(updateData) .map((key, index) => `${key} = $${index + 1}`) .join(', '); const values = Object.values(updateData); - const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE id = $${values.length + 1} RETURNING *`; + const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE ${primaryKeyColumn} = $${values.length + 1} RETURNING *`; - logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, id] }); + logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, primaryKeyValue] }); - const result = await query(updateQuery, [...values, id]); + const result = await query(updateQuery, [...values, primaryKeyValue]); + + logger.info(`UPDATE 성공:`, { affectedRows: result.length }); return { success: true,