๐Ÿ‘‹ Supabase ์ด์‚ฌ์™€ ๋ฌด์ž๋น„ํ•œ ์บ์‹œ ์ตœ์ ํ™”

์•ˆ๋…•ํ•˜์„ธ์š”, ๋””์ž์ธ ์—”์ง€๋‹ˆ์–ด ์˜ฌ๋ฆฌ๋ธŒ์˜ˆ์š”. ๋กœ๊ณ ์ฐฉ์ฐฉ(Logochakchak) ์ œ์ž‘๊ธฐ 3ํŽธ์ด์—์š”.

์ดˆ๊ธฐ์—” ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  Notion(๋…ธ์…˜) DB๋ฅผ ์—ฐ๋™ํ•ด JSON ํŒŒ์ผ๋กœ ๋นŒ๋“œ ์‹œ์ ์— ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์„ ์“ฐ๊ธฐ๋กœ ๊ณ„ํšํ–ˆ์ง€๋งŒ, ์œ ์ €๋“ค์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋กœ๊ณ ๋ฅผ ์ œ๋ณดํ•˜๊ณ , ์ œ๊ฐ€ ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€์—์„œ ์ด๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ฆํ•˜๊ณ  ๋ฐ˜์˜ํ•˜๊ธฐ์—” ๋…ธ์…˜์€ ๋„ˆ๋ฌด๋‚˜ ๋А๋ฆฌ๊ณ  ์ •์ ์ธ ๋„๊ตฌ๋ผ๊ณ  ํŒ๋‹จํ•ด์„œ ์ง„์งœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)로 ๊ธ‰ ์„ ํšŒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. Notion์—์„œ Supabase๋กœ, ๋ฐ์ดํ„ฐ ๋Œ€์ด๋™ (Data Migration)

๊ณผ๊ฐํ•˜๊ฒŒ GitHub Actions์— ๋ฌผ๋ ค์žˆ๋˜ ๋…ธ์…˜ ๋™๊ธฐํ™” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ†ต์งธ๋กœ ๋‚ ๋ ค๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์˜์กด์„ฑ ํŒจํ‚ค์ง€(@notionhq/client)์™€ ๋‚ก์€ logos.json ํŒŒ์ผ๋„ ๊ฐ€์ฐจ ์—†์ด ํœด์ง€ํ†ต์œผ๋กœ ๋ณด๋ƒˆ์ฃ . (์‚ญ์ œํ•  ๋•Œ์˜ ์พŒ๊ฐ์ด๋ž€! ๐Ÿงน)

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž๋ฆฌ์— ์ง„์งœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(PostgreSQL)์ธ Supabase๋ฅผ ์•‰ํ˜”์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋งŒ ๋ฐ”๊พผ ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ œ ์†์œผ๋กœ 100% ํ†ต์ œํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ์˜ ์ฒด๊ธ‰ ์ž์ฒด๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

  • ํƒ€์ž… ๋งคํ•‘ ๋ฒ„๊ทธ์™€ 'ONLY PNG' ๋ฐฐ์ง€ ์ •์ƒํ™”: ์ดˆ๊ธฐ ์–ด๋“œ๋ฏผ์—์„œ "์ด ๋ธŒ๋žœ๋“œ๋Š” PNG๋งŒ ์žˆ์–ด์š”!"๋ผ๊ณ  ์ฒดํฌ๋ฅผ ํ•ด๋„ ์ž๊พธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณต์ค‘๋ถ„ํ•ด(undefined)๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Setup SQL ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ์„œ DB ์ปฌ๋Ÿผ์„ ์ƒˆ๋กœ ๊ณ ์น˜๊ณ , rowToBrand์™€ brandToRow ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ํƒ€์ž…์„ ์ด˜์ด˜ํ•˜๊ฒŒ ๋ณด๊ฐ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ฉ‹๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ธกํ•˜๋˜ ์ž„์‹œ๋ฐฉํŽธ ๋กœ์ง์„ ๋‹ค ๊ฑท์–ด๋‚ด๊ณ , ์˜ค์ง DB ์›๋ณธ(๋‹จ์ผ ์†Œ์Šค)์—๋งŒ ์˜์กดํ•ด 'ONLY PNG' ๋ฐฐ์ง€๋ฅผ ์˜ค์ฐจ ์—†์ด ์ •ํ™•ํ•˜๊ฒŒ ๋…ธ์ถœ์‹œํ‚ค๋Š” ์งœ๋ฆฟํ•จ์„ ๋ง›๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿท๏ธ
  • ใ„นใ„ฑ๋งŒ ์ณ๋„ ๋‚˜์˜ค๋Š” "์ดˆ์„ฑ ๊ฒ€์ƒ‰" ๊ตฌํ˜„: ๋…ธ์…˜ API๋กœ๋Š” ์ƒ์ƒ๋„ ํ•  ์ˆ˜ ์—†๋˜ ์ •๊ตํ•œ ๊ฒ€์ƒ‰ ๊ฒฝํ—˜๋„ ์„ ๋ฌผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋žœ๋“œ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ 'ํ•œ๊ธ€ ์ดˆ์„ฑ ๊ฒ€์ƒ‰์šฉ ํ•„๋“œ'๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ํ•จ๊ป˜ ์ €์žฅ๋˜๋„๋ก ์˜๋ฆฌํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ์œ ์ €๊ฐ€ ๊ฒ€์ƒ‰์ฐฝ์— ์ดˆ์„ฑ๋งŒ ํˆญํˆญ ์ณ๋„ ์›ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋ฒˆ๊ฐœ์ฒ˜๋Ÿผ ์ฐพ์•„์ฃผ๋Š” ๋Œ€๊ธฐ์—…๊ธ‰ ๊ฒ€์ƒ‰ UX๊ฐ€ ์™„์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ”

2. 1์ดˆ๊ฐ€ ์•„์‰ฌ์šด ๋ชจ๋ฐ”์ผ ์„ฑ๋Šฅ ๊ฐœ์„ : ๋ฌด์ž๋น„ํ•œ ์บ์‹ฑ๊ณผ ๋ Œ๋”๋ง ์ตœ์ ํ™”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์กŒ์œผ๋‹ˆ, ์ด์ œ ์œ ์ €์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์†๋„๋ฅผ ๊ทน๋„๋กœ ๋Œ์–ด์˜ฌ๋ฆด ์ฐจ๋ก€์˜€์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์˜ '๋กœ๊ณ ์ฐฉ์ฐฉ' ํ™ˆ ํŽ˜์ด์ง€๋Š” ์–ธ์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€”์ง€ ๋ชจ๋ฅด๋‹ˆ ๋งค ์š”์ฒญ๋งˆ๋‹ค DB๋ฅผ ํ†ต์งธ๋กœ ์ƒˆ๋กœ ์ฐŒ๋ฅด๋Š” force-dynamic ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š”? ์ฒซ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋‹ต๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ™ˆ ํ™”๋ฉด์— ๋ธŒ๋žœ๋“œ ์นด๋“œ๊ฐ€ ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๊ฐœ์”ฉ ๊น”๋ฆฌ๋Š”๋ฐ, ๊ทธ ๋ฌด๊ฑฐ์šด ๊ณ ํ™”์งˆ ๋กœ๊ณ  ์ด๋ฏธ์ง€๋“ค์ด ํ•œ ๋ฒˆ์— ๋””์ฝ”๋”ฉ๋˜๋А๋ผ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ์˜ TTI(Time to Interactiveยท์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„)๊ฐ€ ์ตœ์•…์„ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ด๋„ˆ๋กœ์„œ ์ด '๋ฒ„๋ฒ…๊ฑฐ๋ฆผ'์€ ์ ˆ๋Œ€ ์šฉ๋‚ฉํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ์—, ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ’€์ฝ”์Šค๋ฅผ ๋ฐŸ์•˜์Šต๋‹ˆ๋‹ค. ๐Ÿ‘‡

[ ๊ธฐ์กด ]  ๋งค ์š”์ฒญ๋งˆ๋‹ค DB ํ’€์ฟผ๋ฆฌ โ”€โ”€> ๋ชจ๋“  ์ด๋ฏธ์ง€ ๋™์‹œ ๋””์ฝ”๋“œ โ”€โ”€> ๋ชจ๋ฐ”์ผ ๋ฒ„๋ฒ…์ž„ ๐Ÿข
[ ๊ฐœ์„  ]  ISR (1์‹œ๊ฐ„ ๋‹จ์œ„ ์บ์‹œ) โ”€โ”€> Lazy Loading + Async Decoding โ”€โ”€> ๋ฒˆ๊ฐœ ๊ฐ™์€ ๋กœ๋”ฉ โšก
  • ISR(Incremental Static Regeneration) ๋„์ž…: ํ™ˆ ํŽ˜์ด์ง€์™€ ๋ธŒ๋žœ๋“œ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ 1์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์บ์‹ฑ(ISR)๋˜๋„๋ก ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ DB๋ฅผ ์ฐŒ๋ฅด๋Š” ๋Œ€์‹  ๋‹ค์ด๋‚ด๋ฏนํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ์ •์  ํŽ˜์ด์ง€๋ฅผ ๋˜์ ธ์ฃผ๋‹ˆ ์†๋„๊ฐ€ ์••๋„์ ์œผ๋กœ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง ์ตœ์ ํ™”: ๋ธŒ๋žœ๋“œ ๋กœ๊ณ  <img> ํƒœ๊ทธ์— loading="lazy"์™€ decoding="async"๋ฅผ ๊ธฐ๋ณธ ์žฅ์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ €์˜ ํ™”๋ฉด ์Šคํฌ๋กค์— ๋งž์ถฐ ํ•„์š”ํ•œ ๋กœ๊ณ ๋งŒ ๋น„๋™๊ธฐ๋กœ ๋””์ฝ”๋“œ๋˜๋„๋ก ์œ ๋„ํ•˜์—ฌ ๋ชจ๋ฐ”์ผ CPU์˜ ๋ถ€๋‹ด์„ ์‹น ๋œ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ํ–‰๋™ ์˜ˆ์ธก ๋ฐ์ดํ„ฐ ํ”„๋ฆฌํŽ˜์น˜(Prefetch): ์œ ์ €๊ฐ€ ๋ธŒ๋žœ๋“œ ์นด๋“œ์— ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜๊ฑฐ๋‚˜ ํ„ฐ์น˜ํ•˜๋Š” ์ˆœ๊ฐ„, ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฏธ๋ฆฌ ๋•ก๊ฒจ์˜ค๋„๋ก(prefetch) ์„ค์ •ํ•˜๊ณ , React cache๋ฅผ ์ ์šฉํ•ด ์ค‘๋ณต API ํ˜ธ์ถœ์„ ๋ง‰์•˜์Šต๋‹ˆ๋‹ค. ์œ ์ € ์ž…์žฅ์—์„œ๋Š” ํด๋ฆญํ•˜์ž๋งˆ์ž ํŽ˜์ด์ง€๊ฐ€ '์ฐฉ!' ํ•˜๊ณ  ๋œจ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด์ฃ . ๐Ÿฅฐ

3. "์–ด๋“œ๋ฏผ์ด ์ˆ˜์ •ํ•œ ๊ฒŒ ์™œ ์•ˆ ๋ฐ”๋€Œ์ฃ ?" ์บ์‹œ ๊ฒฝ๊ณ„ ์„ค๊ณ„์˜ ๊นจ๋‹ฌ์Œ

ํ•˜์ง€๋งŒ ์บ์‹œ(ISR)์˜ ๋‹ฌ์ฝคํ•จ์— ์ทจํ•ด์žˆ๋‹ค ๋ณด๋‹ˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์šด์˜ ์ด์Šˆ๊ฐ€ ํ„ฐ์กŒ์Šต๋‹ˆ๋‹ค. ์–ด๋“œ๋ฏผ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ œ๊ฐ€ ์ง์ ‘ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๋กœ๊ณ ๋ฅผ ์Šน์ธํ–ˆ๋Š”๋ฐ๋„, ์ •์ž‘ ํ™ˆ ํ™”๋ฉด์—๋Š” 1์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿคฏ

์›์ธ์„ ์ฐพ์•„๋ณด๋‹ˆ, ๊ด€๋ฆฌ์ž์šฉ ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€์™€ ์ผ๋ฐ˜ ์œ ์ €์šฉ ํ™ˆ ํŽ˜์ด์ง€๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•„์ฃผ ๊ฐ’์ง„ ์•„ํ‚คํ…์ฒ˜์  ๊ตํ›ˆ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. "๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ผ๋„ ๋ณด์—ฌ์ฃผ๋Š” 'ํ†ค(Tone)'๊ณผ '๋ชฉ์ '์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์บ์‹œ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค"๋Š” ๊ฒƒ์„์š”.

์ฆ‰์‹œ ์–ด๋“œ๋ฏผ ์ „์šฉ ์ „์šฉ API ์—”๋“œํฌ์ธํŠธ(/api/admin/brands)๋ฅผ ์™„์ „ํžˆ ์ƒˆ๋กœ ํŒŒ๋‚ด์–ด, ์ด ๋…€์„์€ ์บ์‹œ ์—†์ด ํ•ญ์ƒ ์‹ค์‹œ๊ฐ„ DB ๊ฐ’์„ ๊ธ์–ด์˜ค๋Š” force-dynamic์œผ๋กœ ์šด์˜๋˜๋„๋ก ๊ฒฉ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์œ ์ €๋“ค์€ 1์‹œ๊ฐ„ ์บ์‹œ๋œ ๋น ๋ฅธ ํ™”๋ฉด์„ ๋ณด๊ณ , ์–ด๋“œ๋ฏผ์ธ ์ €๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ๋™๊ธฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ฉฐ ์šด์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“Š

์˜ฌ๋ฆฌ๋ธŒ์˜ ํ•œ ์ค„ ์š”์•ฝ ๐Ÿ’ก

"๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์  ๊ณผ์‹œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์œ ์ €์—๊ฒŒ๋Š” ์ง€๋ฃจํ•œ '๊ธฐ๋‹ค๋ฆผ์˜ ์‹œ๊ฐ„'์„ ์ง€์›Œ์ฃผ๊ณ , ๋ฉ”์ด์ปค์—๊ฒŒ๋Š” '์ •ํ™•ํ•œ ์šด์˜ ๋ฐ์ดํ„ฐ'๋ฅผ ๋ณด์žฅํ•ด ์ฃผ๋Š” ์ผ, ์ด ๋˜ํ•œ ์™„๋ฒฝํ•œ ํ”„๋กœ๋•ํŠธ ๊ฒฝํ—˜(UX)์„ ์™„์„ฑํ•˜๋Š” ํ•ต์‹ฌ ํผ์ฆ์ž…๋‹ˆ๋‹ค."

์ด์–ด์ง€๋Š” [4ํŽธ]์—์„œ๋Š”... ํ‰ํ™”๋กญ๋˜ ์–ด๋А ๋‚ , ์™ธ๋ถ€ ์Šคํฌ๋žฉ๋ด‡์˜ ๋ฌด์ฐจ๋ณ„ ํ•ซ๋งํฌ ๊ณต๊ฒฉ์œผ๋กœ ์ธํ•ด ๋‹จ ํ•˜๋ฃจ ๋งŒ์— 130GB ๋Œ€์—ญํญ ํญํƒ„์„ ๋งž๊ณ  Vercel ๊ณ„์ •์ด ์ •์ง€๋˜์—ˆ๋˜ ์งœ๋ฆฟํ•œ(?) ์œ„๊ธฐ ํƒˆ์ถœ๊ธฐ์™€ ์ธํ”„๋ผ ๋ฐฉ์–ด์„  ๊ตฌ์ถ• ์Šคํ† ๋ฆฌ๊ฐ€ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๐Ÿ’ฃ (์ง„์งœ ๋ˆˆ๋ฌผ ์—†์ด ๋ณผ ์ˆ˜ ์—†๋Š” ๋ฉ”์ด์ปค ์ƒ์กด๊ธฐ์ž…๋‹ˆ๋‹ค...)

์˜ค๋Š˜๋„ ์ฝ์–ด ์ฃผ์…”์„œ ๊ณ ๋งˆ์›Œ์š”. ๋‹ค์Œ ํŽธ์—์„œ ๋งŒ๋‚˜์š”!