Skip to content

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ  โ€‹

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์งง์€ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„, ์ž‘์€ ์ธ์›, ๊ทธ๋ฆฌ๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฐ˜๋ณต์ ์ธ ๊ฐœ์„ ์ด ํ•ต์‹ฌ์ด ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ์Šคํƒ์„ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ ์ •์˜ ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค

  • ํŒ€์›์ด ๊ธฐ์กด์— ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ์ง„์ž… ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ 
  • ํ˜‘์—… ๊ณผ์ •์—์„œ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ
  • ๋ฐฐํฌ ๋ฐ ์šด์˜๊นŒ์ง€์˜ ํ๋ฆ„์ด ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ๋„๊ตฌ

์ด๋Ÿฌํ•œ ๋ฐฐ๊ฒฝ์—์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ๋“ค์„ ์„ ์ •ํ•˜๊ณ  ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

React & TypeScript โ€‹

alt text

React๋Š” UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ  ์—ญํ•  ๋ถ„๋‹ด์ด ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ํŒ€์›๋“ค์ด React์— ์ต์ˆ™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ํ•™์Šต ๊ธฐ๊ฐ„ ์—†์ด ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋„ ๋„“์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ’๋ถ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. TypeScript๋Š” ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜์—ฌ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—ฌ๋Ÿฌ ๋ช…์ด ๋™์‹œ์— ์ž‘์—…ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ TypeScript์˜ ํƒ€์ž… ์ •์˜๋Š” ๋ช…ํ™•ํ•œ ๊ณ„์•ฝ์„œ ์—ญํ• ์„ ํ•˜๋ฉฐ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ค„์ด๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

alt text

ํ•œํŽธ, ๋ชจ๋…ธ๋ ˆํฌ๋‚˜ ํ„ฐ๋ณด๋ ˆํฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋„ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ผ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์งง์€ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ์•ˆ์— ๋น ๋ฅด๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๋ณต์žกํ•œ ๋ ˆํฌ ๊ด€๋ฆฌ๋ณด๋‹ค ๋‹จ์ผ ๊ตฌ์กฐ์—์„œ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‹ค์šฉ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Tailwind vs Vanilla Extract โ€‹

alt text

์Šคํƒ€์ผ๋ง ๋„๊ตฌ๋กœ๋Š” Vanilla Extract์™€ Tailwind CSS๋ฅผ ๋‘๊ณ  ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. Vanilla Extract๋Š” ์Šคํƒ€์ผ๊ณผ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ๊น”๋”ํ•œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์—ฐ๋™๋˜์–ด ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ๋””์ž์ธ ํ† ํฐ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ๊ตฌํ˜„์— ์œ ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์  ์Šคํƒ€์ผ ์ถ”์ถœ ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ ๋ถ€๋‹ด๋„ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํฌ๋„ŒํŠธ์™€ ์Šคํƒ€์ผ ํŒŒ์ผ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ๋งฅ๋ฝ ํŒŒ์•…์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ณ , ํŒ€์›๋“ค์ด ์ด ํˆด์— ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์งง์€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ง„์ž… ์žฅ๋ฒฝ์ด ์žˆ๋Š” ๋„๊ตฌ์˜€์Šต๋‹ˆ๋‹ค.

Tailwind CSS๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์ด๋ผ ๋น ๋ฅธ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ์ง€๋งŒ, ํด๋ž˜์Šค๋ช…์ด ๋งŽ์•„์ง€๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ v4๋ถ€ํ„ฐ Rust ๊ธฐ๋ฐ˜ ์—”์ง„์ด ๋„์ž…๋˜๋ฉฐ ๋นŒ๋“œ ์†๋„๊ฐ€ ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ๊ณ , ์ตœ์‹  CSS ๊ธฐ๋Šฅ(JIT ์ตœ์ ํ™”, ์ปจํ…Œ์ด๋„ˆ ์ฟผ๋ฆฌ, OKLCH ์ƒ‰์ƒ ์‹œ์Šคํ…œ ๋“ฑ)์„ ์ง€์›ํ•˜๋ฉฐ ์ƒ์‚ฐ์„ฑ๊ณผ ๋””์ž์ธ ํ’ˆ์งˆ ๋ชจ๋‘์—์„œ ๊ธ์ •์ ์ธ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” cn, cva ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ ํด๋ž˜์Šค ๊ด€๋ฆฌ๋ฅผ ์ฒด๊ณ„ํ™”ํ•ด ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๋ฅผ ์–ด๋А ์ •๋„ ํ•ด์†Œํ–ˆ๊ณ , ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„์™€ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•ด ์ตœ์ข…์ ์œผ๋กœ Tailwind CSS๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Biome ๋„์ž… ๋ฐฐ๊ฒฝ โ€‹

alt text

๊ธฐ์กด์˜ ํฌ๋งคํ„ฐ์™€ ๋ฆฐํ„ฐ ์กฐํ•ฉ์ธ Prettier์™€ ESLint๋Š” ๊ฐ๊ฐ ์„ค์ •์ด ๋ณต์žกํ•˜๊ณ , ์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์„ค์ • ํŒŒ์ผ ๊ฐ„์˜ ์ถฉ๋Œ๋กœ ์ธํ•ด ๊ฐœ๋ฐœ ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ TypeScript ํ™˜๊ฒฝ์—์„œ๋Š” tsconfig์™€ eslint, prettier ์„ค์ • ๊ฐ„์˜ ์ถฉ๋Œ์„ ์กฐ์ •ํ•˜๋А๋ผ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋Š” ์ผ์ด ๋ฐ˜๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CI ํ™˜๊ฒฝ์—์„œ๋„ ๊ฐ๊ฐ์„ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Biome์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. Biome์€ Rust ๊ธฐ๋ฐ˜์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋ฉฐ, ํฌ๋งคํŒ…๊ณผ ๋ฆฐํŒ…์„ ํ•˜๋‚˜์˜ ๋„๊ตฌ๋กœ ํ†ตํ•ฉํ•ด ์„ค์ • ๋ณต์žก๋„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. .biome.json ํŒŒ์ผ ํ•˜๋‚˜๋กœ ํ•„์š”ํ•œ ์„ค์ •์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์—†์ด๋„ TypeScript์™€ JSX, React๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Prettier์™€ ์œ ์‚ฌํ•œ ํฌ๋งท ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, ์„ค์ • ๊ฐ„ ์ถฉ๋Œ์ด ๊ฑฐ์˜ ์—†๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋„ ๋ช…ํ™•ํ•ด ์œ ์ง€๋ณด์ˆ˜์— ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Biome ํ•˜๋‚˜๋งŒ์œผ๋กœ CI ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๊ณ , ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜๋„ ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Cloudflare Pages ์„ ์ • ์ด์œ  โ€‹

alt text

๋ฐฐํฌ ํ”Œ๋žซํผ์œผ๋กœ๋Š” Cloudflare Pages๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” CSR ๊ธฐ๋ฐ˜์˜ SPA๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Next.js์˜ SSR ๊ธฐ๋Šฅ์ด๋‚˜ Edge Function ์ตœ์ ํ™” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Vercel์˜ ๊ฐ•์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Vercel์€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ Organization Repository๋กœ ๋ฐฐํฌํ•  ๊ฒฝ์šฐ ์œ ๋ฃŒ ํ”Œ๋žœ์„ ์š”๊ตฌํ•ด ์ ‘๊ทผ์„ฑ์ด ๋–จ์–ด์กŒ๊ณ , Netlify ์—ญ์‹œ ์œ ์‚ฌํ•œ ์ œ์•ฝ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Cloudflare Pages๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜๋ฉฐ, Organization Repository๋„ ์ œํ•œ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub ์—ฐ๋™๋งŒ์œผ๋กœ ์ž๋™ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๊ณ , ๊ฐ PR๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” Preview ํ™˜๊ฒฝ์€ ํŒ€ ํ˜‘์—…์— ํฐ ๋„์›€์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ฐœ๋ฐœ์ž๋‚˜ ๋””์ž์ด๋„ˆ๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ URL์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ค„ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์„ค์ • ๊ณผ์ •์ด ์ง๊ด€์ ์ด๊ณ  ๋‹จ์ˆœํ•ด ๋ฐฐํฌ ๊ด€๋ฆฌ์˜ ๋ถ€๋‹ด์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ CDN ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌ ์†๋„๋„ ๋งค์šฐ ๋น ๋ฅด๊ณ , ๋ณ„๋„ ์„ค์ • ์—†์ด SSL ์ธ์ฆ์ด ์ž๋™ ์ ์šฉ๋˜๋Š” ์ ๋„ ์žฅ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  Vercel์ด๋‚˜ Netlify์— ๋น„ํ•ด ๋ฌธ์„œ๋‚˜ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๋‹ค์†Œ ๋ถ€์กฑํ•œ ํŽธ์ด์ง€๋งŒ, ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ SSR์ด ํ•„์š” ์—†๋Š” ์ •์  SPA์—๋Š” Cloudflare Pages๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฐฐํฌ, ์ž์œ ๋กœ์šด ํ˜‘์—… ํ™˜๊ฒฝ, ์‰ฌ์šด ์„ค์ • ๋“ฑ ๋ชจ๋“  ์กฐ๊ฑด์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ์ €ํฌ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉ์ ๊ณผ ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ํ”Œ๋žซํผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.