Currency ์ฑ์ ์๋ก ๋์จ Tailwind v4๋ฅผ ์ ์ฉํด๋ณด๊ณ ์ถ์๋ค. ๊ธฐ์กด ์ฑ๋ค์ v3๋ฅผ ์ฐ๊ณ ์์๋๋ฐ, "๊ฐ๊ฐ ๋ฐ๋ก ๋น๋ํ๋๊น ์๊ด์๊ฒ ์ง"๋ผ๊ณ ์๊ฐํ๋ ๊ฒ ์ฐฉ๊ฐ์ด์๋ค. PostCSS ์ค์ ์ด ์ถฉ๋ํ๋ฉด์ ๋น๋๊ฐ ๋ง๊ฐ์ง๊ธฐ ์์ํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ค ๋ณด๋ ๊ฒฐ๊ตญ ์ ์ฒด monorepo ๊ตฌ์กฐ๋ฅผ ๋ฏ์ด๊ณ ์น๊ฒ ๋๋ค.

์ผ๋จ Tailwind v4 ์ ์ฉํ๋ ๊ฒ
Tailwind v4์ ์๋ก์ด CSS ์์ง์ด ๊ถ๊ธํด์ Currency ์ฑ์ ์ ์ฉํ ์ฝ๋๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ ์ค์ ๋ฐฉ๋ฒ์ด ๊ฝค ๋ฌ๋ผ์ ธ ์์๋ค.
// apps/currency/vite.config.ts
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
tailwindcss(), // v4๋ Vite ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ชจ๋ ๊ฑธ ์ฒ๋ฆฌ
]
})
๊ธฐ์กด v3์ฒ๋ผ ๋ณ๋์ PostCSS ํ๋ฌ๊ทธ์ธ์ด ํ์ ์๋ค๋ ๊ฒ ์ ๊ธฐํ๋ค. ์ผ๋จ ์ ์ฉํด๋ณด๋ ์ ๋์ํ๋ค. "์ด๊ฑฐ ์ฝ๋ค?"๋ผ๊ณ ์๊ฐํ๋๋ฐ ํฐ๋ณด ๋น๋๋ฅผ ๋๋ ค๋ณด๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
์ฒซ ๋ฒ์งธ ๋ฌธ์ : PostCSS ์ค์ ์ถฉ๋
ํฐ๋ณด๊ฐ ์ ์ฒด ์ฑ๋ค์ ๋น๋ํ ๋ PostCSS ์ค์ ์ด ๋ค์์ด๊ธฐ ์์ํ๋ค. Currency ์ฑ์ CSS๋ ์ ๋๋ก ์์ฑ๋๋๋ฐ, ๋ค๋ฅธ ์ฑ๋ค์ CSS๊ฐ ์ด์ํด์ก๋ค. ๋ก๊ทธ๋ฅผ ๋ณด๋ Tailwind v3์ v4์ PostCSS ์ฒ๋ฆฌ ๋ฐฉ์์ด ์๋ก ๊ฐ์ญํ๊ณ ์์๋ค. Currency ์ฑ์ ๋ณ๋์ PostCSS ์ค์ ์ ๋ง๋ค์ด์ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์์ ์ค ์์๋ค.
// apps/currency/postcss.config.js
export default {
plugins: [] // Tailwind v4๋ Vite์์ ์ฒ๋ฆฌํ๋๊น ๋น์๋์
}
ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์๋ค. ํฐ๋ณด๊ฐ ๋น๋ํ ๋ ๊ฐ ์ฑ์ node_modules๊ฐ ์๋ก ์ํฅ์ ์ฃผ๊ณ ์๋ ๊ฒ ๊ฐ์๋ค. LLM์ ๋ฌผ์ด๋ณด๋ "phantom dependencies" ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ํ๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ : ํจํค์ง ๊ฒฉ๋ฆฌ ๋ถ์กฑ
๋ฌธ์ ๋ฅผ ๋ ํ๋ณด๋ npm์ hoisting ๋๋ฌธ์ด์๋ค. ๊ฐ ์ฑ์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋๋ฐ, ์์กด์ฑ๋ค์ด ์์ด๋ฉด์ PostCSS ํ๋ฌ๊ทธ์ธ๋ค์ด ์์์น ๋ชปํ ๋ฐฉ์์ผ๋ก ๋ก๋๋๊ณ ์์๋ค. ๊ฒฐ๊ตญ ํจํค์ง ๊ฒฉ๋ฆฌ๊ฐ ๋ ์๊ฒฉํ pnpm์ผ๋ก ๊ฐ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ผ๋จ ์ค์ ๋ถํฐ ๋ง๋ค์ด๋ดค๋ค.
# pnpm-workspace.yaml
packages:
- 'apps/*'
# .pnpmrc
strict-peer-dependencies=false
auto-install-peers=true
shamefully-hoist=false # ์ด๊ฒ ํต์ฌ์ด์๋ค
store-dir=.pnpm-store
shamefully-hoist=false๊ฐ ์ค์ํ๋ค. ์ด ์ค์ ์ผ๋ก ๊ฐ ์ฑ์ ์์กด์ฑ์ด ์์ ํ ๊ฒฉ๋ฆฌ๋๋ค.
์ธ ๋ฒ์งธ ๋ฌธ์ : Turborepo ์ค์ ์ ๋ฏธ์คํฐ๋ฆฌ
pnpm์ผ๋ก ๋ฐ๊พธ๊ณ ๋๋ ์๋ก์ด ์๋ฌธ์ด ์๊ฒผ๋ค. ๊ณต์ ๋ฌธ์์ ๋์จ best pracice๋๋ก turbo.json ํ์ผ์ ์์ฑํ๋ค ๋ณด๋ ์ด์ํ๋ค.
{
"tasks": {
"build": {
"inputs": [
"src/**",
"public/**",
"*.json",
"postcss.config.*",
"vite.config.*"
]
}
}
}
๋ถ๋ช ํ ๋ด ํ๋ก์ ํธ์๋ apps/currency, apps/chat, apps/mbti ๊ฐ์ ํด๋๋ค์ด ์๋๋ฐ, ์ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ๋ก๊ฐ ์์๊น? ์ฒ์์๋ ์ด๋ ๊ฒ ์จ์ผ ํ๋ ์ค ์์๋ค:
"inputs": ["apps/currency/**", "apps/chat/**", "apps/mbti/**"]
ํฐ๋ณด๊ฐ ์ด๋ป๊ฒ ๋ด ์ฑ๋ค์ ์ฐพ๋์ง ๊ถ๊ธํด์ ์ฌ๋ฌ ์คํ์ ํด๋ดค๋ค.
์คํ 1: ํฐ๋ณด๊ฐ ๋ญ ๋ณด๊ณ ์๋?
npx turbo ls
์ด ๋ช ๋ น์ด๋ก ํฐ๋ณด๊ฐ ์ธ์ํ๋ ํจํค์ง๋ค์ ํ์ธํด๋ดค๋ค. ์ ๊ธฐํ๊ฒ๋ apps ํด๋ ์์ ๊ฒ๋ค๋ง ๋ํ๋ฌ๋ค. ๊ทธ๋ผ ํฐ๋ณด๊ฐ ์ด๋ป๊ฒ ์ด๊ฑธ ์์ง?
LLM์ ๋ฌผ์ด๋ณด๋ "์ํฌ์คํ์ด์ค ์ค์ ์ ์๋์ผ๋ก ๊ฐ์งํ๋ค"๊ณ ํ๋ค. ๊ทธ๋์ ๋ ์คํํด๋ดค๋ค.
์คํ 2: ์ํฌ์คํ์ด์ค ํจํด ํ ์คํธ
packages ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ํ ์คํธ ํจํค์ง๋ฅผ ์ถ๊ฐํด๋ดค๋ค. npx turbo ls๋ฅผ ๋ค์ ์คํํด๋ ์ ํจํค์ง๋ ๋ชฉ๋ก์ ์์๋ค.
๊ทธ๋ฐ๋ฐ pnpm-workspace.yaml์ packages/*๋ฅผ ์ถ๊ฐํ๊ณ ๋ค์ ์คํํ๋ ์ ํจํค์ง๊ฐ ๋ํ๋ฌ๋ค! ์ด์ ์ดํด๋๋ค. ํฐ๋ณด๋ ์ํฌ์คํ์ด์ค ์ค์ ์ ์ฝ๊ณ ๊ทธ์ ๋ฐ๋ผ ํจํค์ง๋ค์ ์ฐพ๋๋ค.
์ฆ, turbo.json์ postcss.config.* ํจํด์ ๊ฐ ์ฑ ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋์ ์ผ๋ก ์ ์ฉ๋๋ค๋ ๋ป์ด์๋ค. apps/currency/postcss.config.js, apps/chat/postcss.config.js ์ด๋ฐ ์์ผ๋ก.
๋ฌธ์ ํด๊ฒฐ์ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ
๋ชจ๋ ํผ์ฆ์ด ๋ง์ถฐ์ง๋ Currency ์ฑ์ Tailwind v4 ์ ์ฉ์ด ์๋ฒฝํ๊ฒ ์๋ํ๋ค.
- pnpm์ ์๊ฒฉํ ๊ฒฉ๋ฆฌ: shamefully-hoist=false๋ก ๊ฐ ์ฑ์ PostCSS ๊ด๋ จ ํจํค์ง๋ค์ด ์์ ํ ๋ถ๋ฆฌ๋จ
- ๋ ๋ฆฝ์ ์ธ PostCSS ์ค์ : Currency ์ฑ์ ๋น PostCSS ์ค์ , ๋ค๋ฅธ ์ฑ๋ค์ ๊ธฐ์กด v3 ์ค์ ์ ์ง
- ํฐ๋ณด์ ๊ฐ๋ณ ๋น๋: ๊ฐ ์ฑ์ด ์์ ์ ์ค์ ์ ๋ฐ๋ผ ๋ ๋ฆฝ์ ์ผ๋ก ๋น๋๋จ
์ต์ข ๋น๋ ํ๋ก์ฐ๋ ์ด๋ ๊ฒ ๋๋ค:
{
"scripts": {
"build-apps": "turbo run build",
"build": "pnpm run build-apps && next build",
"clean": "rm -rf public/static && rm -rf apps/*/node_modules && rm -rf apps/*/.next",
"dev": "pnpm run build-apps && next dev --turbopack"
}
}
๋จผ์ ํฐ๋ณด๊ฐ ๊ฐ ์ฑ์ ๊ฐ๋ณ์ ์ผ๋ก ๋น๋ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฉ์ธ Next.js ํ๋ก์ ํธ๊ฐ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์กฐ๊ฐ ๋๋ค.
์์์น ๋ชปํ ๋ถ๊ฐ ํจ๊ณผ๋ค
Currency ์ฑ์ Tailwind v4 ์ ์ฉ์ ์ํด ์์ํ ์์ ์ด์๋๋ฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ฒด monorepo๊ฐ ํจ์ฌ ๊ฒฌ๊ณ ํด์ก๋ค.
๋น๋ ์บ์ ๊ฐ์ : ๊ฐ ์ฑ์ ์ค์ ํ์ผ ๋ณ๊ฒฝ์ด ํด๋น ์ฑ์๋ง ์ํฅ์ ์ฃผ๊ฒ ๋๋ค. Currency ์ฑ์ Vite ์ค์ ์ ๋ฐ๊ฟ๋ ๋ค๋ฅธ ์ฑ๋ค์ ์บ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
์์กด์ฑ ์ถฉ๋ ํด๊ฒฐ: phantom dependencies ๋ฌธ์ ๊ฐ ์์ ํ ์ฌ๋ผ์ก๋ค. ๊ฐ ์ฑ์ด ์ ๋ง๋ก ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์์ ์คํ๋๋ค.
๊ฐ๋ฐ ๊ฒฝํ ํฅ์: ์๋ก์ด ์ฑ์ ์ถ๊ฐํ ๋ ๋ณ๋ ์ค์ ์ด ํ์ ์์ด์ก๋ค. apps ํด๋์ ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ณ package.json ์ถ๊ฐํ๋ฉด ํฐ๋ณด๊ฐ ์๋์ผ๋ก ์ธ์ํ๋ค.
์ฝ์งํ๋ฉด์ ๋ฐฐ์ด ๊ฒ๋ค
์ด๋ฒ ๊ฒฝํ์์ ๊ฐ์ฅ ํฐ ๊ตํ์ "์๋ํ๋ ๋๊ตฌ์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ"์ ์ค์์ฑ์ด์๋ค.
ํฐ๋ณด๊ฐ "์ํฌ์คํ์ด์ค๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๋ค"๋ ๋ฌธ์๋ง ๋ดค์ ๋๋ ๊ทธ๋ฅ '์ค ํธํ๋ค' ๋ผ๊ณ ๋ง ์๊ฐํ๋ค. ํ์ง๋ง ์ค์ ๋ก pnpm-workspace.yaml ํ์ผ์ ์ฝ๊ณ , ๊ธ๋ก๋ธ ํจํด์ ํ์ฅํ๊ณ , ๊ฐ ๋๋ ํ ๋ฆฌ์์ package.json์ ์ฐพ๋ ๊ตฌ์ฒด์ ์ธ ๊ณผ์ ์ด ์์๋ค.
์ด๋ฐ ๊ณผ์ ์ ์ดํดํ๊ณ ๋๋ Currency ์ฑ์ ํน๋ณํ PostCSS ์ค์ ์ด ์ด๋ป๊ฒ ๋ค๋ฅธ ์ฑ๋ค๊ณผ ๊ฒฉ๋ฆฌ๋๋์ง๋ ๋ช ํํด์ก๋ค. ๊ฐ ์ฑ์ ๋น๋ ํ๊ฒฝ์ด ์ง์ง๋ก ๋ ๋ฆฝ์ ์ด๋ผ๋ ํ์ ์ด ์๊ฒผ๋ค.
๋ง์น๋ฉฐ
Tailwind v4 ํ๋ ์ ์ฉํ๋ ค๋ค๊ฐ monorepo ์ ์ฒด๋ฅผ ๋ฏ์ด๊ณ ์น๊ฒ ๋์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํจ์ฌ ์ข์ ๊ตฌ์กฐ๋ฅผ ์ป์๋ค. Currency ์ฑ์ v4์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ณ , ๋ค๋ฅธ ์ฑ๋ค๋ ์์ ์ ์ผ๋ก v3๋ฅผ ๊ณ์ ์ธ ์ ์๋ค.
๋ฌด์๋ณด๋ค ์ด์ ๋ ์๋ก์ด ๊ธฐ์ ์ ์คํํ ๋ ๋ค๋ฅธ ์ฑ๋ค์๊ฒ ์ํฅ์ ์ค ๊ฑฑ์ ์ด ์์ด์ก๋ค. ๊ฐ ์ฑ์ด ์์ ํ ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์ ๊ฐ์ง๊ณ ์์ผ๋๊น.
์ฒ์์๋ ๋จ์ํ CSS ์ถฉ๋ ๋ฌธ์ ์๋๋ฐ, ํด๊ฒฐ ๊ณผ์ ์์ ํจํค์ง ๊ด๋ฆฌ์ ๋น๋ ์์คํ ๊น์ง ์ ๋๋ก ์ดํดํ๊ฒ ๋๋ค. ์ด๋ฐ ์์ผ๋ก ํ๋์ ๋ฌธ์ ๋ฅผ ๊น์ด ํ๋ค ๋ณด๋ฉด ๊ด๋ จ๋ ์์คํ ์ ์ฒด๋ฅผ ๋ฐฐ์ฐ๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค. ์๊ฐ์ ์ข ๊ฑธ๋ ธ์ง๋ง ๊ฐ์ง ๊ฒฝํ์ด์๋ค.
currency
junha.kr
'๐ Front > โ๏ธ React JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Next.js 15 instrumentation์ด ํ๋ก๋์ ์์ ์๋์๊ฐ๋ค๋ฉด (0) | 2025.06.20 |
|---|---|
| React-19 useActionState ์ดํด๋ณด๊ธฐ (0) | 2024.05.26 |
| [React] ๊น๋นก์ ํ์ ํด๊ฒฐ (useLayoutEffect, APIํธ์ถ) (0) | 2022.03.30 |
| virtual DOM ํํค์น๊ธฐ (0) | 2021.12.09 |
| React [๋ฆฌ๋ ๋๋ง ๊ณผ์ ] (0) | 2021.09.08 |