Skip to content

Draft โ€‹

B2B2C(Business to Business to Consumer) โ€‹

B2B2C๋Š” ๊ธฐ์—…์— ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ทธ ๊ธฐ์—…์„ ํ†ตํ•ด ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

  • ์„œ๋น„์Šค ์ œ๊ณต์ž โ†’ ๊ธฐ์—… โ†’ ์ตœ์ข… ์‚ฌ์šฉ์ž ํ๋ฆ„์„ ๊ฐ€์ง„ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ
  • ๊ธฐ์—… ๋‹จ์œ„๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ์ž๋Š” ๊ธฐ์—… ์†Œ์† ์‚ฌ์šฉ์ž๋“ค์ด๋‹ค.
  • SaaS, ์‚ฌ๋‚ด ์„œ๋น„์Šค, ํ”Œ๋žซํผ ์„œ๋น„์Šค์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.
  • ex.
    • ์„œ๋น„์Šค ์šด์˜์ž โ†’ ํšŒ์‚ฌ โ†’ ํšŒ์‚ฌ ์ง์›
    • ์„œ๋น„์Šค ์šด์˜์ž โ†’ ์Šคํ„ฐ๋”” โ†’ ์Šคํ„ฐ๋”” ๋ฉค๋ฒ„
    • ์„œ๋น„์Šค ์šด์˜์ž โ†’ ์ปค๋ฎค๋‹ˆํ‹ฐ โ†’ ์‚ฌ์šฉ์ž

๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ(Multi-tenancy) โ€‹

๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ๋Š” ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ๊ณ ๊ฐ(ํ…Œ๋„ŒํŠธ)์ด ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์ฒ˜๋Ÿผ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

  • ํ•˜๋‚˜์˜ ์„œ๋ฒ„ / ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค
  • ์—ฌ๋Ÿฌ ํšŒ์‚ฌ / ์กฐ์ง / ๊ทธ๋ฃน์ด ๋™์‹œ์— ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๋Š” ์„œ๋กœ ๋ถ„๋ฆฌ๋จ
  • SaaS์—์„œ ํ•ต์‹ฌ ๊ตฌ์กฐ
  • ex.
    • ํ•˜๋‚˜์˜ ์„œ๋น„์Šค์—์„œ ์—ฌ๋Ÿฌ Space ์šด์˜ ๊ฐ€๋Šฅ
    • ํšŒ์‚ฌ๋งˆ๋‹ค ์‚ฌ์šฉ์ž, ๋ชจ์ž„, ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

Package Manager โ€‹

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํŒจํ‚ค์ง€๋ฅผ ์–ด๋””์„œ ๊ฐ€์ ธ์˜ค๋Š”์ง€ (registry)
  • ๊ฐ€์ ธ์˜จ ๊ฑธ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋Š”์ง€ (node_modules ๊ตฌ์กฐ)

์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์ฐจ์ด๊ฐ€ ์„ฑ๋Šฅ๊ณผ ๋ชจ๋…ธ๋ ˆํฌ ์•ˆ์ •์„ฑ ์ฐจ์ด๋กœ ์ด์–ด์ง„๋‹ค.



npm vs yarn vs pnpm vs bun โ€‹

์ „๋ถ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ง€๋งŒ, ์„ค์น˜ ๋ฐฉ์‹ยท์†๋„ยท๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ยท๋ชจ๋…ธ๋ ˆํฌ ์นœํ™”์„ฑยทํ˜ธํ™˜์„ฑ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๋„๊ตฌ๋А๋‚Œ์žฅ์ ์•„์‰ฌ์šด ์ ์ถ”์ฒœ ์ƒํ™ฉ
npm๊ธฐ๋ณธ๊ฐ’Node ์„ค์น˜ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ๊ฐ€์žฅ ๋ณดํŽธ์ ์†๋„/๋””์Šคํฌ ํšจ์œจ์€ ์ƒ๋Œ€์ ์œผ๋กœ ํ‰๋ฒ”์ž…๋ฌธ, ์ž‘์€ ํ”„๋กœ์ ํŠธ, ๋ณ„ ์„ค์ • ์—†์ด ์‹œ์ž‘
yarn๊ธฐ๋Šฅ ๋งŽ์€ ์•ˆ์ •ํ˜•์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ฐ•ํ•จ, PnP/Zero-install ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊ฐœ๋…์ด ์กฐ๊ธˆ ๋งŽ๊ณ  ํŒ€ ์ ์‘ ํ•„์š”๋ชจ๋…ธ๋ ˆํฌ, ์—„๊ฒฉํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ
pnpmํšจ์œจ ํŠนํ™”๋น ๋ฅด๊ณ  ๋””์Šคํฌ ์ ˆ์•ฝ ํผ, ๋ชจ๋…ธ๋ ˆํฌ์— ๊ฐ•ํ•จ์ผ๋ถ€ ์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€์™€ ๊ถํ•ฉ ์ด์Šˆ ๊ฐ€๋Šฅ์‹ค๋ฌด ํŒ€ ํ”„๋กœ์ ํŠธ, ๋ชจ๋…ธ๋ ˆํฌ
bun์ดˆ๊ณ ์† ์‹ ํฅ ๊ฐ•์ž์„ค์น˜/์‹คํ–‰ ๋น ๋ฆ„, ๋Ÿฐํƒ€์ž„+๋ฒˆ๋“ค๋Ÿฌ+ํ…Œ์ŠคํŠธ ํฌํ•จNode ์ƒํƒœ๊ณ„ 100% ํ˜ธํ™˜์„ฑ์€ ๊ณ„์† ๊ฐœ์„  ์ค‘๊ฐœ์ธ ํ”„๋กœ์ ํŠธ, ์‹คํ—˜์ /๋น ๋ฅธ ๊ฐœ๋ฐœ

๋ชจ๋…ธ๋ ˆํฌ โ€‹

๋ชจ๋…ธ๋ ˆํฌ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ(์–ด๋“œ๋ฏผ, ์œ ์ € ํŽ˜์ด์ง€, ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ ๋“ฑ)๋ฅผ ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


๋ชจ๋…ธ๋ ˆํฌ ํˆด Turborepo โ€‹

์™œ Turborepo์ธ๊ฐ€?: โ€‹

Next.js๋ฅผ ๋งŒ๋“  Vercel์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.
์„ค์ •์ด ๋งค์šฐ ์‰ฝ๊ณ , ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ๊ฐ•๋ ฅํ•ด์„œ ํ•œ ๋ฒˆ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธํ•œ ๋ถ€๋ถ„์€ ๋‹ค์‹œ ์•ˆ ํ•ด๋„ ๋œ๋‹ค. (์‹œ๊ฐ„ ๋‹จ์ถ•์˜ ํ•ต์‹ฌ)

๊ตฌ์กฐ ์˜ˆ์‹œ: โ€‹

  • apps/user: ์œ ์ €์šฉ ์„œ๋น„์Šค (Next.js)
  • apps/admin: ์–ด๋“œ๋ฏผ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ (Next.js)
  • packages/ui: ๊ณตํ†ต ๋””์ž์ธ ์‹œ์Šคํ…œ (Shadcn ๋“ฑ)
  • packages/utils: ๊ณตํ†ต ํ•จ์ˆ˜ (API ํ†ต์‹  ๋กœ์ง ๋“ฑ)

Next.js๋ฅผ ์จ์•ผ ํ•˜๋Š” ์ด์œ  (Server Side Rendering) โ€‹

  • SEO: Next.js์˜ SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)์€ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • API ๋ณด์•ˆ: B2B2C ๊ตฌ์กฐ์—์„œ ํšŒ์‚ฌ๋ณ„ ๊ถŒํ•œ ์ฒดํฌ๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ์ƒ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ’€์Šคํƒ ๊ฐ€๋Šฅ์„ฑ: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(ํ™”์ƒํšŒ์˜, ์ผ์ • ๊ด€๋ฆฌ)์„ ๊ตฌํ˜„ํ•  ๋•Œ API Routes๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ๋กœ์ง์„ ๋ฐ”๋กœ ์งค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

node_modules ์ €์žฅ ๋ฐฉ์‹ โ€‹

npm / yarn classic (v1) โ€‹

less
ํ”„๋กœ์ ํŠธA/node_modules/react  (100MB)
ํ”„๋กœ์ ํŠธB/node_modules/react  (100MB)
ํ”„๋กœ์ ํŠธC/node_modules/react  (100MB)
โ†’ ๋˜‘๊ฐ™์€ ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ ์ˆ˜๋งŒํผ ์ค‘๋ณต ์ €์žฅ

pnpm โ€‹

less
~/.pnpm-store/react@18  (100MB, ๋”ฑ 1๋ฒˆ๋งŒ)
    โ†‘
ํ”„๋กœ์ ํŠธA/node_modules/react โ†’ ์‹ฌ๋งํฌ
ํ”„๋กœ์ ํŠธB/node_modules/react โ†’ ์‹ฌ๋งํฌ
ํ”„๋กœ์ ํŠธC/node_modules/react โ†’ ์‹ฌ๋งํฌ
โ†’ ์‹ค์ œ ํŒŒ์ผ์€ 1๊ฐœ, ๋‚˜๋จธ์ง€๋Š” ์ฐธ์กฐ๋งŒ

yarn berry (v2+, PnP ๋ชจ๋“œ) โ€‹

less
.yarn/cache/react.zip
  (์••์ถ• ์ƒํƒœ๋กœ ๋ณด๊ด€)
  โ†’
  node_modules
  ํด๋”
  ์ž์ฒด๊ฐ€
  ์—†์Œ
  โ†’
  ๋Ÿฐํƒ€์ž„์—
  zip์„
  ์ง์ ‘
  ์ฝ์Œ;

npm โ€‹

npm์€ Node.js์— ๊ธฐ๋ณธ ํฌํ•จ๋˜๋Š” ๊ฐ€์žฅ ํ‘œ์ค€์ ์ธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ„๋„ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ , ์ƒํƒœ๊ณ„ ๊ธฐ์ค€์  ์—ญํ• ์„ ํ•œ๋‹ค. npm์€ ์บ์‹œ๋ฅผ content-addressable cache ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

  • Node ๊น”๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ˜ธํ™˜์„ฑ ๊ฑฑ์ •์„ ๊ฐ€์žฅ ์ ๊ฒŒ ํ•ด๋„ ๋จ
  • pnpm์ด๋‚˜ bun๊ณผ ๋น„๊ตํ•˜๋ฉด ์„ค์น˜ ์ฒด๊ฐ์ด ๋œ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ
  • ๋Œ€๊ทœ๋ชจ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ๋” ํŽธํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

Yarn โ€‹