From 0dd4b561f092c440154c35f0b3f36469b1131afd Mon Sep 17 00:00:00 2001 From: Hyoseong Jo Date: Mon, 5 Jan 2026 14:09:22 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A7=81=EC=9B=90=EC=A0=95=EB=B3=B4=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/employee/[id]/update.put.ts | 9 ++++++--- frontend/employee/[id].vue | 9 +++++++-- package-lock.json | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/backend/api/employee/[id]/update.put.ts b/backend/api/employee/[id]/update.put.ts index 64b90c0..5d87e0c 100644 --- a/backend/api/employee/[id]/update.put.ts +++ b/backend/api/employee/[id]/update.put.ts @@ -2,6 +2,9 @@ import { execute, queryOne } from '../../../utils/db' import { getClientIp } from '../../../utils/ip' import { getCurrentUserEmail } from '../../../utils/user' +// 빈 문자열을 null로 변환 (date 타입 등에서 필요) +const emptyToNull = (value: any) => (value === '' ? null : value) + interface UpdateEmployeeBody { employeeName?: string employeePhone?: string @@ -43,10 +46,10 @@ export default defineEventHandler(async (event) => { WHERE employee_id = $9 `, [ body.employeeName ?? existing.employee_name, - body.employeePhone ?? existing.employee_phone, - body.employeePosition ?? existing.employee_position, + emptyToNull(body.employeePhone) ?? existing.employee_phone, + emptyToNull(body.employeePosition) ?? existing.employee_position, body.company ?? existing.company, - body.joinDate ?? existing.join_date, + emptyToNull(body.joinDate) ?? existing.join_date, body.isActive ?? existing.is_active, clientIp, userEmail, diff --git a/frontend/employee/[id].vue b/frontend/employee/[id].vue index 202a8b7..9dab261 100644 --- a/frontend/employee/[id].vue +++ b/frontend/employee/[id].vue @@ -217,10 +217,15 @@ async function updateEmployee() { try { await $fetch(`/api/employee/${route.params.id}/update`, { method: 'PUT', - body: form.value + body: { + ...form.value, + joinDate: form.value.joinDate || null, + employeePhone: form.value.employeePhone || null, + employeePosition: form.value.employeePosition || null + } }) alert('저장되었습니다.') - await loadEmployee() + router.push('/employee') } catch (e: any) { alert(e.data?.message || e.message || '저장에 실패했습니다.') } finally { diff --git a/package-lock.json b/package-lock.json index a683e18..b023b1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -3142,6 +3143,7 @@ "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -3390,6 +3392,7 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", @@ -3553,6 +3556,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3897,6 +3901,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4004,6 +4009,7 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -4069,6 +4075,7 @@ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "license": "MIT", + "peer": true, "dependencies": { "consola": "^3.2.3" } @@ -7498,6 +7505,7 @@ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.102.0.tgz", "integrity": "sha512-xMiyHgr2FZsphQ12ZCsXRvSYzmKXCm1ejmyG4GDZIiKOmhyt5iKtWq0klOfFsEQ6jcgbwrUdwcCVYzr1F+h5og==", "license": "MIT", + "peer": true, "dependencies": { "@oxc-project/types": "^0.102.0" }, @@ -7682,6 +7690,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -7814,6 +7823,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8565,6 +8575,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -9425,6 +9436,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9870,6 +9882,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -10232,6 +10245,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -10268,6 +10282,7 @@ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", "license": "MIT", + "peer": true, "dependencies": { "@vue/devtools-api": "^6.6.4" },