{"id":1252,"date":"2026-11-01T11:08:54","date_gmt":"2026-11-01T03:08:54","guid":{"rendered":"https:\/\/junai.ai\/blog\/vibe-coding-deploy-errors-vercel-supabase-2026\/"},"modified":"2026-11-01T11:08:54","modified_gmt":"2026-11-01T03:08:54","slug":"vibe-coding-deploy-errors-vercel-supabase-2026","status":"publish","type":"post","link":"https:\/\/junai.ai\/blog\/vibe-coding-deploy-errors-vercel-supabase-2026\/","title":{"rendered":"\ub85c\uceec\uc5d0\uc120 \ub418\ub294\ub370 \ubc30\ud3ec\ud558\uba74 \uc5d0\ub7ec? \ubc14\uc774\ube0c\ucf54\ub529 \ubc30\ud3ec \uc624\ub958 7\uac00\uc9c0 \ud574\uacb0\ubc95"},"content":{"rendered":"\n<!-- WordPress REST API \ubc1c\ud589\uc6a9 HTML (\uc790\ub3d9 \uc0dd\uc131) -->\n<!-- WP-FEATURED-MEDIA-ID: 1247 -->\n<div style=\"max-width:800px;margin:0 auto;\">\n<style>\n:root{\n  --color-primary:#4f46e5;--color-accent:#6366f1;--color-bg:#fafbfc;--color-bg-card:#ffffff;\n  --color-text:#1a202c;--color-text-muted:#64748b;--hero-start:#1e1b4b;--hero-end:#4338ca;\n  --code-bg:#0f172a;--code-fg:#e2e8f0;\n  --font-body:-apple-system,BlinkMacSystemFont,'Apple SD Gothic Neo','Malgun Gothic',sans-serif;\n  --size-body:17px;--line-height:1.75;--h1-size:38px;--h2-size:28px;\n}\n*{box-sizing:border-box;}\np,li,dd,th,td,caption,figcaption,blockquote,h1,h2,h3,h4{overflow-wrap:break-word;}\ncode{overflow-wrap:anywhere;}\n.wrap{max-width:780px;margin:0 auto;padding:0 20px 60px;}\n.hero{background:linear-gradient(135deg,var(--hero-start) 0%,var(--hero-end) 100%);color:#fff;padding:52px 20px 46px;margin-bottom:34px;}\n.hero-inner{max-width:780px;margin:0 auto;}\n.tag{display:inline-block;padding:5px 13px;border-radius:999px;background:rgba(167,139,250,.22);color:#c4b5fd;font-size:13.5px;font-weight:700;margin-bottom:16px;}\nh1{font-size:var(--h1-size);line-height:1.36;letter-spacing:-0.025em;margin:0 0 16px;font-weight:800;}\n.hero p{margin:0;font-size:17.5px;color:#ddd6fe;line-height:1.7;}\nh2{font-size:var(--h2-size);line-height:1.4;letter-spacing:-0.025em;margin:52px 0 18px;padding-left:14px;border-left:5px solid var(--color-primary);font-weight:800;}\nh3{font-size:20px;margin:32px 0 10px;font-weight:700;color:#312e81;}\np{margin:0 0 17px;}\na{color:var(--color-primary);}\nimg{max-width:100%;height:auto;display:block;}\n.hero-img{width:100%;border-radius:14px;margin:0 0 30px;border:1px solid #e2e8f0;}\n.box{margin:24px 0;padding:19px 22px;border-radius:10px;background:#eef2ff;border-left:5px solid var(--color-accent);}\n.box p{margin:0 0 9px;font-size:16.2px;}\n.box p:last-child{margin:0;}\n.box strong{color:#3730a3;}\n.warn{background:#fff7ed;border-left-color:#f59e0b;}\n.warn strong{color:#b45309;}\npre{background:var(--code-bg);color:var(--code-fg);padding:18px 20px;border-radius:10px;overflow-x:auto;font-size:14.5px;line-height:1.65;margin:20px 0;white-space:pre;}\ncode{font-family:'SF Mono',Menlo,Consolas,monospace;}\np code,li code,td code{background:#eef2ff;color:#3730a3;padding:1px 6px;border-radius:5px;font-size:15px;}\nul,ol{padding-left:22px;margin:0 0 18px;}\nli{margin:0 0 8px;}\n.check li{list-style:none;margin-left:-22px;padding-left:28px;position:relative;}\n.check li::before{content:\"\u25a1\";position:absolute;left:4px;color:var(--color-primary);font-weight:700;}\n.src{font-size:14.5px;color:var(--color-text-muted);}\n.related{margin:30px 0 0;padding:18px 22px;border:1px solid #e0e7ff;border-radius:12px;background:var(--color-bg-card);}\n.related p{margin:0;}\n.tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:22px 0;}\ntable{width:100%;border-collapse:collapse;font-size:15px;background:var(--color-bg-card);}\nth,td{padding:11px 12px;text-align:left;border-bottom:1px solid #e2e8f0;vertical-align:top;}\nth{background:#f1f5f9;font-weight:700;color:#0f172a;}\ntd:first-child,th:first-child{font-weight:700;}\n@media (max-width:560px){\n  .tablewrap table,.tablewrap thead,.tablewrap tbody,.tablewrap tr,.tablewrap th,.tablewrap td{display:block;width:auto;}\n  .tablewrap thead{display:none;}\n  .tablewrap tr{margin:0 0 14px;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;}\n  .tablewrap td{border:none;border-bottom:1px solid #f1f5f9;padding:9px 14px;}\n  .tablewrap td:first-child{background:#f1f5f9;font-weight:800;font-size:15.5px;}\n  .tablewrap td:last-child{border-bottom:none;}\n  .tablewrap td[data-label]::before{content:attr(data-label) \" \u2014 \";font-weight:700;color:var(--color-primary);}\n}\n@media (max-width:480px){\n  h1{font-size:27px;}\n  h2{font-size:22px;}\n  h3{font-size:18px;}\n.hero{padding:38px 16px 34px;}\n  pre{font-size:13px;padding:14px 14px;}\n}\n<\/style>\n<header class=\"hero\">\n  <div class=\"hero-inner\">\n    <span class=\"tag\">\ubc14\uc774\ube0c\ucf54\ub529 \u00b7 \ubc30\ud3ec<\/span>\n    <h1>\ub85c\uceec\uc5d0\uc120 \ub418\ub294\ub370 \ubc30\ud3ec\ud558\uba74 \uc5d0\ub7ec? \ubc14\uc774\ube0c\ucf54\ub529 \ubc30\ud3ec \uc624\ub958 7\uac00\uc9c0 \ud574\uacb0\ubc95<\/h1>\n    <p>Vercel\uc5d0 \uc62c\ub9ac\ub294 \uc21c\uac04 \ud130\uc9c0\ub294 \uc624\ub958\ub294 \uc0dd\uac01\ubcf4\ub2e4 \uc885\ub958\uac00 \uc801\ub2e4. \uc99d\uc0c1 7\uac00\uc9c0, \uac01\uac01 \uc5b4\ub514 \ub85c\uadf8\ub97c \uc5f4\uace0 AI\uc5d0\uac8c \ubb34\uc5c7\uc744 \ubd99\uc5ec\ub123\uc744\uc9c0 \uc815\ub9ac\ud588\ub2e4.<\/p>\n  <\/div>\n<\/header>\n<main class=\"wrap\">\n<img decoding=\"async\" class=\"hero-img\" src=\"https:\/\/junai.ai\/blog\/wp-content\/uploads\/2026\/11\/hero-4.png\" alt=\"\ucd08\ub85d \uccb4\ud06c \ud45c\uc2dc\uac00 \ub72c \ub178\ud2b8\ubd81\uacfc \ube68\uac04 \uacbd\uace0 \ud45c\uc2dc\uac00 \ub72c \ud074\ub77c\uc6b0\ub4dc \uc11c\ubc84\uac00 \uc810\uc120 \ubc30\ud3ec \ud654\uc0b4\ud45c\ub85c \uc774\uc5b4\uc9c4 \uc544\uc774\uc18c\uba54\ud2b8\ub9ad \uc77c\ub7ec\uc2a4\ud2b8\">\n\n<p><code>components\/UserCard.tsx<\/code>\ub77c\ub294 \ud30c\uc77c\uc744 <code>import UserCard from '.\/usercard'<\/code>\ub85c \ubd88\ub7ec\uc624\uba74 \uc5b4\ub5bb\uac8c \ub420\uae4c. \ub9e5\uc774\ub098 \uc708\ub3c4\uc6b0 \ub178\ud2b8\ubd81\uc5d0\uc11c\ub294 \uc544\ubb34 \uc77c\ub3c4 \uc5c6\ub2e4. Vercel\uc5d0\uc11c\ub294 \ube4c\ub4dc\uac00 \uba48\ucd98\ub2e4. Vercel \uacf5\uc2dd \uac00\uc774\ub4dc\uac00 &#8216;module not found&#8217; \uc624\ub958\uc758 \ub300\ud45c \uc6d0\uc778\uc73c\ub85c \ub4dc\ub294 \ubc14\ub85c \uadf8 \uc608\uc2dc\ub2e4.<\/p>\n<p>\ubc14\uc774\ube0c\ucf54\ub529 \ubc30\ud3ec \uc624\ub958\uc758 \ub300\ubd80\ubd84\uc740 \uc774\ub7f0 \uc2dd\uc774\ub2e4. \ucf54\ub4dc\uac00 \ud2c0\ub838\ub2e4\uae30\ubcf4\ub2e4, <strong>\ub0b4 \ucef4\ud4e8\ud130\uac00 \ub108\ubb34 \uad00\ub300\ud588\ub2e4<\/strong>. \ub85c\uceec\uc740 \ub300\uc18c\ubb38\uc790\ub97c \ubd10\uc8fc\uace0, <code>.env.local<\/code>\uc5d0 \uc801\uc5b4 \ub454 \ube44\ubc00\uac12\uc744 \uc54c\uc544\uc11c \uc77d\uc5b4 \uc8fc\uace0, \ud14c\uc2a4\ud2b8\ud558\ub358 \uacc4\uc815\uc740 \uc774\ubbf8 \ub85c\uadf8\uc778\ub3fc \uc788\ub2e4. \ubc30\ud3ec \ud658\uacbd\uc740 \uc774 \uc14b\uc744 \uc804\ubd80 \uac77\uc5b4\ub0b8\ub2e4. \uc544\ub798 7\uac00\uc9c0\ub294 \uadf8 \uad00\ub300\ud568\uc774 \uc0ac\ub77c\uc9c0\ub294 \uc9c0\uc810\ubcc4\ub85c \ubb36\uc5c8\ub2e4.<\/p>\n\n<h2>\uc5d0\ub7ec \uba54\uc2dc\uc9c0\ubcf4\ub2e4 \uba3c\uc800 \ubcfc \uac83: \ub85c\uadf8\uac00 \uc5b4\ub514 \uc788\ub098<\/h2>\n<p>AI\uc5d0\uac8c &#8220;\ubc30\ud3ec\uac00 \uc548 \ub3fc\uc694&#8221;\ub77c\uace0\ub9cc \uc4f0\uba74 \uc77c\ubc18\ub860\uc774 \ub3cc\uc544\uc628\ub2e4. \uc99d\uc0c1\ub9c8\ub2e4 \uc5f4\uc5b4\uc57c \ud560 \ucc3d\uc774 \ub2e4\ub974\ub2e4.<\/p>\n<div class=\"tablewrap\"><table>\n<thead><tr><th>\uc99d\uc0c1<\/th><th>\uba3c\uc800 \uc5f4 \uacf3<\/th><th>\ucc3e\uc744 \uac83<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>\ubc30\ud3ec\uac00 Error \uc0c1\ud0dc\ub85c \ub05d\ub0a8<\/td><td data-label=\"\uba3c\uc800 \uc5f4 \uacf3\">Vercel \ud504\ub85c\uc81d\ud2b8 \u2192 Deployments \u2192 \uc2e4\ud328\ud55c \ubc30\ud3ec \u2192 Building \ub85c\uadf8<\/td><td data-label=\"\ucc3e\uc744 \uac83\">\ube68\uac04 Error \uc904 \uc911 <strong>\ub9e8 \ucc98\uc74c<\/strong> \uac83<\/td><\/tr>\n<tr><td>\ubc30\ud3ec\ub294 \ub410\ub294\ub370 \ud654\uba74\u00b7API\uac00 \uae68\uc9d0<\/td><td data-label=\"\uba3c\uc800 \uc5f4 \uacf3\">\ube0c\ub77c\uc6b0\uc800 \uac1c\ubc1c\uc790\ub3c4\uad6c Console\u00b7Network, Vercel Logs \ud0ed<\/td><td data-label=\"\ucc3e\uc744 \uac83\">\uc2e4\ud328\ud55c \uc694\uccad\uc758 \uc0c1\ud0dc \ucf54\ub4dc\uc640 \uc751\ub2f5 \ubcf8\ubb38<\/td><\/tr>\n<tr><td>\ub370\uc774\ud130\uac00 \ube44\uc5b4 \uc788\uc74c\u00b7\uad8c\ud55c \uc624\ub958<\/td><td data-label=\"\uba3c\uc800 \uc5f4 \uacf3\">Network \ud0ed\uc758 Supabase \uc694\uccad, Supabase \ub300\uc2dc\ubcf4\ub4dc Logs<\/td><td data-label=\"\ucc3e\uc744 \uac83\">200\uc778\ub370 <code>[]<\/code>\uc778\uc9c0, 401\u00b7403\u00b7<code>42501<\/code>\uc778\uc9c0<\/td><\/tr>\n<\/tbody><\/table><\/div>\n<p>\ube4c\ub4dc \ub85c\uadf8\uc5d0\uc11c \ud558\ub098 \uae30\uc5b5\ud560 \uc810. Vercel \ubb38\uc11c\ub294 <strong>\ub9c8\uc9c0\ub9c9 Error \uc904\uc774 \uc6d0\uc778\uc744 \ub9d0\ud574 \uc8fc\uc9c0 \uc54a\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4<\/strong>\uace0 \uc801\ub294\ub2e4. <code>npm run build exited with 1<\/code> \uac19\uc740 \uc904\uc740 \uacb0\uacfc\uc77c \ubfd0\uc774\uace0, \uc9c4\uc9dc \uc6d0\uc778\uc740 \uba87 \uc904 \uc704\uc5d0 \uc788\ub2e4. \uadf8\ub798\uc11c AI\uc5d0\uac8c \ub118\uae38 \ub54c\ub294 \uccab Error \uc904 \uc704\uc544\ub798\ub97c \ud568\uaed8 \uc790\ub978\ub2e4. \ud15c\ud50c\ub9bf\uc740 \uc774\ub807\ub2e4.<\/p>\n<pre><code>[\uc0c1\ud669] Next.js \uc571\uc744 Vercel\uc5d0 \ubc30\ud3ec\ud588\ub354\ub2c8 (\ube4c\ub4dc \uc2e4\ud328 \/ \ubc30\ud3ec \ud6c4 OO \ud654\uba74 \uc624\ub958).\n\ub85c\uceec npm run build \uacb0\uacfc: (\uc131\uacf5 \/ \uac19\uc740 \uc624\ub958 \/ \uc548 \ud574 \ubd04)\n[\ud658\uacbd] Next.js \ubc84\uc804, Node \ubc84\uc804, \ub0b4 OS(Windows\/Mac), Supabase \uc0ac\uc6a9 \uc5ec\ubd80\n[\ub85c\uadf8] \uccab \ubc88\uc9f8 Error \uc904 \uae30\uc900 \uc704 15\uc904 + \uc544\ub798 5\uc904\n       (\ud0a4\u00b7\ud1a0\ud070\u00b7DB \uc8fc\uc18c\ub294 *** \ub85c \uac00\ub9bc)\n[\ud574 \ubcf8 \uac83] \ud658\uacbd\ubcc0\uc218 \ud655\uc778, \uc7ac\ubc30\ud3ec \ub4f1\n[\uc694\uccad] \uac00\ub2a5\uc131 \ub192\uc740 \uc6d0\uc778 3\uac1c\ub97c \uc21c\uc11c\ub300\ub85c, \uac01\uac01 \ud655\uc778 \ubc29\ubc95\uacfc \uc218\uc815 diff\ub85c.<\/code><\/pre>\n<div class=\"box warn\"><p><strong>\ube44\ubc00\uac12\uc740 \ucc44\ud305\ucc3d\uc5d0 \ubd99\uc774\uc9c0 \uc54a\ub294\ub2e4.<\/strong> \ub85c\uadf8\ub098 <code>.env<\/code> \ud30c\uc77c\uc744 \ud1b5\uc9f8\ub85c \ubcf5\uc0ac\ud558\uba74 Supabase secret \ud0a4, DB \ube44\ubc00\ubc88\ud638\uac00 \uac19\uc774 \ub538\ub824 \uac04\ub2e4. \ubcc0\uc218 <em>\uc774\ub984<\/em>\ub9cc \ub0a8\uae30\uace0 \uac12\uc740 <code>***<\/code>\ub85c \ubc14\uafbc\ub2e4. \uc774\ubbf8 \ubd99\uc5ec \ub123\uc5c8\ub2e4\uba74 \uadf8 \ud0a4\ub294 \uad50\uccb4(rotate)\ud558\ub294 \uac8c \uc548\uc804\ud558\ub2e4.<\/p><\/div>\n\n<h2>\ube4c\ub4dc \uc2e4\ud328 2\uac00\uc9c0: \ub300\uc18c\ubb38\uc790, \uadf8\ub9ac\uace0 \ud0c0\uc785<\/h2>\n<h3>\u2460 Module not found \u2014 \ud30c\uc77c\uba85 \ub300\uc18c\ubb38\uc790<\/h3>\n<p>Vercel \ube4c\ub4dc\ub294 \ub300\uc18c\ubb38\uc790\ub97c \uad6c\ubd84\ud558\ub294 \ub9ac\ub205\uc2a4 \ud30c\uc77c\uc2dc\uc2a4\ud15c\uc5d0\uc11c \ub3c8\ub2e4. \ub85c\uceec\uc5d0\uc11c \ud30c\uc77c\uba85\uc744 <code>usercard.tsx<\/code> \u2192 <code>UserCard.tsx<\/code>\ub85c \ubc14\uafe8\uc5b4\ub3c4 Git\uc740 \uadf8 \ubcc0\uacbd\uc744 \ub193\uce58\ub294 \uc77c\uc774 \uc7a6\ub2e4. \ud655\uc778\uc740 GitHub \uc800\uc7a5\uc18c \ud654\uba74\uc5d0\uc11c \uc2e4\uc81c \ud30c\uc77c\uba85\uc744 \ubcf4\ub294 \uac83. \uace0\uce60 \ub54c\ub294 Git\uc5d0\uac8c \uc9c1\uc811 \uc2dc\ud0a8\ub2e4.<\/p>\n<pre><code>git config core.ignorecase false\ngit mv components\/usercard.tsx components\/UserCard.tsx\ngit commit -m \"fix: \ud30c\uc77c\uba85 \ub300\uc18c\ubb38\uc790 \uc815\uc815\"<\/code><\/pre>\n<h3>\u2461 \ub85c\uceec dev\ub294 \ub418\ub294\ub370 build\uc5d0\uc11c Type error<\/h3>\n<p><code>npm run dev<\/code>\ub294 \ud0c0\uc785 \uc624\ub958\uac00 \uc788\uc5b4\ub3c4 \ud654\uba74\uc744 \ub744\uc6cc \uc900\ub2e4. <code>next build<\/code>\ub294 \ud0c0\uc785 \uac80\uc0ac\ub97c \ud1b5\uacfc\ud574\uc57c \ub05d\ub09c\ub2e4. AI\uac00 \ub9cc\ub4e0 \ucf54\ub4dc\uc5d0\uc11c \ud754\ud55c \uac8c <code>possibly 'null'<\/code>, \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uc18d\uc131 \uc811\uadfc\uc774\ub2e4. \ubc30\ud3ec \uc804\uc5d0 \ub85c\uceec\uc5d0\uc11c <code>npm run build<\/code>\ub97c \ud55c \ubc88 \ub3cc\ub9ac\ub294 \uac83, Vercel \ubb38\uc11c\uac00 \uac00\uc7a5 \uba3c\uc800 \uad8c\ud558\ub294 \uc2b5\uad00\ub3c4 \uc774\uac83\uc774\ub2e4. AI\uc5d0\uac8c\ub294 &#8220;\ud0c0\uc785 \uac80\uc0ac\ub97c \ub044\uc9c0 \ub9d0\uace0 \uace0\uccd0 \ub2ec\ub77c&#8221;\uace0 \ubabb \ubc15\uc790. <code>ignoreBuildErrors: true<\/code>\ub85c \ub36e\ub294 \uc81c\uc548\uc774 \uaf64 \uc790\uc8fc \ub098\uc628\ub2e4.<\/p>\n\n<h2>\ud658\uacbd\ubcc0\uc218 2\uac00\uc9c0: \ub123\uc5c8\ub294\ub370 \uc65c undefined?<\/h2>\n<h3>\u2462 Vercel\uc5d0 \uc548 \ub123\uc5c8\uac70\ub098, \ub123\uace0 \uc7ac\ubc30\ud3ec\ub97c \uc548 \ud588\ub2e4<\/h3>\n<p><code>.env.local<\/code>\uc740 Git\uc5d0 \uc62c\ub77c\uac00\uc9c0 \uc54a\ub294\ub2e4(\uc62c\ub77c\uac00\uba74 \uc548 \ub41c\ub2e4). \uadf8\ub7ec\ub2c8 Vercel \ud504\ub85c\uc81d\ud2b8 Settings \u2192 Environment Variables\uc5d0 \uac19\uc740 \uc774\ub984\uc73c\ub85c \ub2e4\uc2dc \ub123\uc5b4\uc57c \ud55c\ub2e4. \uc5ec\uae30\uc11c \ub450 \ubc88 \ubbf8\ub044\ub7ec\uc9c4\ub2e4.<\/p>\n<ul>\n<li><strong>\uc2a4\ucf54\ud504<\/strong>: \ubcc0\uc218\ub9c8\ub2e4 Production\u00b7Preview\u00b7Development\ub97c \uace0\ub978\ub2e4. Production\ub9cc \uccb4\ud06c\ud558\uba74 \ube0c\ub79c\uce58 \ubbf8\ub9ac\ubcf4\uae30 \ubc30\ud3ec(Preview)\uc5d0\uc11c\ub294 \uac12\uc774 \uc5c6\ub2e4.<\/li>\n<li><strong>\uc7ac\ubc30\ud3ec<\/strong>: Vercel \ubb38\uc11c \ud45c\ud604 \uadf8\ub300\ub85c, \ud658\uacbd\ubcc0\uc218 \ubcc0\uacbd\uc740 <strong>\uc774\uc804 \ubc30\ud3ec\uc5d0 \uc801\uc6a9\ub418\uc9c0 \uc54a\uace0 \uc0c8 \ubc30\ud3ec\uc5d0\ub9cc<\/strong> \uc801\uc6a9\ub41c\ub2e4. \uc800\uc7a5 \ubc84\ud2bc\ub9cc \ub204\ub974\uace0 \uc0ac\uc774\ud2b8\ub97c \uc0c8\ub85c\uace0\uce68\ud558\uba74 \uadf8\ub300\ub85c\ub2e4. Deployments\uc5d0\uc11c Redeploy\ub97c \ub20c\ub7ec\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n<h3>\u2463 NEXT_PUBLIC_: \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ubabb \uc77d\uac70\ub098, \ub108\ubb34 \uc798 \uc77d\ud788\uac70\ub098<\/h3>\n<p>Next.js\uc5d0\uc11c \uc811\ub450\uc0ac \uc5c6\ub294 \ubcc0\uc218\ub294 \uc11c\ubc84\uc5d0\uc11c\ub9cc \uc77d\ud78c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8 \ucef4\ud3ec\ub10c\ud2b8\uc5d0\uc11c <code>process.env.SUPABASE_URL<\/code>\uc744 \uc4f0\uba74 undefined\uac00 \ub098\uc624\ub294 \uc774\uc720\ub2e4. \ubc18\ub300\ub85c <code>NEXT_PUBLIC_<\/code>\uc774 \ubd99\uc740 \uac12\uc740 <code>next build<\/code> \uc2dc\uc810\uc5d0 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ubc88\ub4e4 \uc548\uc5d0 <strong>\ubb38\uc790\uc5f4\ub85c \ubc15\ud78c\ub2e4<\/strong>. \ub450 \uac00\uc9c0\uac00 \ub530\ub77c\uc628\ub2e4.<\/p>\n<ul>\n<li>\uac12\uc744 \ubc14\uafe8\ub2e4\uba74 \ubc18\ub4dc\uc2dc \ub2e4\uc2dc \ube4c\ub4dc\ud574\uc57c \ud55c\ub2e4. \ube4c\ub4dc \ud6c4\uc5d0\ub294 \ubcc0\uacbd\uc5d0 \ubc18\uc751\ud558\uc9c0 \uc54a\ub294\ub2e4(Next.js \uacf5\uc2dd \ubb38\uc11c).<\/li>\n<li>\ubc88\ub4e4\uc740 \ub204\uad6c\ub098 \uc5f4\uc5b4 \ubcfc \uc218 \uc788\ub2e4. \ube44\ubc00 \ud0a4\uc5d0 <code>NEXT_PUBLIC_<\/code>\uc744 \ubd99\uc774\ub294 \uc21c\uac04 \uacf5\uac1c \uc815\ubcf4\uac00 \ub41c\ub2e4.<\/li>\n<\/ul>\n<pre><code>\/\/ lib\/supabase.ts \u2014 \ube0c\ub77c\uc6b0\uc800\uc6a9: URL\uacfc publishable \ud0a4\ub9cc\nimport { createClient } from '@supabase\/supabase-js'\n\nexport const supabase = createClient(\n  process.env.NEXT_PUBLIC_SUPABASE_URL!,\n  process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\n)<\/code><\/pre>\n\n<h2>Supabase 3\uac00\uc9c0: \uc5d0\ub7ec\uac00 \uc0ac\ub77c\uc9c0\ub294 \ud574\uacb0\ucc45\uc744 \uc870\uc2ec\ud558\ub77c<\/h2>\n<h3>\u2464 \uc5d0\ub7ec\ub294 \uc5c6\ub294\ub370 \ub370\uc774\ud130\uac00 \ube48 \ubc30\uc5f4 \u2014 RLS<\/h3>\n<p>\uac00\uc7a5 \ud5f7\uac08\ub9ac\ub294 \uc99d\uc0c1\uc774\ub2e4. Network \ud0ed\uc744 \ubcf4\uba74 \uc751\ub2f5\uc740 200, \ubcf8\ubb38\uc740 <code>[]<\/code>. Supabase \ubb38\uc11c\ub294 RLS\ub97c \ucf20 \ud14c\uc774\ube14\uc740 <strong>\uc815\ucc45\uc744 \ub9cc\ub4e4\uae30 \uc804\uae4c\uc9c0 publishable \ud0a4\ub85c\ub294 \uc544\ubb34 \ub370\uc774\ud130\ub3c4 \uc77d\uc744 \uc218 \uc5c6\ub2e4<\/strong>\uace0 \uc124\uba85\ud55c\ub2e4. \uc624\ub958\uac00 \uc544\ub2c8\ub77c \ube48 \uacb0\uacfc\ub85c \ub3cc\uc544\uc628\ub2e4. \ub85c\uceec\uc5d0\uc11c \uc798 \ubcf4\uc600\ub2e4\uba74 SQL \ud3b8\uc9d1\uae30\ub098 \uad00\ub9ac\uc790 \uad8c\ud55c\uc73c\ub85c \ud655\uc778\ud588\uae30 \ub54c\ubb38\uc778 \uacbd\uc6b0\uac00 \ub9ce\ub2e4. <code>42501<\/code> \uc624\ub958\uac00 \ub72c\ub2e4\uba74 \uacb0\uc774 \ub2e4\ub974\ub2e4. \uc815\ucc45 \uc774\uc804 \ub2e8\uacc4\uc778 \ud14c\uc774\ube14 \uad8c\ud55c(grant)\uc774 \ube60\uc84c\ub2e4\ub294 \ub73b\uc774\ub2e4.<\/p>\n<pre><code>alter table public.todos enable row level security;\n\ncreate policy \"\ubcf8\uc778 \ud560 \uc77c\ub9cc \uc870\ud68c\"\non public.todos for select\nto authenticated\nusing ( (select auth.uid()) = user_id );<\/code><\/pre>\n<p>\uc5ec\uae30\uc11c AI\uac00 \uc790\uc8fc \ub0b4\ub193\ub294 \uc9c0\ub984\uae38\uc774 \ub450 \uac1c \uc788\ub2e4. &#8220;RLS\ub97c \ub044\uc138\uc694&#8221;, \uadf8\ub9ac\uace0 &#8220;service_role \ud0a4\ub97c \uc4f0\uc138\uc694&#8221;. \ub458 \ub2e4 \uc5d0\ub7ec\ub97c <em>\uc815\ub9d0\ub85c<\/em> \uc5c6\uc560 \uc900\ub2e4. \ubb38\uc81c\ub294 \ub300\uac00\ub2e4. 2025\ub144 \ubcf4\uc548 \uc5f0\uad6c\uc790 \ub9e4\ud2b8 \ud30c\uba38\uac00 Lovable \uc1fc\ucf00\uc774\uc2a4 \uc571 1,645\uac1c\ub97c \uc0b4\ud3b4\ubd24\ub354\ub2c8 170\uac1c(\uc57d 10%), \uc5d4\ub4dc\ud3ec\uc778\ud2b8 303\uacf3\uc5d0\uc11c Supabase \ud14c\uc774\ube14\uc744 \uc678\ubd80\uc778\uc774 \uc77d\uac70\ub098 \uc4f8 \uc218 \uc788\uc5c8\ub2e4(CVE-2025-48757). \uc5d0\ub7ec\uac00 \uc5c6\ub294 \uc0c1\ud0dc\uc640 \uc548\uc804\ud55c \uc0c1\ud0dc\ub294 \ub2e4\ub974\ub2e4.<\/p>\n<h3>\u2465 \ud0a4\ub97c \uc798\ubabb \ub4e4\uace0 \ub098\uac14\ub2e4 \u2014 publishable vs secret<\/h3>\n<p>2026\ub144 \ud604\uc7ac Supabase \ub300\uc2dc\ubcf4\ub4dc\uc758 \ud0a4 \uc774\ub984\uc740 <strong>publishable \ud0a4<\/strong>(<code>sb_publishable_...<\/code>)\uc640 <strong>secret \ud0a4<\/strong>(<code>sb_secret_...<\/code>)\ub2e4. \uc608\uc804\uc758 anon\u00b7service_role\uc740 \uac01\uac01\uc758 \ub808\uac70\uc2dc \ubc84\uc804\uc774\uace0, \uacf5\uc2dd \ubb38\uc11c\ub294 \uc774 \ub808\uac70\uc2dc \ud0a4\ub97c <strong>2026\ub144 \ub9d0\uae4c\uc9c0 \ud3d0\uae30<\/strong>\ud55c\ub2e4\uace0 \ubc1d\ud78c\ub2e4. \uc544\uc9c1 \ub3d9\uc791\ud558\uc9c0\ub9cc \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub77c\uba74 \uc0c8 \uc774\ub984\uc73c\ub85c \uac00\ub294 \ud3b8\uc774 \ub0ab\ub2e4.<\/p>\n<div class=\"tablewrap\"><table>\n<thead><tr><th>\ud0a4<\/th><th>\ube0c\ub77c\uc6b0\uc800\uc5d0 \ub46c\ub3c4 \ub418\ub098<\/th><th>RLS<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>publishable (\uad6c anon)<\/td><td data-label=\"\ube0c\ub77c\uc6b0\uc800\uc5d0 \ub46c\ub3c4 \ub418\ub098\">\ub41c\ub2e4<\/td><td data-label=\"RLS\">\uc801\uc6a9\ub428<\/td><\/tr>\n<tr><td>secret (\uad6c service_role)<\/td><td data-label=\"\ube0c\ub77c\uc6b0\uc800\uc5d0 \ub46c\ub3c4 \ub418\ub098\">\uc808\ub300 \uc548 \ub428 \u2014 \uc11c\ubc84 \ucf54\ub4dc\u00b7Vercel \ud658\uacbd\ubcc0\uc218(\uc811\ub450\uc0ac \uc5c6\uc774)\uc5d0\ub9cc<\/td><td data-label=\"RLS\">\uc6b0\ud68c\ud568<\/td><\/tr>\n<\/tbody><\/table><\/div>\n<p>\ucc38\uace0\ub85c Supabase\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \ubcf4\ub0b8 secret \ud0a4 \uc694\uccad\uc744 401\ub85c \uac70\uc808\ud55c\ub2e4. \uc774 401\uc744 \ubcf4\uace0 &#8220;\ud0a4\ub97c \ub2e4\ub978 \ub370 \uc228\uae30\uba74 \ub418\ub098&#8221; \ubb3b\ub294 \ub300\uc2e0, \uadf8 \uc791\uc5c5\uc744 \uc11c\ubc84(Route Handler)\ub85c \uc62e\uae30\ub294 \uac8c \uc815\ub2f5\uc774\ub2e4.<\/p>\n<h3>\u2466 \ub85c\uadf8\uc778\ud558\uba74 localhost:3000\uc73c\ub85c \ud295\uae34\ub2e4 \u2014 \ub9ac\ub2e4\uc774\ub809\ud2b8 URL<\/h3>\n<p>\ub9e4\uc9c1 \ub9c1\ud06c\ub098 \uc18c\uc15c \ub85c\uadf8\uc778\uc744 \ub20c\ub800\ub354\ub2c8 \ubc30\ud3ec \uc8fc\uc18c\uac00 \uc544\ub2c8\ub77c <code>localhost:3000<\/code>\uc774 \uc5f4\ub9b0\ub2e4. Supabase Authentication\uc758 URL Configuration\uc5d0\uc11c <strong>Site URL<\/strong>\uc744 \uc2e4\uc81c \ub3c4\uba54\uc778\uc73c\ub85c \ubc14\uafb8\uace0, <strong>Redirect URLs<\/strong>\uc5d0 \ud5c8\uc6a9 \uc8fc\uc18c\ub97c \ucd94\uac00\ud55c\ub2e4. Vercel \ubbf8\ub9ac\ubcf4\uae30 \ubc30\ud3ec\uae4c\uc9c0 \uc4f0\ub824\uba74 \ubb38\uc11c\uac00 \uc81c\uc2dc\ud558\ub294 \uc640\uc77c\ub4dc\uce74\ub4dc <code>https:\/\/*-&lt;\ud300-\ub610\ub294-\uacc4\uc815-\uc2ac\ub7ec\uadf8&gt;.vercel.app\/**<\/code>\ub97c \ud568\uaed8 \ub123\ub294\ub2e4. \ucf54\ub4dc\uc5d0\uc11c\ub294 \ud604\uc7ac \uc8fc\uc18c \uae30\uc900\uc73c\ub85c \ub118\uae34\ub2e4.<\/p>\n<pre><code>await supabase.auth.signInWithOtp({\n  email,\n  options: { emailRedirectTo: `${window.location.origin}\/auth\/callback` }\n})<\/code><\/pre>\n<p>\ucee4\uc2a4\ud140 \ub3c4\uba54\uc778\uc744 \uc5f0\uacb0\ud588\ub2e4\uba74 \uadf8 \ub3c4\uba54\uc778\ub3c4 Redirect URLs\uc5d0 \ucd94\uac00\ud588\ub294\uc9c0 \ub2e4\uc2dc \ubcf8\ub2e4. \ub3c4\uba54\uc778\uc744 \ubc14\uafbc \ub0a0 \ub85c\uadf8\uc778\uc774 \uae68\uc9c0\ub294 \uc774\uc720\ub294 \ub300\ubd80\ubd84 \uc5ec\uae30\ub2e4.<\/p>\n\n<h2>\ubc30\ud3ec \uc804 5\ubd84 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h2>\n<ul class=\"check\">\n<li>\ub85c\uceec\uc5d0\uc11c <code>npm run build<\/code>\uac00 \ud1b5\uacfc\ud55c\ub2e4<\/li>\n<li>GitHub\uc5d0 \uc62c\ub77c\uac04 \ud30c\uc77c\uba85 \ub300\uc18c\ubb38\uc790\uac00 import \uacbd\ub85c\uc640 \uac19\ub2e4<\/li>\n<li><code>.env.local<\/code>\uc758 \ubcc0\uc218 \uc774\ub984\uc774 Vercel\uc5d0 \uc804\ubd80 \uc788\uace0, Production\u00b7Preview \uc2a4\ucf54\ud504\ub97c \ud655\uc778\ud588\ub2e4<\/li>\n<li>\ud658\uacbd\ubcc0\uc218\ub97c \ubc14\uafbc \ub4a4 Redeploy\ub97c \ub20c\ub800\ub2e4<\/li>\n<li><code>NEXT_PUBLIC_<\/code>\uc774 \ubd99\uc740 \uac12 \uc911 \ube44\ubc00\uc778 \uac83\uc774 \uc5c6\ub2e4<\/li>\n<li>public \ud14c\uc774\ube14\ub9c8\ub2e4 RLS\uac00 \ucf1c\uc838 \uc788\uace0, \ud544\uc694\ud55c \uc815\ucc45\uc774 \uc788\ub2e4<\/li>\n<li>Site URL\uacfc Redirect URLs\uc5d0 \uc2e4\uc81c \ub3c4\uba54\uc778\uc774 \ub4e4\uc5b4 \uc788\ub2e4<\/li>\n<\/ul>\n<p>\uc77c\uacf1 \uac1c\ub97c \ub2e4\uc2dc \ubcf4\uba74 \uacf5\ud1b5\uc810\uc774 \ud558\ub098 \uc788\ub2e4. \ubaa8\ub450 &#8220;\ub85c\uceec\uc5d0\uc11c\ub294 \uc544\ubb34\ub3c4 \ud655\uc778\ud558\uc9c0 \uc54a\ub358 \uac83&#8221;\uc774\ub2e4. \ub300\uc18c\ubb38\uc790, \ubcc0\uc218 \ubaa9\ub85d, \uad8c\ud55c, \uc8fc\uc18c. \ub2e4\uc74c \ubc30\ud3ec\uac00 \uc2e4\ud328\ud558\uba74 \uc5d0\ub7ec \uba54\uc2dc\uc9c0\ub97c \ud574\uc11d\ud558\uae30 \uc804\uc5d0 \uba3c\uc800 \uc9c8\ubb38\ud574 \ubcf4\uc790. \ub0b4 \ub178\ud2b8\ubd81\uc774 \uc774\ubc88\uc5d0\ub294 \ubb34\uc5c7\uc744 \ubd10\uc8fc\uace0 \uc788\uc5c8\ub098?<\/p>\n\n<div class=\"related\"><p>RLS\u00b7\ud0a4 \uad00\ub9ac\ub97c \ud3ec\ud568\ud55c \ubcf4\uc548 \uc810\uac80\uc744 \ub354 \uae4a\uac8c \ubcf4\ub824\uba74 \u2192 <a href=\"https:\/\/junai.ai\/blog\/vibe-coding-security-checklist-2026\/\" target=\"_blank\" rel=\"noopener\">\ubc14\uc774\ube0c\ucf54\ub529 \uc571 5,000\uac1c\uac00 \ub6ab\ub838\ub2e4 \u2014 \ubc30\ud3ec \uc804 \uccb4\ud06c\ub9ac\uc2a4\ud2b8 (2026)<\/a><\/p><\/div>\n\n<p class=\"src\">\ucc38\uace0: <a href=\"https:\/\/vercel.com\/docs\/environment-variables\" target=\"_blank\" rel=\"noopener\">Vercel \ud658\uacbd\ubcc0\uc218 \ubb38\uc11c<\/a> \u00b7 <a href=\"https:\/\/vercel.com\/docs\/deployments\/troubleshoot-a-build\" target=\"_blank\" rel=\"noopener\">Vercel \ube4c\ub4dc \uc624\ub958 \ud574\uacb0 \ubb38\uc11c<\/a> \u00b7 <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/environment-variables\" target=\"_blank\" rel=\"noopener\">Next.js \ud658\uacbd\ubcc0\uc218 \uac00\uc774\ub4dc<\/a> \u00b7 <a href=\"https:\/\/supabase.com\/docs\/guides\/api\/api-keys\" target=\"_blank\" rel=\"noopener\">Supabase API \ud0a4 \ubb38\uc11c<\/a> \u00b7 <a href=\"https:\/\/supabase.com\/docs\/guides\/database\/postgres\/row-level-security\" target=\"_blank\" rel=\"noopener\">Supabase RLS \ubb38\uc11c<\/a> \u00b7 <a href=\"https:\/\/supabase.com\/docs\/guides\/auth\/redirect-urls\" target=\"_blank\" rel=\"noopener\">Supabase \ub9ac\ub2e4\uc774\ub809\ud2b8 URL \ubb38\uc11c<\/a> (\ubaa8\ub450 2026-11-01 \ud655\uc778). Lovable \uc0ac\ub840 \uc218\uce58\ub294 \uc5f0\uad6c\uc790 \ub9e4\ud2b8 \ud30c\uba38 \uacf5\uac1c \uc790\ub8cc \uae30\uc900.<\/p>\n<\/main>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ubc14\uc774\ube0c\ucf54\ub529 \ubc30\ud3ec \uc624\ub958\ub97c Vercel\u00b7Supabase \uc99d\uc0c1\ubcc4\ub85c \uc815\ub9ac\ud588\uc2b5\ub2c8\ub2e4. \ube4c\ub4dc \uc2e4\ud328\u00b7\ud658\uacbd\ubcc0\uc218\u00b7RLS\u00b7\ub9ac\ub2e4\uc774\ub809\ud2b8, \uc5b4\ub514 \ub85c\uadf8\ub97c \ubcf4\uace0 AI\uc5d0\uac8c \ubb58 \ubd99\uc5ec\ub123\uc744\uc9c0\uae4c\uc9c0.<\/p>\n","protected":false},"author":1,"featured_media":1247,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-1252","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vibe-coding"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/1252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/comments?post=1252"}],"version-history":[{"count":0,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/posts\/1252\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media\/1247"}],"wp:attachment":[{"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/media?parent=1252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/categories?post=1252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/junai.ai\/blog\/wp-json\/wp\/v2\/tags?post=1252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}