μ΄κΈ°μ μ½κ³ λΉ λ₯΄κ² λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ €κ³ 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 κ³μ μ΄ μ μ§λμλ μ§λ¦Ών(?) μκΈ° νμΆκΈ°μ μΈνλΌ λ°©μ΄μ κ΅¬μΆ μ€ν λ¦¬κ° μ΄μ΄μ§λλ€. π£ (μ§μ§ λλ¬Ό μμ΄ λ³Ό μ μλ λ©μ΄μ»€ μμ‘΄κΈ°μ λλ€...)