์๋ ํ์ธ์, ๋์์ธ ์์ง๋์ด ์ฌ๋ฆฌ๋ธ์์. ๋ก๊ณ ์ฐฉ์ฐฉ(Logochakchak) ์ ์๊ธฐ 3ํธ์ด์์.
๐ Supabase ์ด์ฌ์ ๋ฌด์๋นํ ์บ์ ์ต์ ํ
์ด๊ธฐ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ค๊ณ 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) ์ค์ ํ๊ณ , Reactcache๋ฅผ ์ ์ฉํด ์ค๋ณต API ํธ์ถ์ ๋ง์์ต๋๋ค. ์ ์ ์ ์ฅ์์๋ ํด๋ฆญํ์๋ง์ ํ์ด์ง๊ฐ '์ฐฉ!' ํ๊ณ ๋จ๋ ๋ง๋ฒ ๊ฐ์ ๊ฒฝํ์ ํ๊ฒ ๋ ๊ฒ์ด์ฃ . ๐ฅฐ
3. "์ด๋๋ฏผ์ด ์์ ํ ๊ฒ ์ ์ ๋ฐ๋์ฃ ?" ์บ์ ๊ฒฝ๊ณ ์ค๊ณ์ ๊นจ๋ฌ์
ํ์ง๋ง ์บ์(ISR)์ ๋ฌ์ฝคํจ์ ์ทจํด์๋ค ๋ณด๋ ์์์น ๋ชปํ ์ด์ ์ด์๊ฐ ํฐ์ก์ต๋๋ค. ์ด๋๋ฏผ ๋์๋ณด๋์์ ์ ๊ฐ ์ง์ ์คํ๋ฅผ ์์ ํ๊ฑฐ๋ ์ ๋ก๊ณ ๋ฅผ ์น์ธํ๋๋ฐ๋, ์ ์ ํ ํ๋ฉด์๋ 1์๊ฐ ๋์ ๋ฐ์๋์ง ์๋ ๊ฒ์ด์์ต๋๋ค! ๐คฏ
์์ธ์ ์ฐพ์๋ณด๋, ๊ด๋ฆฌ์์ฉ ์ด๋๋ฏผ ํ์ด์ง์ ์ผ๋ฐ ์ ์ ์ฉ ํ ํ์ด์ง๊ฐ ๋์ผํ ๋ฐ์ดํฐ ์๋ํฌ์ธํธ๋ฅผ ๊ณต์ ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ฃผ ๊ฐ์ง ์ํคํ ์ฒ์ ๊ตํ์ ์ป์์ต๋๋ค. "๋์ผํ ๋ฐ์ดํฐ๋ผ๋ ๋ณด์ฌ์ฃผ๋ 'ํค(Tone)'๊ณผ '๋ชฉ์ '์ด ๋ค๋ฅด๋ค๋ฉด ์บ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํด์ผ ํ๋ค"๋ ๊ฒ์์.
์ฆ์ ์ด๋๋ฏผ ์ ์ฉ ์ ์ฉ API ์๋ํฌ์ธํธ(/api/admin/brands)๋ฅผ ์์ ํ ์๋ก ํ๋ด์ด, ์ด ๋
์์ ์บ์ ์์ด ํญ์ ์ค์๊ฐ DB ๊ฐ์ ๊ธ์ด์ค๋ force-dynamic์ผ๋ก ์ด์๋๋๋ก ๊ฒฉ๋ฆฌํ์ต๋๋ค. ์ผ๋ฐ ์ ์ ๋ค์ 1์๊ฐ ์บ์๋ ๋น ๋ฅธ ํ๋ฉด์ ๋ณด๊ณ , ์ด๋๋ฏผ์ธ ์ ๋ ์ค์๊ฐ์ผ๋ก ์๋ฒฝํ๊ฒ ๋๊ธฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉฐ ์ด์ ํจ์จ์ ๊ทน๋ํํ ์ ์๊ฒ ๋์์ต๋๋ค. ๐
์ฌ๋ฆฌ๋ธ์ ํ ์ค ์์ฝ ๐ก
"๋ฐฑ์๋ ์ํคํ ์ฒ์ ์ฑ๋ฅ ์ต์ ํ๋ ๋จ์ํ ๊ธฐ์ ์ ๊ณผ์๊ฐ ์๋๋๋ค. ์ ์ ์๊ฒ๋ ์ง๋ฃจํ '๊ธฐ๋ค๋ฆผ์ ์๊ฐ'์ ์ง์์ฃผ๊ณ , ๋ฉ์ด์ปค์๊ฒ๋ '์ ํํ ์ด์ ๋ฐ์ดํฐ'๋ฅผ ๋ณด์ฅํด ์ฃผ๋ ์ผ, ์ด ๋ํ ์๋ฒฝํ ํ๋ก๋ํธ ๊ฒฝํ(UX)์ ์์ฑํ๋ ํต์ฌ ํผ์ฆ์ ๋๋ค."
์ด์ด์ง๋ [4ํธ]์์๋... ํํ๋กญ๋ ์ด๋ ๋ , ์ธ๋ถ ์คํฌ๋ฉ๋ด์ ๋ฌด์ฐจ๋ณ ํซ๋งํฌ ๊ณต๊ฒฉ์ผ๋ก ์ธํด ๋จ ํ๋ฃจ ๋ง์ 130GB ๋์ญํญ ํญํ์ ๋ง๊ณ Vercel ๊ณ์ ์ด ์ ์ง๋์๋ ์ง๋ฆฟํ(?) ์๊ธฐ ํ์ถ๊ธฐ์ ์ธํ๋ผ ๋ฐฉ์ด์ ๊ตฌ์ถ ์คํ ๋ฆฌ๊ฐ ์ด์ด์ง๋๋ค. ๐ฃ (์ง์ง ๋๋ฌผ ์์ด ๋ณผ ์ ์๋ ๋ฉ์ด์ปค ์์กด๊ธฐ์ ๋๋ค...)
์ค๋๋ ์ฝ์ด ์ฃผ์ ์ ๊ณ ๋ง์์. ๋ค์ ํธ์์ ๋ง๋์!