Node.js ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ตœ๊ณ ์˜ ์ •์  ๋ถ„์„ ๋„๊ตฌ

Node.js ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ตœ๊ณ ์˜ ์ •์  ๋ถ„์„ ๋„๊ตฌ

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

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

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

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

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

์ฐจ๋ก€

SMART TS XL

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ •์  ๋ถ„์„ ๋„๊ตฌ ๋ฆฐํŒ…, ์Šคํƒ€์ผ ์ ์šฉ, ๋ณด์•ˆ ์Šค์บ๋‹๊ณผ ๊ฐ™์€ ํŠน์ • ์˜์—ญ์—์„œ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ๊ด€๋ฆฌ, SMART TS XL ์ตœ์‹  Node.js ๋ฐ TypeScript ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žกํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ๊ตฌ์ถ•๋œ ํฌ๊ด„์ ์ธ ํ”Œ๋žซํผ์œผ๋กœ ๋‹๋ณด์ž…๋‹ˆ๋‹ค.

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

๊ณ ๊ธ‰ ์ฝ”๋“œ ์ดํ•ด

SMART TS XL TypeScript์˜ ๊ณ ๊ธ‰ ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์  ํŠน์„ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ์‹ฌ์ธต์ ์ธ ์˜๋ฏธ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋…ธ๋ ˆํฌ ๋ฐ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ์œ ํ˜• ๊ด€๊ณ„, ์ œ๋„ค๋ฆญ ๋ฐ ๊ณ ๊ธ‰ ์œ ํ˜• ์ถ”๋ก  ๋ชจ๋ธ
  • ๋ชจ๋“ˆ ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • async/await, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ, ์„ ํƒ์  ์ฒด์ด๋‹๊ณผ ๊ฐ™์€ ์ตœ์‹  JavaScript ๋ฐ TypeScript ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹ฌ์ธต์ ์ธ ๋ถ„์„์„ ํ†ตํ•ด ๋ชจ๋“ˆ์„ฑ์ด ๋†’์€ Node.js ๋ฐฑ์—”๋“œ์™€ ๋Œ€๊ทœ๋ชจ TypeScript ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ •ํ™•ํ•˜๊ณ  ๊ด€๋ จ์„ฑ ์žˆ๋Š” ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ๊ทœ์น™ ์‹œํ–‰

Node.js ์‹œ์Šคํ…œ์„ ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋ฐ ์žˆ์–ด์„œ๋Š” ๊น”๋”ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. SMART TS XL ํŒ€์ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์„ค๊ณ„ ํ’ˆ์งˆ์˜ ์žฅ๊ธฐ์ ์ธ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, ์ƒˆ๋กœ์šด ํŒ€์›์˜ ์ ์‘์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ค‘์‹ฌ ์ •์  ๋ถ„์„

๋ณด์•ˆ์€ ํ˜„๋Œ€ ๊ฐœ๋ฐœ์˜ ์ตœ์šฐ์„  ์ˆœ์œ„์ž…๋‹ˆ๋‹ค. SMART TS XL ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœํŒ€์ด ์ˆ˜๋™ ๊ฒ€ํ† ์—๋งŒ ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ๊ด€ํ–‰์„ ์ผ์ƒ ์—…๋ฌด์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ž‘์„ฑ

๊ฐ ํ”„๋กœ์ ํŠธ์—๋Š” ๊ณ ์œ ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. SMART TS XL ์œ ์—ฐํ•œ ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ง€์›ํ•˜์—ฌ ํŒ€์ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ง€์›์„ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ํŒ€๊ณผ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ํ’ˆ์งˆ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ํ‘œ์ค€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ๋ฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ง€์› ๊ธฐ๋Šฅ

SMART TS XL ์ „๋ฌธ์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋Œ€๊ทœ๋ชจ ์กฐ์ง์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ์ž๋™ ์Šค์บ๋‹์„ ์œ„ํ•œ ์ธ๊ธฐ ์žˆ๋Š” CI/CD ์‹œ์Šคํ…œ๊ณผ์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ
  • ๊ฐœ๋ฐœ์ž, ํŒ€ ๋ฆฌ๋” ๋ฐ ๋ณด์•ˆ ๊ด€๋ฆฌ์ž๋ฅผ ์œ„ํ•œ ์„ธ๋ถ€์ ์ด๊ณ  ์—ญํ• ๋ณ„ ๋ณด๊ณ 
  • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์ถ”์„ธ ์ถ”์ , ๋ฌธ์ œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • ๋ฐ ์ˆ˜์ • ๊ด€๋ฆฌ์šฉ ๋Œ€์‹œ๋ณด๋“œ
  • ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„ํ•œ ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด ๋ฐ ์ •์ฑ… ๊ด€๋ฆฌ

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ถ„์„์ด ํŒ€์— ๋งž์ถฐ ํ™•์žฅ๋˜์–ด ๋ถ„์‚ฐ๋œ ์—”์ง€๋‹ˆ์–ด๋ง ๊ทธ๋ฃน ๊ฐ„์˜ ํ˜‘์—…์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ์นœํ™”์  ๊ฒฝํ—˜

๊ธฐ์—… ์ˆ˜์ค€์˜ ๊ธฐ๋Šฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , SMART TS XL ๊ฐœ๋ฐœ์ž ์ค‘์‹ฌ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„, ๋ณด์•ˆ ์ค‘์‹ฌ ํ†ต์ฐฐ๋ ฅ, ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ ๋ฐ ์œ ์—ฐํ•œ ๊ทœ์น™ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ SMART TS XL ๋Œ€๊ทœ๋ชจ๋กœ ๊ณ ํ’ˆ์งˆ, ์•ˆ์ „ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ Node.js ๋ฐ TypeScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ†ตํ•ฉ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ ๋‹ค๋“œJS

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

TypeScript ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ StandardJS๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ lint๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .ts ํŒŒ์ผ ํ˜•์‹์ด์ง€๋งŒ ํ•ต์‹ฌ ๋””์ž์ธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹JavaScript๋ฅผ ์šฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค. TypeScript์™€ Node.js๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์€ ํ˜ผํ•ฉ๋œ JS/TS ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ธฐ๋ณธ์ ์ธ ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด TypeScript๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

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

StandardJS๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํƒ€์ผ ๊ตฌ์„ฑ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋”ฐ๋ฅด๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•˜๊ณ  ๊ตฌ์„ฑ๋ณด๋‹ค ๊ทœ์น™์„ ์„ ํ˜ธํ•˜๋Š” ํŒ€์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

2. ์ œํ•œ๋œ TypeScript ์ง€์›
์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด TypeScript ๋ฆฐํŒ…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, StandardJS๋Š” TypeScript์šฉ์œผ๋กœ ์ œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. TypeScript์˜ ํƒ€์ž… ์‹œ์Šคํ…œ, ๊ณ ๊ธ‰ ๊ตฌ๋ฌธ ๋˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TypeScript๋ฅผ ๋ณด์™„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ณด์•ˆ ๋ถ„์„ ์—†์Œ
StandardJS๋Š” ์ฃผ์ž… ์œ„ํ—˜, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ง๋ ฌํ™”, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค์—ผ๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋ณด์•ˆ์€ ์ „์ ์œผ๋กœ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ์ˆ˜๋™ ๊ฒ€ํ† ์— ๋งก๊ฒจ์ง‘๋‹ˆ๋‹ค.

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

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

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

7. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ทœ๋ชจ ๊ฑฐ๋ฒ„๋„Œ์Šค์— ์ ํ•ฉํ•˜์ง€ ์•Š์Œ
๋Œ€๊ทœ๋ชจ ํŒ€์€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ„ํ•ด ์ƒ์„ธํ•œ ๋ณด๊ณ , ์ถ”์„ธ ์ถ”์  ๋ฐ ์—ญํ•  ๊ธฐ๋ฐ˜ ์ •์ฑ…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. StandardJS๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์‹œ๋ณด๋“œ, ๊ณผ๊ฑฐ ๋ถ„์„ ๋˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

XO

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

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

์ฃผ์š” ๊ธฐ๋Šฅ

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

XO๋Š” ๋ณต์žกํ•œ ESLint ๊ตฌ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ณ  ์ผ๊ด€๋œ ๋ฆฐํŒ… ํ‘œ์ค€์„ ์„ ํ˜ธํ•˜๋Š” ํŒ€์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ์Šคํƒ€์ผ ๋ฐ ๊ตฌ๋ฌธ์—๋งŒ ์ง‘์ค‘
XO๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๊ตฌ๋ฌธ์˜ ์ •ํ™•์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฆฐํ„ฐ์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๋™์ž‘์— ์˜์กดํ•˜๋Š” Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ฌ๊ฐํ•œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์œ„๋ฐ˜ ๋˜๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๋Š” ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. TypeScript์— ๋Œ€ํ•œ ์ธ์‹ ๋ถ€์กฑ
XO๋Š” TypeScript ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ESLint๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. .ts ์ง€์›. ๋งŽ์€ ํƒ€์ž… ๊ด€๋ จ ๋ฆฐํŠธ ๋ฌธ์ œ๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ์ง์ ‘ ํ†ตํ•ฉ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ํƒ€์ž… ๊ด€๊ณ„, ์ œ๋„ค๋ฆญ ๋˜๋Š” ํƒ€์ž… ์ถ”๋ก ์˜ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

7. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๊ธฐ๋Šฅ ์—†์Œ
XO๋Š” ๊ฐ„ํŽธ์„ฑ๊ณผ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํŒ€์— ํ•„์š”ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ, ์ •์ฑ… ๊ด€๋ฆฌ, ์ถ”์„ธ ์ถ”์  ๋˜๋Š” ์—ญํ•  ๊ธฐ๋ฐ˜ ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

8. ์ œํ•œ๋œ ๋ณด๊ณ  ๋ฐ CI ํ†ตํ•ฉ
XO๋Š” ํ†ต๊ณผ/์‹คํŒจ ๋ฆฐํŒ…์„ ์œ„ํ•œ CI ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜์ง€๋งŒ, ํŒ€์ด ์žฅ๊ธฐ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์‚ฌ, ๊ณผ๊ฑฐ ๋ถ„์„ ๋˜๋Š” ์ˆ˜์ • ๊ณ„ํš์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ๋ณด๊ณ  ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

JSHint

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

Node.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, JSHint๋Š” ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ CLI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์ฝ”๋”ฉ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์‹œํ–‰ํ•˜๊ณ  ๋น„๋™๊ธฐ JavaScript ์ฝ”๋“œ์—์„œ ํ”ํžˆ ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๊ตฌ๋ฌธ ์˜ค๋ฅ˜์™€ ์ผ๋ฐ˜์ ์ธ JavaScript ์‹ค์ˆ˜๋ฅผ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒ€์ผ ๊ธฐ๋ณธ ์„ค์ •์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๊ฒ€์‚ฌ ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ๊ฐ„ํŽธํ•œ CLI ํ†ตํ•ฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ JavaScript ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ณด๋‹ค ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ํŒจํ„ด์„ ์ ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ตœ์†Œํ•œ์˜ ์„ค์ •์ด๋‚˜ ์ข…์†์„ฑ์œผ๋กœ ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

JSHint๋Š” ์ตœ์‹  ํˆด ๊ตฌ์„ฑ์˜ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ๊ธฐ๋ณธ์ ์ธ ๋ฆฐํŒ…์ด ํ•„์š”ํ•œ ๊ธฐ์กด Node.js ํ”„๋กœ์ ํŠธ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ํด๋ž˜์‹ JavaScript ๊ตฌ๋ฌธ์œผ๋กœ ์ œํ•œ๋จ
JSHint๋Š” ์ตœ์‹  JavaScript ๊ธฐ๋Šฅ์ด ๋งŽ์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „์— ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ECMAScript ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ ์ธ ์ง€์›๋งŒ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ES ๋ชจ๋“ˆ, async/await ๋˜๋Š” ๊ณ ๊ธ‰ ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์‹  Node.js ํ”„๋กœ์ ํŠธ์—๋Š” ํšจ๊ณผ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ๋„ค์ดํ‹ฐ๋ธŒ TypeScript ์ง€์› ์—†์Œ
JSHint๋Š” TypeScript ํŒŒ์ผ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Node.js ๊ฐœ๋ฐœ์— TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ํŒ€์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฐ•ํ™”ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” JSHint๊ฐ€ ๋ถˆํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค.

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

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

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

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

7. IDE ํ†ตํ•ฉ ๊ฐœ๋ฐœ์ž ํ”ผ๋“œ๋ฐฑ ์—†์Œ
JSHint๋Š” CLI ๊ธฐ๋ฐ˜ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ตœ์‹  ํŽธ์ง‘๊ธฐ์™€์˜ ํ’๋ถ€ํ•œ ํ†ตํ•ฉ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. VS Code์™€ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋ณธ ํŽธ์ง‘๊ธฐ ์ง€์› ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋ฆฐํ„ฐ์— ๋น„ํ•ด ๊ฒฝํ—˜์ด ๋œ ๋งค๋„๋Ÿฝ๋‹ค๊ณ  ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

9. ์ตœ์‹  JavaScript ํŒจํ„ด์— ๋Œ€ํ•ด ์œ ์ง€๋˜์ง€ ์•Š์Œ
JSHint๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ƒ๋‹นํžˆ ๋А๋ ธ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  JavaScript ๋ฐ Node.js ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ๋” ์ž˜ ์ง€์›ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋„๊ตฌ๋“ค์— ๋’ค์ฒ˜์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์ตœ์‹  ์ •์  ๋ถ„์„์—๋Š” ์‹ ๋ขฐ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

์Šค ๋‹ˆํฌ

Snyk๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด ์ „๋ฐ˜์— ๊ฑธ์ณ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ์ธ๊ธฐ ๋ณด์•ˆ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Node.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์†Œ์Šค ์ฝ”๋“œ์˜ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST)์™€ ์ž๋™ํ™”๋œ ์ข…์†์„ฑ ์ทจ์•ฝ์  ์Šค์บ๋‹์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Snyk๋Š” ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ์ง์ ‘ ํ†ตํ•ฉ๋˜์–ด ํŒ€์ด ์œ„ํ—˜์„ ์กฐ๊ธฐ์— ํŒŒ์•…ํ•˜๊ณ  ์žฅ๊ธฐ๊ฐ„ ์•ˆ์ „ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Snyk์˜ SAST ์—”์ง„์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŒจํ„ด์„ ์ฐพ๊ธฐ ์œ„ํ•ด Node.js ๋ฐ TypeScript ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ˜๋ฉด ์ข…์†์„ฑ ์Šค์บ๋„ˆ๋Š” ๋‹ค์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. package.json package-lock.json ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์— ๋Œ€ํ•ด.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ฃผ์ž… ์œ„ํ—˜ ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ทจ์•ฝํ•œ npm ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฒ„์ „์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด GitHub, GitLab, Bitbucket ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ข…์†์„ฑ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜์ • ์ง€์นจ๊ณผ ์ž๋™ํ™”๋œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ผ์ธ ๋ณด์•ˆ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•œ IDE ํ†ตํ•ฉ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ทจ์•ฝ์  ์ถ”์  ๋ฐ ์ •์ฑ… ์‹œํ–‰์„ ์œ„ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ

Snyk๋Š” ๋ณด์•ˆ์— ๋Œ€ํ•œ "์™ผ์ชฝ์œผ๋กœ ์ด๋™" ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋ ค๋Š” ํŒ€์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ผ์ฐ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ๋ณด์•ˆ ์ค‘์‹ฌ, ์ผ๋ฐ˜ ์ •์  ๋ถ„์„์ด ์•„๋‹˜
Snyk๋Š” ๋ณด์•ˆ ์Šค์บ๋‹์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์Šคํƒ€์ผ ์ ์šฉ, ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ๊ฐ์ง€, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ ์‹๋ณ„๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ •์  ๋ถ„์„ ์ž‘์—…์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜์—ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒ€์— ์—ฌ์ „ํžˆ ๋ฆฐํ„ฐ์™€ ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์ œํ•œ๋œ TypeScript ์œ ํ˜• ์‹œ์Šคํ…œ ์ธ์‹
Snyk๋Š” TypeScript ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜์ง€๋งŒ, ์ •์  ๋ถ„์„ ๊ธฐ๋Šฅ์€ TypeScript์˜ ๊ณ ๊ธ‰ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ์ œ๋„ค๋ฆญ, ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋ฏธ๋ฌ˜ํ•œ ํƒ€์ž… ์ œ์•ฝ ์กฐ๊ฑด์˜ ํƒ€์ž… ์•ˆ์ „ ์‚ฌ์šฉ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

npm ๊ฐ์‚ฌ

npm Audit์€ npm CLI์— ํฌํ•จ๋œ ๋‚ด์žฅ ๋ณด์•ˆ ๋„๊ตฌ๋กœ, Node.js ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์—์„œ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์„ ํŒŒ์•…ํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. package.json package-lock.json, ๊ฒŒ์‹œ๋œ ๋ณด์•ˆ ๊ถŒ๊ณ ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ถŒ์žฅ๋˜๋Š” ์—…๋ฐ์ดํŠธ๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

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

์ฃผ์š” ๊ธฐ๋Šฅ

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

npm ๊ฐ์‚ฌ๋Š” ๋งŽ์€ Node.js ํŒ€์˜ ๊ธฐ๋ณธ ๋ณด์•ˆ ์œ„์ƒ์— ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ทจ์•ฝํ•œ ์ข…์†์„ฑ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

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

3. TypeScript ์œ ํ˜• ์‹œ์Šคํ…œ ์ธ์‹ ์—†์Œ
npm Audit์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜, ์ œ๋„ค๋ฆญ ์˜ค์šฉ ๋˜๋Š” null ํ™•์ธ ๋ˆ„๋ฝ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

5. ์ž˜๋ชป๋œ ์•ˆ์ „๊ฐ์˜ ๊ฐ€๋Šฅ์„ฑ
npm ๊ฐ์‚ฌ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ณด๊ณ ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ "์•ˆ์ „ํ•˜๋‹ค"๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ ์œ„ํ—˜, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŒจํ„ด ๋ฐ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

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

7. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋˜๋Š” ์ œ์–ด ํ๋ฆ„ ๋ถ„์„ ์—†์Œ
npm ๊ฐ์‚ฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ฐ์ดํ„ฐ ์ด๋™ ๋ฐฉ์‹์„ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ๊ฐ’์ด ์ค‘์š” API๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์— ๋„๋‹ฌํ•˜๋Š” ๋“ฑ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

9. ๊ฐœ๋ฐœ์ž IDE ํ†ตํ•ฉ ์—†์Œ
npm ๊ฐ์‚ฌ๋Š” CLI์™€ CI์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ, ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ๋Š” ์ธ๋ผ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ์‚ฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋ณด์•ˆ ๋˜๋Š” ํ’ˆ์งˆ ๋„๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
npm ๊ฐ์‚ฌ๋Š” ์ข…์†์„ฑ ํ™•์ธ์— ํ•„์ˆ˜์ ์ด์ง€๋งŒ, ๋ฆฐํ„ฐ, ์ •์  ๋ถ„์„๊ธฐ, ๋ณด์•ˆ SAST ๋„๊ตฌ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ํฌ๊ด„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ธต์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์‹œํ์–ด

NodeSecure๋Š” Node.js ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์ž ์žฌ์  ์œ„ํ—˜์„ ํŒŒ์•…ํ•˜๋Š” ๋ณด์•ˆ ์ค‘์‹ฌ CLI ๋ฐ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์„ค์น˜๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ , ๊ฒŒ์‹œ๋œ ์ฝ”๋“œ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  ๊ณต๊ธ‰๋ง ์œ„ํ˜‘์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฌธ์ œ๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ถŒ๊ณ ์—๋งŒ ๊ธฐ๋ฐ˜ํ•œ ๋‹จ์ˆœํ•œ ์ทจ์•ฝ์  ์Šค์บ๋‹๊ณผ ๋‹ฌ๋ฆฌ, NodeSecure๋Š” ์‹ค์ œ ํŒจํ‚ค์ง€ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜๊ณ  ํ‰๊ฐ€ํ•˜์—ฌ ๋” ์‹ฌ์ธต์ ์ด๊ฑฐ๋‚˜ ์ด์ „์— ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์œ„ํ—˜์„ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.

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

์ฃผ์š” ๊ธฐ๋Šฅ

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

NodeSecure๋Š” ๊ณต๊ธ‰๋ง ๋ณด์•ˆ์„ ์šฐ์„ ์‹œํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๊ถŒ๊ณ  ์‚ฌํ•ญ๋ณด๋‹ค ํƒ€์‚ฌ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ณด๋‹ค ์‹ฌ์ธต์ ์ธ ๋ถ„์„์„ ์›ํ•˜๋Š” Node.js ํ”„๋กœ์ ํŠธ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ์ข…์†์„ฑ์—๋งŒ ์ง‘์ค‘
NodeSecure๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์„ค์น˜๋œ npm ํŒจํ‚ค์ง€๋ฅผ ๋ถ„์„ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • Node.js ๋˜๋Š” TypeScript ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ, ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ๋˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋Š” ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. TypeScript ์œ ํ˜• ๊ฒ€์‚ฌ ๋˜๋Š” ๋ถ„์„ ์—†์Œ
NodeSecure๋Š” TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์บ์ŠคํŠธ ๋˜๋Š” ๋ถ€์ ์ ˆํ•œ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3. ์ฝ”๋“œ ์Šคํƒ€์ผ์ด๋‚˜ ํ’ˆ์งˆ ๊ด€๋ฆฌ๊ฐ€ ์—†์Œ
์ด ๋„๊ตฌ๋Š” ๋ฆฐํ„ฐ๋‚˜ ํฌ๋งคํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ ์Šค๋ฉœ์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜, Node.js ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

7. ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ˆ˜๋™ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
NodeSecure์—์„œ ๋ฐœ๊ฒฌ๋œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋‚œ๋…ํ™”๋œ ์ฝ”๋“œ ๋“ฑ ๋งŽ์€ ๋ถ€๋ถ„์€ ์ˆ˜๋™์œผ๋กœ ํ•ด์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŒ€์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋œ ํŒจํ‚ค์ง€๊ฐ€ ์‹ค์ œ๋กœ ์œ„ํ—˜ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์‚ฌ๋ก€๋ณ„๋กœ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

9. npm ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ํ’ˆ์งˆ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„
NodeSecure์˜ ์ผ๋ถ€ ๋ถ„์„์€ ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๊ฐ€ ์ œ๊ณตํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ๋ถ€์ •ํ™•ํ•˜๋ฉด ํŠน์ • ์œ„ํ—˜์„ ๊ฐ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ๋ณด์™„ํ•˜์ง€๋งŒ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
NodeSecure๋Š” ๊ณต๊ธ‰๋ง ๋ณด์•ˆ์— ๊ณ ๋„๋กœ ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์™„์ „ํ•œ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ๋ณด์•ˆ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฐํ„ฐ, ์ •์  ๋ถ„์„๊ธฐ, SAST ๋„๊ตฌ, ๊ทธ๋ฆฌ๊ณ  ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์—ฌ์ „ํžˆ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ฒดํฌ ๋งˆํฌ์Šค

Checkmarx๋Š” ๊ธฐ์—…์ด ๋ฐฐํฌ ์ „์— ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ •์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ…Œ์ŠคํŠธ(SAST) ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. JavaScript์™€ TypeScript๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ๋ณด์•ˆ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ทœ์ • ์ค€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์‚ฐ์—… ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, Checkmarx๋Š” ์„œ๋ฒ„ ์ธก JavaScript ๋ฐ TypeScript ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ๊ณผ ๊ด€๋ จ๋œ ํŒจํ„ด์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. CI/CD ํŒŒ์ดํ”„๋ผ์ธ, ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ ๋ฐ ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ์™€ ํ†ตํ•ฉ๋˜์–ด ํŒ€ ์ „์ฒด์— ์•ˆ์ „ํ•œ ๊ฐœ๋ฐœ ๊ด€ํ–‰์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ฃผ์ž… ๊ฒฐํ•จ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™”, XSS ์œ„ํ—˜๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Node.js ๋ฐ TypeScript ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ „ํŒŒ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ์–ด ํ๋ฆ„์„ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ •์ฑ… ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ทจ์•ฝ์„ฑ ๊ด€๋ฆฌ ๋ฐ ์ˆ˜์ • ์ถ”์ ์„ ์œ„ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋Œ€์‹œ๋ณด๋“œ
  • GitHub, GitLab, Jenkins, Azure DevOps ๋ฐ ๊ธฐํƒ€ ํ”Œ๋žซํผ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • OWASP Top 10 ๋ฐ PCI DSS์™€ ๊ฐ™์€ ํ‘œ์ค€์— ๋Œ€ํ•œ ๊ทœ์ • ์ค€์ˆ˜ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Checkmarx๋Š” ๋ณด์•ˆ ์Šค์บ๋‹์„ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด์— ์ง์ ‘ ๋‚ด์žฅํ•˜๊ณ  ์ฝ”๋“œ ๋ณด์•ˆ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” ๋Œ€๊ทœ๋ชจ ์กฐ์ง์—์„œ ์ข…์ข… ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

2. ์ œํ•œ๋œ TypeScript ์œ ํ˜• ์‹œ์Šคํ…œ ํ†ตํ•ฉ
Checkmarx๋Š” TypeScript๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ๋ถ„์„ ์—”์ง„์ด TypeScript์˜ ๊ณ ๊ธ‰ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ, ๋ณต์žกํ•œ ํƒ€์ž… ์ถ”๋ก  ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ํƒ€์ดํ•‘์— ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์˜คํƒ์ง€(false positive) ๋˜๋Š” ๋ฌธ์ œ ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋А๋ฆฐ ํ”ผ๋“œ๋ฐฑ ์ฃผ๊ธฐ
Checkmarx๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ CI ๋˜๋Š” ์˜ˆ์•ฝ๋œ ๊ฒ€์‚ฌ์˜ ์ผ๋ถ€๋กœ ์‹คํ–‰๋˜์–ด ์ฝ”๋“œ๊ฐ€ ํ‘ธ์‹œ๋œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋А๋ฆฐ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋Š” ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ๋ฌธ์ œ์ ์„ ์•Œ๋ ค์ฃผ๋Š” IDE ํ†ตํ•ฉ ๋„๊ตฌ์— ๋น„ํ•ด ๊ฐœ๋ฐœ์ž์˜ ๋„์ž…๋ฅ ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ณต์žกํ•œ ๊ตฌ์„ฑ ๋ฐ ์˜จ๋ณด๋”ฉ
Node.js ๋ฐ TypeScript ํ”„๋กœ์ ํŠธ์— Checkmarx๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์ดˆ๊ธฐ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ ๊ทœ์น™, ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ์„ ์กฐ์ •ํ•˜๋ ค๋ฉด ์ „๋‹ด ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด๋ง ์‹œ๊ฐ„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

7. ๋น„์šฉ ๋ฐ ๋ผ์ด์„ ์‹ฑ ๋ณต์žก์„ฑ
Checkmarx๋Š” ๊ธฐ์—…์šฉ ๊ฐ€๊ฒฉ ๋ชจ๋ธ์„ ๊ฐ–์ถ˜ ์ƒ์šฉ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์Šคํƒ€ํŠธ์—…์€ ํŠนํžˆ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด๋‚˜ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋น„์šฉ์ด ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

9. ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ์˜ ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ
๋Œ€๊ทœ๋ชจ Node.js ๋ชจ๋…ธ๋ ˆํฌ๋‚˜ ์ข…์†์„ฑ์ด ๋งŽ์€ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์‹ ์ค‘ํ•œ ํŠœ๋‹๊ณผ ์ฆ๋ถ„ ์Šค์บ๋‹ ์ „๋žต ์—†์ด๋Š” ์Šค์บ”์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10. ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์œ„ํ•œ ์™ธ๋ถ€ ํ†ตํ•ฉ์— ์˜์กด
Checkmarx๋Š” ์ „๋ฐ˜์ ์ธ DevSecOps ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ, ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ ํ†ตํ•ฉ์„ ์œ„ํ•ด์„œ๋Š” ์™ธ๋ถ€ ํ†ตํ•ฉ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ์ œ์–ด, CI/CD, IDE์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์ด ์—†๋‹ค๋ฉด ๋ณด์•ˆ ํ”ผ๋“œ๋ฐฑ์ด ๋ถ„์‚ฐ๋˜์–ด ์‹ ์†ํ•œ ์กฐ์น˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์…ˆ๊ทธ๋ ™

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

Semgrep์€ ์Šค์บ๋‹ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœ์ž ์›Œํฌํ”Œ๋กœ์— ์ง์ ‘ ๋‚ด์žฅํ•˜๊ณ , ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ๊ด€ํ–‰์„ ๊ฐ•ํ™”ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ ํ‘œ์ค€์„ ์œ ์ง€ํ•˜๋ ค๋Š” ๋ณด์•ˆ ๋ฐ ๊ฐœ๋ฐœ ํŒ€์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ CI ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์กฐ๊ธฐ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์™€ ํ†ตํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • JavaScript, TypeScript ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ํŒจํ„ด ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„
  • ๋ณด์•ˆ ๋ฌธ์ œ, ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋‚ด์žฅ ๊ทœ์น™ ์„ธํŠธ
  • ํ”„๋กœ์ ํŠธ๋ณ„ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ์ง๊ด€์ ์ธ YAML ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ์ž‘์„ฑ
  • ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋ฐ CI/CD ์ž๋™ํ™”์— ์ ํ•ฉํ•œ ๋น ๋ฅธ ์‹คํ–‰
  • GitHub, GitLab, Bitbucket ๋ฐ ๊ธฐํƒ€ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ๊ณผ์˜ ํ†ตํ•ฉ
  • Semgrep Cloud๋ฅผ ํ†ตํ•œ ํŒ€์šฉ ์ค‘์•™ ๊ด€๋ฆฌ ๋ฐ ๋ณด๊ณ 

Semgrep์€ Node.js ํ”„๋กœ์ ํŠธ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ํŒจํ„ด์„ ํƒ์ง€ํ•˜๊ณ , ๋‚ด๋ถ€ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ณ , ๊ฒ€ํ†  ๋ฐ ๋นŒ๋“œ ์ค‘์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ์ž ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ๋„ค์ดํ‹ฐ๋ธŒ ํƒ€์ž… ์‹œ์Šคํ…œ ํ†ตํ•ฉ ์—†์Œ
Semgrep์€ TypeScript ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜์ง€๋งŒ, TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž… ๊ด€๊ณ„, ๊ณ ๊ธ‰ ์ œ๋„ค๋ฆญ ๋˜๋Š” ๋ณต์žกํ•œ ํƒ€์ž… ์ถ”๋ก ์— ์˜์กดํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

2. ๊นŠ์€ ์˜๋ฏธ ์ดํ•ด ์—†์ด ํŒจํ„ด ๋งค์นญ
Semgrep์€ AST ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์ง€๋งŒ, ์ œ์–ด ํ๋ฆ„์ด๋‚˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์™„์ „ํ•œ ๋งฅ๋ฝ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋‚˜ ํŒŒ์ผ์— ๊ฑธ์ณ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‚˜ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋˜๋Š” ์˜ค์—ผ ๋ถ„์„ ์—†์Œ
Semgrep์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž…๋ ฅ์ด ๋ฏผ๊ฐํ•œ ์ž‘์—…์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ถ”์ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋ ค๋ฉด ์ข…์ข… ์˜ค์—ผ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ „์šฉ SAST ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4. ์ œํ•œ๋œ ๊ฑด์ถ•์  ์‹œํ–‰
Semgrep์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ฐ€์ ธ์˜ค๊ธฐ ํŒจํ„ด์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Node.js ํ”„๋กœ์ ํŠธ์—์„œ ๊ณ„์ธต์  ์•„ํ‚คํ…์ฒ˜๋‚˜ ๋ณต์žกํ•œ ์ข…์†์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์›์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

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

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

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

8. ์Šคํƒ€์ผ์ด๋‚˜ ์„œ์‹ ์ ์šฉ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
Semgrep์€ ESLint๋‚˜ Prettier์™€ ๊ฐ™์€ ๋ฆฐํ„ฐ๋‚˜ ํฌ๋งทํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์€ TypeScript ๋ฐ JavaScript ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ์ฝ”๋”ฉ ์Šคํƒ€์ผ๊ณผ ํฌ๋งท ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋ณ„๋„์˜ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

9. ์ „์ฒด ๋ณด์•ˆ ๊ทœ์ • ์ค€์ˆ˜ ๋ณด๊ณ  ์—†์Œ
Semgrep์€ ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐœ๊ฒฌ์— ์œ ์šฉํ•˜์ง€๋งŒ, ์™„๋ฒฝํ•œ ๋ณด์•ˆ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”Œ๋žซํผ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ์—… ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Œ€๋˜๋Š” ์ •์ฑ… ๊ด€๋ฆฌ, ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ๋˜๋Š” ๊ทœ์ • ์ค€์ˆ˜ ๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

10. ํšจ๊ณผ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ฐœ์ž ๊ต์œก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Semgrep์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ ค๋ฉด ๊ฐœ๋ฐœ์ž์™€ ๋ณด์•ˆ ํŒ€์€ ๊ทœ์น™ ๊ตฌ๋ฌธ์„ ๋ฐฐ์šฐ๊ณ , AST ํŒจํ„ด์„ ์ดํ•ดํ•˜๊ณ , ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ด€๋ จ ์—†๋Š” ๊ฒฐ๊ณผ๋กœ ๊ณผ๋ถ€ํ•˜๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  ๊ฒ€์‚ฌ๋ฅผ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ๊ฐœ๋ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ฆฌ๋‹‰.js

Clinic.js๋Š” Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ๊ฐœ๋ฐœ๋œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ์ง„๋‹จ ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜๊ณ , ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํŒŒ์•…ํ•˜๊ณ , ๋ถ€ํ•˜ ๋ฐœ์ƒ ์‹œ ์„œ๋ฒ„ ๋™์ž‘์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Clinic.js๋Š” CPU ์‚ฌ์šฉ๋Ÿ‰, ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ง€์—ฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋น„๋™๊ธฐ ํ˜ธ์ถœ ํŒจํ„ด์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๋ณด๊ณ ์„œ์™€ ๊ณ ๊ธ‰ ๋ถ„์„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ Node.js ์„œ๋น„์Šค์—์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œํ’ˆ๊ตฐ์—๋Š” Doctor, Flame, Bubbleprof, Heap Profiler์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์€ Node.js ํ”„๋กœ์„ธ์Šค์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ „๋ฌธ์ ์ธ ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

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

Clinic.js๋Š” ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์›ํ™œํ•œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ๋ฅผ ๋ณด์žฅํ•˜๋ ค๋Š” Node.js ๊ฐœ๋ฐœ์ž์™€ ์šด์˜ ํŒ€์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ์ •์  ๋ถ„์„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„ ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•ด ์„ค๊ณ„๋จ
Clinic.js๋Š” ์ •์  ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์—†์ด๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, TypeScript ๋˜๋Š” JavaScript ํŒŒ์ผ์„ ์ฝ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. ์œ ํ˜• ๊ฒ€์‚ฌ ๋˜๋Š” ๋ฆฐํŒ… ๊ธฐ๋Šฅ ์—†์Œ
Clinic.js๋Š” TypeScript ์œ ํ˜•์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜, ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋ฆฐํ„ฐ๋‚˜ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3. ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐ์ง€ ์—†์Œ
Clinic.js๋Š” ์ฃผ์ž… ์œ„ํ—˜, ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™”์™€ ๊ฐ™์€ ๋ณด์•ˆ ๊ฒฐํ•จ์„ ์‹๋ณ„ํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฒ€์‚ฌ๋Š” ์ „์šฉ SAST ๋˜๋Š” ์ข…์†์„ฑ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋˜๋Š” ์ œ์–ด ํ๋ฆ„ ๊ฒ€์ฆ ์—†์Œ
Clinic.js๋Š” ๋Ÿฐํƒ€์ž„ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„๋ฅผ ์‹œ๊ฐํ™”ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ด๋™ ๋ฐฉ์‹์ด๋‚˜ ์ œ์–ด ํ๋ฆ„์ด ์„ค๊ณ„ ๊ธฐ๋Œ€์น˜๋ฅผ ์ถฉ์กฑํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹คํ–‰๋˜์ง€ ์•Š์€ ๊ฒฝ๋กœ์—์„œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

5. ์ œํ•œ๋œ ๊ฑด์ถ•์  ํ†ต์ฐฐ๋ ฅ
Clinic.js๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ณด๋‹ค๋Š” ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ง€ํ‘œ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™, ๋ชจ๋“ˆ ๊ฒฝ๊ณ„ ๋˜๋Š” ๊ณ„์ธตํ™” ์›์น™์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6. ์ข…์†์„ฑ ๋˜๋Š” ๊ณต๊ธ‰๋ง ๋ถ„์„ ์—†์Œ
์ด ๋„๊ตฌ๋Š” npm ํŒจํ‚ค์ง€์˜ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ , ๋ผ์ด์„ ์Šค ์œ„ํ—˜ ๋˜๋Š” ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์„ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ ์•ˆ์ „์„ ์œ„ํ•ด npm Audit์ด๋‚˜ NodeSecure์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

7. ๋Œ€ํ‘œ์  ์ž‘์—… ๋ถ€ํ•˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Clinic.js์˜ ํ†ต์ฐฐ๋ ฅ์€ ํ”„๋กœํŒŒ์ผ๋ง์— ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์ด๋‚˜ ์›Œํฌ๋กœ๋“œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ๋Œ€ํ‘œ์„ฑ์ด ๋ถ€์กฑํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

9. CI ์ •์  ๊ฒ€์‚ฌ์— ํ†ตํ•ฉ๋˜์ง€ ์•Š์Œ
Clinic.js๋Š” ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ˆ˜๋™ ์ž‘์—…์ด๋‚˜ ๋กœ์ปฌ ์„ฑ๋Šฅ ์กฐ์‚ฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.
Clinic.js๋Š” ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ๋Š” ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ Node.js ๋ฐ TypeScript ํ”„๋กœ์ ํŠธ์—์„œ ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ, ๋ณด์•ˆ ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ์—๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋“ฑ๋Œ€ CI

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

Lighthouse ์ž์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Chrome DevTools์—์„œ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜์ง€๋งŒ Lighthouse CI๋Š” ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ผ ์ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๊ณ  ์„ฑ๋Šฅ ์˜ˆ์‚ฐ์„ ์ ์šฉํ•˜์—ฌ ์ž๋™ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

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

Lighthouse CI๋Š” ๋น ๋ฅด๊ณ  ์ ‘๊ทผ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์ตœ์ ํ™”๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ Node.js ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, SPA, PWA๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ํŒ€ ์‚ฌ์ด์—์„œ ํŠนํžˆ ์ธ๊ธฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

1. ๋ฐฐํฌ๋œ ์›น ์ถœ๋ ฅ์— ์ง‘์ค‘
Lighthouse CI๋Š” ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋ Œ๋”๋ง๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. TypeScript ๋˜๋Š” JavaScript ํŒŒ์ผ์˜ ๋ฒ„๊ทธ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ ๋˜๋Š” ๋ณด์•ˆ ๊ฒฐํ•จ์„ ์ง์ ‘ ๋ถ„์„ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

2. ์œ ํ˜• ๊ฒ€์‚ฌ ๋˜๋Š” ๋ฆฐํŒ… ์—†์Œ
Lighthouse CI๋Š” TypeScript ์œ ํ˜•์ด๋‚˜ JavaScript ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ€์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ๋ฆฐํ„ฐ์™€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ณด์•ˆ ์ •์  ๋ถ„์„ ์—†์Œ
Lighthouse์—๋Š” ํ—ค๋”์™€ HTTPS์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, ์ฃผ์ž… ์œ„ํ—˜, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๋˜๋Š” Node.js API์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

4. ์ฝ”๋“œ ํ’ˆ์งˆ์ด๋‚˜ ๋…ผ๋ฆฌ ๊ฒ€์ฆ์ด ์—†์Œ
Lighthouse CI๋Š” ๋ฐฑ์—”๋“œ Node.js ๋˜๋Š” TypeScript ์„œ๋น„์Šค์˜ ๋กœ์ง ๋ฒ„๊ทธ, ์ฝ”๋“œ ์Šค๋ฉœ, ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก ์„ฑ๋Šฅ๊ณผ ๋ Œ๋”๋ง๋œ ํŽ˜์ด์ง€์˜ ํ’ˆ์งˆ๋งŒ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

6. ๋ฐฐํฌ ๋˜๋Š” ๋นŒ๋“œ ์ถœ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ์‚ฌ๋Š” ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๋œ ์‚ฌ์ดํŠธ ๋˜๋Š” URL์—์„œ ์ œ๊ณต๋˜๋Š” ๋กœ์ปฌ ๋นŒ๋“œ์— ๋Œ€ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์ €์žฅ์†Œ์˜ ๋นŒ๋“œ๋˜์ง€ ์•Š์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

7. ์ˆœ์ˆ˜ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์˜ ์ œํ•œ๋œ ๊ฐ€์น˜
์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ์„œ๋ฒ„ ์ธก API์ธ Node.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, Lighthouse CI๋Š” ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Lighthouse CI์˜ ๊ฐ€์น˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง‘์ค‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

8. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์™€์˜ ํ†ตํ•ฉ ์—†์Œ
Lighthouse CI๋Š” TypeScript ์–ธ์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž… ์˜ค๋ฅ˜, ๋ถ€์ ์ ˆํ•œ ํƒ€์ž… ์‚ฌ์šฉ ๋˜๋Š” ๋ˆ„๋ฝ๋œ ํƒ€์ž… ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

9. ์ข…์†์„ฑ ๋ณด์•ˆ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์Œ
Lighthouse CI๋Š” npm ํŒจํ‚ค์ง€์˜ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ , ์˜ค๋ž˜๋œ ์ข…์†์„ฑ ๋˜๋Š” ๋ผ์ด์„ ์Šค ์ค€์ˆ˜ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์—์„œ๋Š” ๊ณต๊ธ‰๋ง ๋ณด์•ˆ์„ ์œ„ํ•ด npm Audit์ด๋‚˜ Snyk์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.
Lighthouse CI๋Š” ๋ฆฐํ„ฐ, ์ •์  ๋ถ„์„๊ธฐ, SAST ๋„๊ตฌ, ์ข…์†์„ฑ ๊ฒ€์‚ฌ๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. Node.js ๋ฐ TypeScript ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ •์  ๋ถ„์„๋ณด๋‹ค๋Š” ํด๋ผ์ด์–ธํŠธ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๋งค์ง€

Madge๋Š” JavaScript ๋ฐ TypeScript ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ชจ๋“ˆ ์ข…์†์„ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋กœ ์ƒ์„ฑํ•˜๋Š” ์ธ๊ธฐ CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ด ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์˜ ์ƒํ˜ธ ์—ฐ๊ฒฐ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ , ์ˆœํ™˜ ์ข…์†์„ฑ์„ ๊ฐ์ง€ํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ Node.js ํ”„๋กœ์ ํŠธ์—์„œ ์ž ์žฌ์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Madge๋Š” ๊ฐ„ํŽธํ•œ ํ†ตํ•ฉ, ๋ช…ํ™•ํ•œ ์ถœ๋ ฅ, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์˜ ์ˆจ๊ฒจ์ง„ ๋ณต์žก์„ฑ์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Node.js ํŒ€์˜ ๊ฒฝ์šฐ, Madge๋Š” ์ตœ์‹  ๊ตฌ๋ฌธ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ท€์ค‘ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

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

Madge๋Š” ์ข…์†์„ฑ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์•„ํ‚คํ…์ฒ˜ ์นจ์‹์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„์ธ ๋Œ€๊ทœ๋ชจ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

2. ์œ ํ˜• ๊ฒ€์‚ฌ ๋˜๋Š” TypeScript ๊ฒ€์ฆ ์—†์Œ
Madge๋Š” TypeScript ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ง€์›ํ•˜์ง€๋งŒ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž… ์˜ค๋ฅ˜, ๋ถ€์ ์ ˆํ•œ ํƒ€์ž… ์‚ฌ์šฉ, ์ œ๋„ค๋ฆญ ๋ฐ ํƒ€์ž… ์ถ”๋ก  ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3. ์ฝ”๋“œ ์Šคํƒ€์ผ์ด๋‚˜ ๋ฆฐํŒ… ์ ์šฉ ์—†์Œ
Madge๋Š” ๋ฆฐํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฝ”๋“œ ํ˜•์‹, ๋ช…๋ช… ๊ทœ์น™ ๋˜๋Š” ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์—์„œ๋Š” ์Šคํƒ€์ผ ์ง€์นจ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐ์ง€ ์—†์Œ
Madge๋Š” ์ฃผ์ž… ์œ„ํ—˜, ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ๊ฐ’, ์ข…์†์„ฑ ๊ด€๋ จ CVE์™€ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณด์•ˆ ๊ฐ์‚ฌ๋‚˜ ํ…Œ์ธํŠธ ๋ถ„์„ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

6. ์ œํ•œ๋œ ๊ฑด์ถ•์  ์‹œํ–‰
Madge๋Š” ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ง€์ • ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์ด๋‚˜ ๊ณ„์ธต ๊ฒฝ๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœํ™˜์„ ๋„˜์–ด์„œ๋Š” ์˜๋„์น˜ ์•Š์€ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ˆ˜๋™ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

7. ๊ทธ๋ž˜ํ”„์˜ ์ˆ˜๋™ ํ•ด์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๋Š” ์ƒ์„ฑ๋œ ๊ทธ๋ž˜ํ”„ ๋˜๋Š” JSON ๋ณด๊ณ ์„œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ํ•ด์„ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ํŒจํ„ด์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Madge๋Š” ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž๋™ํ™”๋œ ์ œ์•ˆ์ด๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

8. ์ธ๋ผ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•œ IDE ํ†ตํ•ฉ ์—†์Œ
Madge๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํŽธ์ง‘๊ธฐ์™€ ์—ฐ๋™๋˜์ง€ ์•Š์•„ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ข…์†์„ฑ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•„ ๊ฐœ๋ฐœ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

9. ๋งค์šฐ ํฐ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ
์ˆ˜์ฒœ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ๋งค์šฐ ํฐ ๋‹จ์ผ ๋ฆฌํฌ์˜ ๊ฒฝ์šฐ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ง์ด๋‚˜ ์‹ ์ค‘ํ•œ ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ์—„์ฒญ๋‚œ ์–‘์˜ ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณด์™„ํ•˜๋Š” ๊ฒƒ
Madge๋Š” ๋ฆฐํ„ฐ, ํƒ€์ž… ์ฒด์ปค, ๋ณด์•ˆ ์Šค์บ๋„ˆ, ์ •์  ๋ถ„์„๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€๋งŒ, ์ „์ฒด์ ์ธ ์ •์  ๋ถ„์„ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Nx

Nx๋Š” ์ตœ์‹  JavaScript ๋ฐ TypeScript ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ•๋ ฅํ•œ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด์ž ๋ชจ๋…ธ๋ ˆํฌ ๊ด€๋ฆฌ ํˆดํ‚ท์ž…๋‹ˆ๋‹ค. ํŒ€์ด ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ๋ณต์žกํ•œ ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ  ์ข…์†์„ฑ์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ Angular ํ”„๋กœ์ ํŠธ์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋˜ Nx๋Š” ์ด์ œ React, Node.js, NestJS ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

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

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์—ฌ๋Ÿฌ Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ชจ๋…ธ๋ฆฌํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ๊ด€๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ณ  ๊น”๋”ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋œ ์Šค์บํด๋”ฉ์„ ์œ„ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ ๋ฐ ํšŒ๋กœ๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹ฑ ๋ฐ ์ฆ๋ถ„ ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • React, Angular, NestJS ๋“ฑ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์–ด ๊ฐ„ ์˜๋„์น˜ ์•Š์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ๊ฒฝ๊ณ„๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

2. Linting ๋ฐ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ์™ธ๋ถ€ ๋„๊ตฌ์— ์˜์กด
Nx๋Š” ESLint์™€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ฉํ•˜์ง€๋งŒ, ์ž์ฒด์ ์ธ ๊ทœ์น™์ด๋‚˜ ๋ถ„์„ ๋กœ์ง์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์„ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„์„ ํ’ˆ์งˆ์€ ์ „์ ์œผ๋กœ ์™ธ๋ถ€ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

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

4. ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐ์ง€ ์—†์Œ
Nx๋Š” ์ฃผ์ž… ์œ„ํ—˜, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ์ฒ˜๋ฆฌ, ์ข…์†์„ฑ ์ทจ์•ฝ์ ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์€ Snyk, npm ๊ฐ์‚ฌ ๋˜๋Š” ๊ธฐํƒ€ SAST ์†”๋ฃจ์…˜๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

7. ์ฝ”๋“œ ํ’ˆ์งˆ์ด๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ๋ถ„์„์ด ์—†์Œ
Nx๋Š” ๋ณต์žก์„ฑ, ์ค‘๋ณต, ๋˜๋Š” ์ฝ”๋“œ ์•…์ทจ๋ฅผ ์ธก์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋„๊ตฌ ์—†์ด๋Š” ํŒ€์ด ์œ ์ง€ ๊ด€๋ฆฌ ์œ„ํ—˜์„ ํŒŒ์•…ํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

8. ํ•™์Šต ๊ณก์„  ๋ฐ ์„ค์ • ๋ณต์žก์„ฑ
๋Œ€๊ทœ๋ชจ Node.js ํ”„๋กœ์ ํŠธ์—์„œ Nx๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ž…ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ๊ณ„ํš์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ Nx์˜ ๊ตฌ์„ฑ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ, ๊ทธ๋ฆฌ๊ณ  ์ž‘์—… ๊ณต๊ฐ„ ๊ทœ์น™์„ ์ˆ™์ง€ํ•˜์—ฌ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์ด๋‚˜ ๊ธฐ๋Šฅ ํ™œ์šฉ ๋ถ€์กฑ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

9. ์ž์ฒด์ ์œผ๋กœ ์ œํ•œ๋œ IDE ํ”ผ๋“œ๋ฐฑ
Nx๋Š” CLI์™€ CI์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ ESLint์™€ TypeScript ํ†ตํ•ฉ๊ณผ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ทœ์น™ ์œ„๋ฐ˜์ด๋‚˜ ๊ฒฝ๊ณ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ํŽธ์ง‘์ž ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

10. ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.
Nx๋Š” ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ ๋ชจ๋…ธ๋ฆฌํฌ ๊ด€๋ฆฌ ๋ฐ ์ข…์†์„ฑ ๊ฒฝ๊ณ„ ์ ์šฉ์— ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ๋ฆฐํ„ฐ, ์ •์  ๋ถ„์„๊ธฐ, ๋ณด์•ˆ ์Šค์บ๋„ˆ ๋˜๋Š” ํฌ๋งทํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์™„์ „ํ•œ ์ •์  ๋ถ„์„ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„์ถœ

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

Leakage๋Š” ๊ฐ€๋ณ๊ณ  ๊ธฐ์กด ํ…Œ์ŠคํŠธ ๋ชจ์Œ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์–ด ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์„œ๋น„์Šค๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” Node.js ํŒ€์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

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

๋ˆ„์ˆ˜๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋˜๋Š” API๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ํŒ€์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒ€์—์„œ๋Š” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ผ๋„ ํ”„๋กœ๋•์…˜์—์„œ ์ถฉ๋Œ์ด๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.js ๋ฐ TypeScript์˜ ์ •์  ๋ถ„์„์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ

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

2. TypeScript ์œ ํ˜• ๊ฒ€์‚ฌ ์—†์Œ
๋ˆ„์ˆ˜๋Š” TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript ์ฝ”๋“œ์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜, ์ž˜๋ชป๋œ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ ๋˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์บ์ŠคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

3. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์ง€์—๋งŒ ๊ตญํ•œ๋จ
Leakage๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„์—๋งŒ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์ , ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฌธ์ œ ๋“ฑ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋Š” ๋ฐœ๊ฒฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4. ์ฝ”๋“œ ํ’ˆ์งˆ์ด๋‚˜ ์Šคํƒ€์ผ ์ ์šฉ์ด ์—†์Œ
๋ˆ„์ถœ์€ ์ฝ”๋“œ ๋ฆฐํŠธ(lint)๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜, ์ผ๊ด€๋œ ํ˜•์‹์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋”ฉ ํ‘œ์ค€๊ณผ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋ณ„๋„์˜ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

5. ๋ณด์•ˆ ๋ถ„์„์— ์ ํ•ฉํ•˜์ง€ ์•Š์Œ
๋ˆ„์ถœ์€ ์ฃผ์ž… ์œ„ํ—˜, ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ ์ฒ˜๋ฆฌ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ค‘์‹ฌ ์ •์  ๋ถ„์„์—๋Š” ์ „์šฉ SAST ๋˜๋Š” ์ข…์†์„ฑ ๊ฒ€์‚ฌ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

8. ๊ฑด์ถ• ๊ทœ์น™ ์‹œํ–‰ ์—†์Œ
๋ˆ„์ถœ์€ ๋ชจ๋“ˆ์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๊น”๋”ํ•œ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Node.js ํ”„๋กœ์ ํŠธ์—์„œ ๊ธด๋ฐ€ํ•œ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ข…์†์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์ ์šฉํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

Node.js ์ •์  ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ ๋ฐ ๊ณผ์ œ

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

์ฝ”๋“œ ์Šคํƒ€์ผ ๋ฐ ์ผ๊ด€์„ฑ

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

๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ๋ฐ ์œ ํ˜• ์•ˆ์ „์„ฑ

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

์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ

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

๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ

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

๋ณด์•ˆ ์ทจ์•ฝ์ 

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

์ข…์†์„ฑ ์ทจ์•ฝ์„ฑ ๋ฐ ๊ณต๊ธ‰๋ง ์œ„ํ—˜

Node.js ํ”„๋กœ์ ํŠธ๋Š” ์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š”๋ฐ, ์ด๋Š” ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ , ์•…์„ฑ ์ฝ”๋“œ ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ์ค‘๋‹จ์œผ๋กœ ์ธํ•ด ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๋„๊ตฌ package.json package-lock.json ํŒ€์ด ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์•ˆ์ „ํ•œ ๋ฒ„์ „์„ ๊ถŒ์žฅํ•˜๋ฉฐ, ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋‚œ๋…ํ™”๋œ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์œ„ํ—˜ํ•œ ํŒจํ„ด์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. CI์˜ ์ž๋™ ์ข…์†์„ฑ ๊ฒ€์‚ฌ๋Š” ๋ฐฐํฌ ์ „์— ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ์ผ๊ด€์„ฑ ๋ฐ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„

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

์„ฑ๋Šฅ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ

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

๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ ๋ฐ ์ž๋™ํ™” ๋ชฉํ‘œ

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

์ •์  ๋ถ„์„์€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•ˆ์ „ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ณ ํ’ˆ์งˆ์˜ Node.js ๋ฐ TypeScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค.

Node.js ์„ฑ๊ณต์„ ์œ„ํ•œ ์™„๋ฒฝํ•œ ์ •์  ๋ถ„์„ ์ „๋žต

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

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

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