ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ชจ๋…ธ๋ ˆํฌ ๋„์ž… ํ›„๊ธฐ(Feat. Nx)
    TECH 2023. 8. 27. 17:49

    ์ตœ๊ทผ ๋ชจ๋…ธ๋ ˆํฌ๋ผ๋Š” ๊ฐœ๋…์ด ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ ์•ˆ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ชจ๋…ธ๋ ˆํฌ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค€๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

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

     

    ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์˜ ๊ฒฝํ—˜๊ณผ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

     

     

     

    ๋ชจ๋…ธ๋ ˆํฌ ๋„์ž… ๋ฐฐ๊ฒฝ

     

    ์šฐ์„  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „์˜ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

     

    .
    โ”œโ”€โ”€ AProject
    โ”œโ”€โ”€ BProject
    โ””โ”€โ”€ CProject

     

    • ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ํ˜•์‹์€ ๋ชจ๋…ธ๋ ˆํฌ๋ณด๋‹ค๋Š” ๋ชจ๋†€๋ฆฌ์‹
      • ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์•ˆ์— n๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Œ
      • ๋ชจ๋“  ํ”„๋ก ํŠธ์—”๋“œ์˜ ์ฝ”๋“œ์™€ ๋ฆฌ๋ทฐ๋Š” ํ•˜๋‚˜์˜ ๋ ˆํฌ์—์„œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Œ
      • ๋ชจ๋…ธ๋ ˆํฌ ํˆด๋ง ํ™˜๊ฒฝ(npm workspace, turborepo ๋“ฑ)์ด ์•„๋‹˜
      • ๋ชจ๋…ธ๋ ˆํฌ์˜ ์ด์ (๊ณตํ†ต ๋ชจ๋“ˆ, eslint ํ™˜๊ฒฝ ์„ค์ • ๋“ฑ)์€ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ

     

     

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

     

    ๋ชจ๋…ธ๋ ˆํฌ๋กœ ๊ฐ€๊ธฐ ์ „๊นŒ์ง€๋Š” ์—ฌ๋Ÿฌ ๋‚œ๊ด€๋“ค์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์ฒ˜์Œ ๋ชจ๋…ธ๋ ˆํฌ์˜ ํ•„์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ๋ถ€ํ„ฐ ์ด์•ผ๊ธฐํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

     

    img

     

    ๋ชจ๋…ธ๋ ˆํฌ์˜ ๊ฐœ๋…์„ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด๋ผ๋ฉด ์ด๋Ÿฐ ๊ทธ๋ฆผ์„ ์ •๋ง ๋งŽ์ด ๋ดค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

     

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฆฌ์•กํŠธ์˜ ๊ฐ™์€ custom hook์„ A ํ”„๋กœ์ ํŠธ, B ํ”„๋กœ์ ํŠธ, C ํ”„๋กœ์ ํŠธ ๊ฐ๊ฐ์— ์ž‘์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ›…์„ ๊ฐ„๋‹จํžˆ ํ•œ ์ค„๋งŒ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์—๋„ ์„ธ ํŒŒ์ผ์„ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด ์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

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

     

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

     

     

    ํŒ€์—์„œ ๋‚˜๋ˆˆ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

    1. ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๊ณตํ†ต ์ ์šฉ
    2. CRA ํ”„๋กœ์ ํŠธ๋ฅผ Vite๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
    3. ๋ชจ๋…ธ๋ ˆํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

     

     

    ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

     

    ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๊ฐ„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ณตํ†ต ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ yarn link ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. (๊ธฐ์กด ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € yarn ์‚ฌ์šฉ)

     

    yarn link ๋Š” ๋กœ์ปฌ์—์„œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ๋‹น์‹œ ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ๋Š” CI/CD ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  aws์— ์ง์ ‘ ํŒŒ์ผ์„ ์—…๋กœ๋“œ์— ๋ฐฐํฌํ•˜๋Š” ํ™˜๊ฒฝ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

     

    ๊ธฐ์กด์—๋Š” ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค hooks ํด๋”์—์„œ ๊ฐ๊ฐ ์ปค์Šคํ…€ ํ›…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋”๋ผ๋ฉด ๊ณตํ†ต ๋ชจ๋“ˆ ํ™˜๊ฒฝ ์„ธํŒ… ํ›„์—๋Š” Common์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์„ธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” hooks๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์–ด ๊ฐ™์€ ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์™€ ๋ฒ„์ „์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

    # before
    .
    โ”œโ”€โ”€ AProject
    โ”‚    โ””โ”€โ”€ hooks
    โ”œโ”€โ”€ BProject
    โ”‚    โ””โ”€โ”€ hooks
    โ””โ”€โ”€ CProject
        โ””โ”€โ”€ hooks
    
    # after
    .
    โ”œโ”€โ”€ AProject
    โ”œโ”€โ”€ BProject
    โ”œโ”€โ”€ CProject
    โ””โ”€โ”€ Common
        โ””โ”€โ”€ hooks

     

     

    ์ด ์Šคํ…์—์„œ react์˜ hook์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ Uncaught TypeError: Cannot read properties of null (reading 'useState')์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

     

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

     

     

    VITE ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

    VITE ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฐ๊ฒฝ

    ๋ชจ๋…ธ๋ ˆํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๊ธฐ ์ „, CRA → Vite ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋จผ์ € ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

    React ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ€์ด๋“œ ๋ถ€๋ถ„์— CRA์˜ ์•ˆ๋‚ด๊ฐ€ ๋น ์ง„ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. (์ฐธ๊ณ ) ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Next.js, Remix.js ๋“ฑ React ๊ธฐ๋ฐ˜ ๋ฉ”ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. React๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” Vite๋ฅผ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์ถ”์ฒœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์™ธ์—๋„ ์ €ํฌ ํŒ€์—์„œ๋Š” PostCSS ๋„์ž…์„ ํ–ˆ์œผ๋‚˜, CRA๋Š” PostCSS์˜ ์ปค์Šคํ…€ ํ™˜๊ฒฝ ์„ค์ •์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— eject๋ฅผ ํ•˜๊ฑฐ๋‚˜ eject ์—†์ด ์›นํŒฉ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” craco ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ฐธ๊ณ ) ํ”„๋ก ํŠธ์—”๋“œ ํŒ€ ๋‚ด์—์„œ๋„ ์ด์™€ ๊ด€๋ จํ•˜์—ฌ CRA๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ž๋Š” ๋…ผ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋˜ ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ์ฒ˜์Œ์—๋Š” CRA๋กœ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋…ธ๋ ˆํฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript๋กœ ์ž‘์„ฑ๋œ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ ๋„ JavaScript ํ”„๋กœ์ ํŠธ์—์„œ importํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. Turborepo์˜ ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋ฅผ TypeScript๋กœ, ํ”„๋กœ์ ํŠธ๋Š” JavaScript๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์˜ ์†”๋ฃจ์…˜์ด ๋‚˜์™€ ์žˆ๊ธด ํ•˜์˜€์œผ๋‚˜ Next.js์™€ Vite๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๋งŒ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

     

    Nx๋Š” CRA ํ”„๋กœ์ ํŠธ๋ฅผ Nx Workspace๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ์‹์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธด ํ–ˆ์ง€๋งŒ ์ด๋Š” ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ์˜€๊ณ , ๋ฉ€ํ‹ฐ๋ ˆํฌ๋ฅผ ๋ชจ๋…ธ๋ ˆํฌ ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ €ํฌ ํŒ€์˜ ์ƒํ™ฉ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์ •๋ณด์˜€์Šต๋‹ˆ๋‹ค.

     

    ๋”ฐ๋ผ์„œ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ Vite์˜ ๋นŒ๋“œ ์„ฑ๋Šฅ ๊ฐœ์„  ๋“ฑ์œผ๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ๋ชจ๋…ธ๋ ˆํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์šฉ์ดํ•˜๋‹ค๋Š” ์ ์„ ์ด์œ ๋กœ ๋ชจ๋…ธ๋ ˆํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํƒ€์ž„๋ผ์ธ์— CRA ํ”„๋กœ์ ํŠธ๋ฅผ Vite๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์Šคํ…์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

     

    VITE ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ์ด์Šˆ

    ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” ์ด ์„ธ ๊ฐœ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ํ™˜๊ฒฝ์ด ์ƒ์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    • AProject: webpack (CRA eject), JavaScript
    • BProject: CRA, craco, TypeScript
    • CProject: CRA craco, JavaScript

     

    ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ Vite ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋‹ค ๋ณด๋‹ˆ PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์—์„œ ์• ๋ฅผ ๋จน๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. AProject๋Š” webpack์—์„œ PostCSS ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— postcss.config.js๋กœ ์„ค์ •ํ•˜๋Š” BProject์™€ ๋‹ฌ๋ผ ์Šคํƒ€์ผ์ด ์ œ๋Œ€๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” AProject์— postcss.config.js ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    ํ”„๋กœ์ ํŠธ์—์„œ๋Š” glb์™€ zip ํ™•์žฅ์ž ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์„ Vite ๋นŒ๋“œ์— ํฌํ•จ์‹œํ‚ค๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋กœ์ปฌ์—์„œ ๊ด€๋ฆฌํ•˜๋˜ glb์™€ zip ํŒŒ์ผ๋“ค์„ AWS S3์— ์—…๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

     

     

     

    VITE ์ ์šฉ ํ›„

    ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ๋น„๊ตํ•ด ๋ณด์•˜์„ ๋•Œ CRA ํ™˜๊ฒฝ์—์„œ๋Š” ์•ฝ 144s ์†Œ์š”๋˜์—ˆ๋˜ ๋นŒ๋“œ ์‹œ๊ฐ„์„ Vite ํ™˜๊ฒฝ์—์„œ๋Š” ์•ฝ 24s๋กœ, 6๋ฐฐ ์ •๋„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์—๋„ ํ™•์‹คํžˆ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์†๋„๊ฐ€ ๋‹จ์ถ•๋˜์—ˆ๋Š”๋ฐ, CRA ํ™˜๊ฒฝ์—์„œ ๊ธธ๊ฒŒ๋Š” 10s ์ด์ƒ ์†Œ์š”๋˜์—ˆ๋˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด Vite ํ™˜๊ฒฝ์—์„œ๋Š” ์•ฝ 400ms๋กœ 25๋ฐฐ ๊ฐ€๋Ÿ‰ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ์ฝ”๋“œ ๋ณ€๊ฒฝ ํ›„ ์ €์žฅ ์‹œ์—๋„ CRA๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๋Š” ๋ฐ 3~5s ์†Œ์š”๋˜์—ˆ์ง€๋งŒ, Vite๋Š” ์ˆ˜์ •๋œ ๋ชจ๋“ˆ๋งŒ ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉํ•˜์—ฌ ๋ฐ˜์˜ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ 1s ์ด๋‚ด์— ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ๋ฐ˜์˜๋˜์–ด ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

      CRA VITE
    ๋นŒ๋“œ 144s 24s
    ํ”„๋กœ์ ํŠธ ์‹คํ–‰ 10s+ 400ms
    ์ฝ”๋“œ ๋ณ€๊ฒฝ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ 3~5s ~1s

     

     

     

    ๋ชจ๋…ธ๋ ˆํฌ ํˆด ์„ ํƒ

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

     

     

    ๋‹น์‹œ ์ €ํฌ ํŒ€์—์„œ ๋ฆฌ์„œ์น˜ํ•œ ๋ชจ๋…ธ๋ ˆํฌ ํˆด์€ Lerna, Terborepo, Nx ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ๋‹ค๋ฅธ ๋ชจ๋…ธ๋ ˆํฌ ํˆด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ Nx๋Š” Nx console์ด๋ผ๋Š” VS Code์—์„œ Nx๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ GUI ํˆด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Nx console์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ(๋˜๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ๋„)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ฑฐ๋‚˜, ๋ชจ๋…ธ๋ ˆํฌ์™€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋„์ž…์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์—ˆ๋˜ Storybook์ด๋‚˜ cypress๋ฅผ ์„ธํŒ…ํ•˜๋Š” ์ž‘์—…๋„ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Nx๊ฐ€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    ๋˜ํ•œ ๊ณต์‹ ๋ฌธ์„œ์˜ ๋‹ค์–‘ํ•œ ์„ค๋ช…๊ณผ ์˜ˆ์ œ๊ฐ€ ์กด์žฌํ–ˆ๊ณ , npm trend๋กœ ๋น„๊ตํ•ด ๋ณด์•˜์„ ๋•Œ ๋‹ค๋ฅธ ํˆด๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ณ„ ์ธก๋ฉด์—์„œ๋„ ์œ ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด Nx๋กœ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

     

    ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ๊ฒช์€ ์ด์Šˆ

    ๊ธฐ์กด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ชจ๋…ธ๋ ˆํฌ ํ˜•์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ์ด์Šˆ๋“ค์ž…๋‹ˆ๋‹ค.

     

     

    ์ฒซ ๋ฒˆ์งธ๋กœ๋Š”, ๊ธฐ์กด (๊ฒ‰์œผ๋กœ ๋ดค์„ ๋• ๋ชจ๋…ธ๋ ˆํฌ ๋ชจ์–‘์„ ๋„๋Š”) ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— Nx๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ๊ธฐ์กด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” yarn workspaces์ด ์•„๋‹Œ yarn link๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ๋ฅผ ๋„๊ณ  ์žˆ์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

     

    Nx์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ–ˆ์„ ๋•Œ๋Š” โ‘  npm/yarn/pnpm workspaces์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•, โ‘ก ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ์•„๋‹Œ ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์— Nx๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•, โ‘ข ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ Nx workspace๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋‚˜ package.json์˜ ์˜์กด์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ํŒ€์—์„œ๋Š” ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

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

     

     

     

    ๋‘ ๋ฒˆ์งธ๋กœ๋Š”, ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•œ ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋กœ ์ฝ”๋“œ๋ฅผ ์ด์ „ํ•  ๋•Œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊นŒ์ง€ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    ์ €ํฌ ํŒ€์—์„œ๋Š” git filter-repo ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์ด์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ์—๋„ git filter-branch ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

     

    ์„ธ ๋ฒˆ์งธ๋กœ๋Š”, JavaScript ํ”„๋กœ์ ํŠธ์—์„œ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์€ TypeScript๋กœ ์ž‘์„ฑ๋œ ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    yarn add --dev @nx/js

     

    Nx์—์„œ๋Š” ๊ฐ„ํŽธํ•˜๊ฒŒ @nx/js๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•จ์œผ๋กœ์„œ JavaScript ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ๋„ TypeScript๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

     

     

    ๋„ค ๋ฒˆ์งธ๋กœ๋Š”, ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ dayjs error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    image

     

    ์ด ๋ฌธ์ œ๋Š” dayjs ๊ณต์‹ ๋ฌธ์„œ์— ์ž˜ ๋‚˜์™€ ์žˆ๋Š”๋ฐ, tsconfig.json ์„ค์ •๊ณผ ๊ด€๋ จ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    tsconfig.json ์„ค์ •์— ๋”ฐ๋ผ import * as dayjs from "dayjs"์™€ import dayjs from "dayjs" ์ค‘ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

     

     

     

    ํ›„๊ธฐ

    ๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์˜ ์ˆ™์› ์‚ฌ์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋™๋ฃŒ์™€ ํ•จ๊ป˜ ํ•œ ๋‹ฌ ๋™์•ˆ ์ฃผ์— 2ํšŒ ํšŒ์‚ฌ์— ๋‚จ์•„ ๋Šฆ๊ฒŒ๊นŒ์ง€ ์›ํ‹ฐ๋“œ์—์„œ ์ฃผ์ตœํ•œ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ์ฃผ์ œ๋กœ ํ•œ ์ฑŒ๋ฆฐ์ง€์—๋„ ์ฐธ์—ฌํ•˜๋ฉฐ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์ธ ๋ฏธํŒ…์—์„œ ๊ฐ€์žฅ ์‹œ๊ธ‰ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์ง€๋งŒ ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๋‹ค๋ค„ ๋ณธ ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ฃ๋ถˆ๋ฆฌ ์†์„ ๋Œˆ ์—„๋‘๊ฐ€ ๋‚˜์ง€ ์•Š์•„ ์ €์—๊ฒŒ๋Š” ๊ณจ์นซ๊ฑฐ๋ฆฌ๋กœ ์—ฌ๊ฒจ์ง€๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ๋นŒ๋ ค ๋ชจ๋…ธ๋ ˆํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์„ ํ•จ๊ป˜ํ•ด ์ค€ ๋ฒ ์ผ๋ฆฌ์—๊ฒŒ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜†

     

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

     

    Vite ๋„์ž… ํ›„ production ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด Rollup์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ถ€๋ถ„์€ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ์ฑ„๋กœ ํ‡ด์‚ฌํ•˜๊ฒŒ ๋˜์–ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

     

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

     

     

    ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋…ธ๋ ˆํฌ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋Š๋‚€ ์ ๋“ค์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ธ€์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

     

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

     

     

    ์ฐธ๊ณ 

    Lerna is dead — Long Live Lerna

    ๋ชจ๋…ธ๋ ˆํฌ ์ ์šฉ๋ถ€ํ„ฐ yarn berry๊นŒ์ง€

    ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ๊ธฐ๋ฒ• - ๋ชจ๋…ธ๋ ˆํฌ ๊ฐœ๋… ํŽธ

    ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ๊ธฐ๋ฒ• - ๋ชจ๋…ธ๋ ˆํฌ ๋„๊ตฌ ํŽธ

    ๋ฒˆ๋“ค๋Ÿฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Webpack to Vite)์œผ๋กœ ๋นŒ๋“œ ์†๋„ ๋†’์ด๊ธฐ

    Vite

    ํŒ€์›Œํฌ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ์‹œ์Šคํ…œ ๊ตฌ์ถ•

    ๋Œ“๊ธ€

Designed by Tistory.