์นธํƒ€๋ผ๐Ÿ’™ - ๋ช‡ ๋ถ„ ์•ˆ์— ์„œ๋ฒ„ ์—†๋Š” Fullstack React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” CLI ๋„๊ตฌ

4688 ๋‹จ์–ด reactshowdevnodetypescript
์˜ค๋Š˜ ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ตœ๊ทผ์— ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฐœํ‘œ๋ฅผ ๊ธฐ์˜๊ฒŒ ๋ฐœํ‘œํ–ˆ๋‹ค.
๐Ÿ’ฅ Cantara ๐Ÿ’ฅ
TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Fullstack React ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๋Š” CLI ๋„๊ตฌ

Website โ€ข GitHub โ€ข Chat on Spectrum

โ“ ๋ญ ๊ณต๋ถ€ ํ•ด์š”?


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

    โšก ํŠน์ง•

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ(create React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ)
  • ์„œ๋ฒ„ ์—†๋Š” API ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ
  • ๊ฐœ๋ฐœ ๋…ธ๋“œ.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: express ๊ธฐ๋ฐ˜ REST API)
  • React ๊ตฌ์„ฑ ์š”์†Œ/JS ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  NPM์— ๋ฐœํ‘œ
  • ์“ฐ๊ธฐ ์œ ๋‹›/ํ†ตํ•ฉ/e2e ํ…Œ์ŠคํŠธ
  • โ” ๋ฌด์—‡ ๋•Œ๋ฌธ์—


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

    ๐Ÿ”ฅ ์ž…๋ฌธ


    ๊ทธ๋งŒํ•ด, ์ด์ œ ์“ธ๋ชจ ์žˆ๋Š” ์ผ์„ ํ•˜์ž.
    Cantara๋ฅผ ์‚ฌ์šฉํ•˜์—ฌfullstack ์›น ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.์šฐ๋ฆฌ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค!
    ์šฐ์„  ์ „ ์„ธ๊ณ„์ ์œผ๋กœ Cantara๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    npm i -g cantara
    
    ์ „๋ฐฉ๊ณผ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฐœ๋ฐœ ์˜์กด ํ•ญ๋ชฉ์„ ์„ค์น˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋‹ค์Œ์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.
    ctra init my-fullstack-app
    cd my-fullstack-app
    
    ์ด๊ฒƒ์€ ์˜ˆ์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ํฌํ•จํ•˜๋Š” ์ƒˆ ํด๋”๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ์ด์ œ Cantara์˜ CLI ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ํ˜„์žฌ ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ์˜ต์…˜์„ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    ctra
    
    dev ๋ช…๋ น์„ ์„ ํƒํ•˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจrandom-image-app์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๊ท€์—ฌ์šด ์ž‘์€ React ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ Unsplash์˜ ๋ฌด์ž‘์œ„ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    ์ด React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ํฌํŠธ3000์—์„œ API ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋„ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค!์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ƒˆ ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐฉ๊ธˆ ์™„๋ฃŒํ•œ ์ž‘์—… ctra -> dev ์„ ๋ฐ˜๋ณตํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” express-api ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๋ฉด localhost:8080 ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด์ œ react-apps/random-image-app/src ๋˜๋Š” node-apps/express-api/src ์•„๋ž˜์˜ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!์ƒˆ React ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‹คํ–‰new ๋ช…๋ น๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.์ถ”๊ฐ€ ์ •๋ณด, go to the docs.
    ์ด ๋น ๋ฅธ ์ž…๋ฌธ ์•ˆ๋‚ด์„œ๋Š” ํ‘œ๋ฉด์—๋งŒ ๋‹ฟ์ง€๋งŒ, Cantara๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ (๋˜๋Š” ๊ธฐ์กด) ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!
    ๋งŒ์•ฝ Cantara๊ฐ€ ๋‹น์‹ ์˜ ํฅ๋ฏธ๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚จ๋‹ค๋ฉด, ๋‹ค์Œ์€ ๋‹น์‹ ์„ ๊ณต๋ถ€ํ•˜๊ฒŒ ํ•˜๋Š” ๋งํฌ์ž…๋‹ˆ๋‹ค.

    ๐Ÿ“‹ ํ•œ์ธต ๋” ์ฝ๋‹ค


    Quick Start
    Website
    Docs
    Github

    ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ


    ๋งŒ์•ฝ ๋‹น์‹ ์ด ๋ฌธ์ œ, ์ƒ๊ฐ, ํ˜น์€ ๋‹จ์ง€ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์‹ถ๋‹ค๋ฉด, Cantara์˜ ์ŠคํŽ™ํŠธ๋Ÿผ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ€์ž…ํ•˜์„ธ์š”!๊ฑฐ๊ธฐ์„œ ๋งŒ๋‚˜์„œ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.๐Ÿ‘‹

    ํŠธ์œ„ํ„ฐ์—์„œ ๋‚˜๋ฅผ ์ฐพ์•„:

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ