์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ VS Code ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํ™œ์šฉ

๐Ÿš€ JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ VS Code ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํ™œ์šฉ

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

์•ผ ์†”์งํžˆ ๋งํ•ด์„œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ… ์ œ๋Œ€๋กœ ์•ˆ ํ•˜๊ณ  ์ฝ”๋”ฉํ•˜๋Š” ๊ฑฐ ์ง„์งœ ๋งจ์†์œผ๋กœ ์š”๋ฆฌํ•˜๋Š” ๊ฑฐ๋ž‘ ๋˜‘๊ฐ™์Œ ใ…‹ใ…‹ใ…‹ ์นผ๋„ ์—†๊ณ  ๋„๋งˆ๋„ ์—†๋Š”๋ฐ ๋ญ˜ ๋งŒ๋“ค๊ฒ ์–ด? ๐Ÿ˜…

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


1๏ธโƒฃ JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๊ธฐ์ดˆ โ€” Node.js๋ถ€ํ„ฐ ์‹œ์ž‘

JavaScript๋Š” ์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋Œ์•„๊ฐ€๋Š” ์–ธ์–ด์˜€๋Š”๋ฐ, Node.js๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์„œ๋ฒ„์—์„œ๋„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋์ž–์•„. ๊ทผ๋ฐ ์ด๊ฒŒ ๋‹จ์ˆœํžˆ ์„œ๋ฒ„์šฉ์œผ๋กœ๋งŒ ์“ฐ์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ ๋„๊ตฌ ์ž์ฒด๊ฐ€ Node.js ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์„ค์น˜ํ•ด์•ผ ํ•จ ใ…‹ใ…‹

๐Ÿ™‹ "๊ทธ๋ƒฅ ๋ธŒ๋ผ์šฐ์ €์—์„œ F12 ๋ˆ„๋ฅด๊ณ  ์ฝ˜์†”์—์„œ ํ•˜๋ฉด ์•ˆ ๋ผ์š”?"

ใ…‹ใ…‹ใ…‹ ๊ทธ๊ฑด ์ง„์งœ ์ž…๋ฌธ ์ค‘์˜ ์ž…๋ฌธ์ด๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ ํ•˜๋ ค๋ฉด Node.js ํ™˜๊ฒฝ์€ ํ•„์ˆ˜์•ผ! npm, webpack, vite ๋‹ค Node.js ๊ธฐ๋ฐ˜์ด๊ฑฐ๋“  ๐Ÿ˜ค

๐Ÿ”ง Node.js ์„ค์น˜ ๋ฐฉ๋ฒ•

๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• nodejs.org์— ์ ‘์†ํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ๋ณด์ž„:

LTS ๋ฒ„์ „ ์•ˆ์ •์ , ์‹ค๋ฌด ์ถ”์ฒœ (Long Term Support)
Current ๋ฒ„์ „ ์ตœ์‹  ๊ธฐ๋Šฅ, ์‹คํ—˜์  ์š”์†Œ ํฌํ•จ

์ง„์งœ ์‹ค๋ฌด์—์„œ๋Š” LTS ์จ์•ผ ํ•จ. Current ์“ฐ๋‹ค๊ฐ€ ํŒจํ‚ค์ง€ ํ˜ธํ™˜ ์•ˆ ๋ผ์„œ ๋ฉ˜๋ถ• ์˜ค๋Š” ์‚ฌ๋žŒ ๋งŽ์ด ๋ดค์Œ ใ…‹ใ…‹
๐Ÿ’ก nvm (Node Version Manager) ๊ฐ•์ถ”!
Node.js๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค nvm์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ํŽธํ•จ. ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ Node ๋ฒ„์ „ ์จ์•ผ ํ•  ๋•Œ ์ง„์งœ ์œ ์šฉํ•จ.

macOS/Linux:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

Windows: nvm-windows ์„ค์น˜ ํ›„ nvm install lts

๐Ÿ“ฆ npm vs yarn vs pnpm โ€” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋ญ ์จ?

Node.js ์„ค์น˜ํ•˜๋ฉด npm์ด ์ž๋™์œผ๋กœ ๋”ธ๋ ค์˜ค๋Š”๋ฐ, ์š”์ฆ˜์€ ์„ ํƒ์ง€๊ฐ€ ๋งŽ์•„์กŒ์Œ. ๊ฐ๊ฐ ํŠน์ง•์ด ์žˆ์œผ๋‹ˆ๊นŒ ์•Œ์•„๋‘์ž:

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ํŠน์ง• ์ถ”์ฒœ ์ƒํ™ฉ
npm Node.js ๊ธฐ๋ณธ ๋‚ด์žฅ, ๊ฐ€์žฅ ๋ณดํŽธ์  ์ž…๋ฌธ์ž, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ
yarn Facebook ๊ฐœ๋ฐœ, ๋น ๋ฅธ ์†๋„, yarn.lock ํŒ€ ํ”„๋กœ์ ํŠธ, ์ผ๊ด€์„ฑ ์ค‘์š”ํ•  ๋•Œ
pnpm ๋””์Šคํฌ ๊ณต๊ฐ„ ์ ˆ์•ฝ, ๊ฐ€์žฅ ๋น ๋ฆ„ ๋ชจ๋…ธ๋ ˆํฌ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ

์š”์ฆ˜ ํŠธ๋ Œ๋“œ๋Š” pnpm์ด ๋งŽ์ด ์˜ฌ๋ผ์˜ค๊ณ  ์žˆ์Œ. ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ๊ณต์œ ํ•ด์„œ node_modules ์šฉ๋Ÿ‰์ด ํ™• ์ค„์–ด๋“œ๋Š” ๊ฒŒ ์ง„์งœ ๋งค๋ ฅ์ ์ž„ ใ…‹ใ…‹ ํŠนํžˆ ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ์—์„œ pnpm workspace ์“ฐ๋ฉด ์ง„์งœ ๊ฐœ๊ฟ€์ž„ ๐Ÿฏ

# npm์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
npm init -y

# yarn ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ
npm install -g yarn
yarn init -y

# pnpm ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ
npm install -g pnpm
pnpm init

2๏ธโƒฃ VS Code โ€” ๊ทธ๋ƒฅ ์—๋””ํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌด๊ธฐ์•ผ ๐Ÿ—ก๏ธ

Visual Studio Code, ์ค„์—ฌ์„œ VS Code. Microsoft๊ฐ€ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์˜คํ”ˆ์†Œ์Šค๋ผ์„œ ๋ฌด๋ฃŒ์ž„. 2024๋…„ ๊ธฐ์ค€์œผ๋กœ ์ „ ์„ธ๊ณ„ ๊ฐœ๋ฐœ์ž ์„ค๋ฌธ์—์„œ ์••๋„์  1์œ„ ์—๋””ํ„ฐ์ž„. ์ด์œ ๊ฐ€ ์žˆ์–ด โ€” ์ง„์งœ ์ž˜ ๋งŒ๋“ค์—ˆ๊ฑฐ๋“  ใ…‹ใ…‹

VS Code ํ•ต์‹ฌ ๊ธฐ๋Šฅ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ๐ŸŽจ IntelliSense ์ž๋™์™„์„ฑ, ํƒ€์ž… ํžŒํŠธ, ๋ฌธ์„œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ง€์› ๐Ÿ› ๋‚ด์žฅ ๋””๋ฒ„๊ฑฐ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ, ๋ณ€์ˆ˜ ๊ฐ์‹œ, ์ฝœ์Šคํƒ ์ถ”์  ๊ฐ€๋Šฅ ๐Ÿ”Œ ํ™•์žฅ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค 5๋งŒ๊ฐœ ์ด์ƒ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ, ๋ฌดํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๐Ÿ”€ Git ํ†ตํ•ฉ ์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜, diff ๋ทฐ์–ด ์—๋””ํ„ฐ ์•ˆ์—์„œ ๋‹ค ๋จ ๐Ÿ’ป ํ†ตํ•ฉ ํ„ฐ๋ฏธ๋„ ์—๋””ํ„ฐ ์•ˆ์—์„œ ํ„ฐ๋ฏธ๋„ ์‹คํ–‰, ๋ฉ€ํ‹ฐ ํ„ฐ๋ฏธ๋„ ์ง€์› ๐ŸŒ ์›๊ฒฉ ๊ฐœ๋ฐœ SSH, WSL, ์ปจํ…Œ์ด๋„ˆ ์›๊ฒฉ ํ™˜๊ฒฝ ๊ฐœ๋ฐœ ์ง€์›

โš™๏ธ VS Code ๊ธฐ๋ณธ ์„ค์ • โ€” settings.json ์„ธํŒ…

VS Code ์„ค์น˜ํ•˜๊ณ  ๊ทธ๋ƒฅ ์“ฐ๋Š” ์‚ฌ๋žŒ ๋งŽ์€๋ฐ, settings.json ์ œ๋Œ€๋กœ ์„ธํŒ…ํ•˜๋ฉด ์™„์ „ ๋‹ค๋ฅธ ์„ธ์ƒ์ด ์—ด๋ฆผ ใ…‹ใ…‹ Ctrl+Shift+P (Mac์€ Cmd+Shift+P) ๋ˆ„๋ฅด๊ณ  "Open User Settings JSON" ๊ฒ€์ƒ‰ํ•ด์„œ ์—ด๋ฉด ๋จ.

{
  // ํฐํŠธ ์„ค์ • โ€” ์ฝ”๋”ฉ์šฉ ํฐํŠธ ํ•„์ˆ˜!
  "editor.fontFamily": "Fira Code, JetBrains Mono, Consolas",
  "editor.fontSize": 14,
  "editor.fontLigatures": true,  // ๋ฆฌ๊ฐ€์ฒ˜ ํ™œ์„ฑํ™” (=> ๊ฐ™์€ ๊ฑฐ ์˜ˆ์˜๊ฒŒ)
  
  // ์ €์žฅ ์‹œ ์ž๋™ ํฌ๋งท
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  
  // ํƒญ ์„ค์ •
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  
  // ์ž๋™ ์ €์žฅ
  "files.autoSave": "afterDelay",
  "files.autoSaveDelay": 1000,
  
  // ๋ฏธ๋‹ˆ๋งต (์ทจํ–ฅ๊ป)
  "editor.minimap.enabled": false,
  
  // ์ค„ ๋ฒˆํ˜ธ
  "editor.lineNumbers": "on",
  
  // ๊ด„ํ˜ธ ์ƒ‰์ƒ ๊ฐ•์กฐ
  "editor.bracketPairColorization.enabled": true,
  
  // ์›Œ๋“œ๋žฉ
  "editor.wordWrap": "on",
  
  // ํ„ฐ๋ฏธ๋„ ํฐํŠธ
  "terminal.integrated.fontFamily": "MesloLGS NF",
  
  // JavaScript ๊ด€๋ จ
  "javascript.updateImportsOnFileMove.enabled": "always",
  "javascript.suggest.autoImports": true
}
๐Ÿ’ก ์ฝ”๋”ฉ ํฐํŠธ ์ถ”์ฒœ! Fira Code โ€” ๋ฆฌ๊ฐ€์ฒ˜ ์ง€์›, ๋ฌด๋ฃŒ, ๊ฐ€๋…์„ฑ ์ตœ๊ณ 
JetBrains Mono โ€” JetBrains์—์„œ ๋งŒ๋“  ์ฝ”๋”ฉ ์ „์šฉ ํฐํŠธ
Cascadia Code โ€” Microsoft์—์„œ ๋งŒ๋“  ํฐํŠธ, VS Code๋ž‘ ์ฐฐ๋–ก

๋ฆฌ๊ฐ€์ฒ˜(Ligature)๋ž€ !=, ===, => ๊ฐ™์€ ๊ธฐํ˜ธ๋“ค์„ ํ•˜๋‚˜์˜ ์˜ˆ์œ ๊ธฐํ˜ธ๋กœ ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž„. ํ•œ๋ฒˆ ์จ๋ณด๋ฉด ๋ชป ๋Œ์•„๊ฐ ใ…‹ใ…‹

โŒจ๏ธ ํ•„์ˆ˜ ๋‹จ์ถ•ํ‚ค โ€” ์ด๊ฒƒ๋งŒ ์•Œ์•„๋„ ์†๋„ 2๋ฐฐ

๊ธฐ๋Šฅ Windows/Linux macOS
๋ช…๋ น ํŒ”๋ ˆํŠธ Ctrl+Shift+P Cmd+Shift+P
ํŒŒ์ผ ๋น ๋ฅธ ์—ด๊ธฐ Ctrl+P Cmd+P
๋ฉ€ํ‹ฐ ์ปค์„œ Alt+Click Option+Click
๊ฐ™์€ ๋‹จ์–ด ๋ชจ๋‘ ์„ ํƒ Ctrl+D Cmd+D
์ค„ ์ด๋™ Alt+โ†‘โ†“ Option+โ†‘โ†“
์ค„ ๋ณต์‚ฌ Shift+Alt+โ†‘โ†“ Shift+Option+โ†‘โ†“
์‚ฌ์ด๋“œ๋ฐ” ํ† ๊ธ€ Ctrl+B Cmd+B
ํ„ฐ๋ฏธ๋„ ์—ด๊ธฐ Ctrl+` Cmd+`
โš ๏ธ ๋ฉ€ํ‹ฐ ์ปค์„œ ์ง„์งœ ์ค‘์š”ํ•จ! Ctrl+D๋กœ ๊ฐ™์€ ๋‹จ์–ด ํ•˜๋‚˜์”ฉ ์„ ํƒํ•˜๊ฑฐ๋‚˜, Ctrl+Shift+L๋กœ ํŒŒ์ผ ๋‚ด ๋ชจ๋“  ๋™์ผ ๋‹จ์–ด ํ•œ๋ฒˆ์— ์„ ํƒํ•ด์„œ ๋™์‹œ ํŽธ์ง‘ํ•˜๋Š” ๊ฑฐ โ€” ์ด๊ฑฐ ๋ชจ๋ฅด๋ฉด ์ง„์งœ ์†ํ•ด์ž„. ๋ณ€์ˆ˜๋ช… ๋ฐ”๊ฟ€ ๋•Œ ์–ผ๋งˆ๋‚˜ ํŽธํ•œ์ง€ ใ…‹ใ…‹

3๏ธโƒฃ JavaScript ๊ฐœ๋ฐœ ํ•„์ˆ˜ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์™„์ „ ์ •๋ณต ๐Ÿ”Œ

VS Code ํ™•์žฅ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์— 5๋งŒ๊ฐœ ๋„˜๋Š” ํ™•์žฅ์ด ์žˆ๋Š”๋ฐ, ๋‹ค ์„ค์น˜ํ•˜๋ฉด VS Code๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋‚œ๋ฆฌ๋‚จ ใ…‹ใ…‹ ์ง„์งœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ํฌ์ธํŠธ์•ผ. JavaScript ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ํ•ต์‹ฌ ํ™•์žฅ๋“ค๋งŒ ๋ฝ‘์•„๋ดค์Œ ๐Ÿ‘‡

โœจ ์ฝ”๋“œ ํ’ˆ์งˆ & ํฌ๋งทํŒ…

1์œ„ Prettier โ€” Code formatter ์ฝ”๋“œ ์ž๋™ ํฌ๋งทํŒ…์˜ ์ ˆ๋Œ€ ๊ฐ•์ž. ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋กœ ์ •๋ฆฌํ•ด์คŒ. ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์Šคํƒ€์ผ ํ†ต์ผํ•  ๋•Œ ์ง„์งœ ํ•„์ˆ˜์ž„.

์„ค์น˜ ํ›„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .prettierrc ํŒŒ์ผ ์ƒ์„ฑ:
// .prettierrc
{
  "semi": true,           // ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฌ์šฉ
  "singleQuote": true,    // ์ž‘์€๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ
  "tabWidth": 2,          // ํƒญ ๋„ˆ๋น„ 2
  "trailingComma": "es5", // ํ›„ํ–‰ ์‰ผํ‘œ
  "printWidth": 80,       // ์ค„ ์ตœ๋Œ€ ๊ธธ์ด
  "bracketSpacing": true, // ๊ฐ์ฒด ๊ด„ํ˜ธ ๊ณต๋ฐฑ
  "arrowParens": "avoid"  // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ด„ํ˜ธ ์ƒ๋žต
}
2์œ„ ESLint ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ ๋„๊ตฌ. ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ์ž ์žฌ์  ๋ฒ„๊ทธ, ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ์œ„๋ฐ˜์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์žก์•„์คŒ. Prettier๊ฐ€ ์Šคํƒ€์ผ์ด๋ผ๋ฉด ESLint๋Š” ๋กœ์ง ํ’ˆ์งˆ ๋‹ด๋‹น์ž„.

npm install -D eslint ์„ค์น˜ ํ›„ npx eslint --init์œผ๋กœ ์ดˆ๊ธฐํ™”.
// .eslintrc.json ์˜ˆ์‹œ
{
  "env": {
    "browser": true,
    "es2021": true,
    "node": true
  },
  "extends": ["eslint:recommended"],
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "rules": {
    "no-console": "warn",      // console.log ๊ฒฝ๊ณ 
    "no-unused-vars": "error", // ๋ฏธ์‚ฌ์šฉ ๋ณ€์ˆ˜ ์—๋Ÿฌ
    "eqeqeq": "error",         // === ๊ฐ•์ œ
    "no-var": "error"          // var ์‚ฌ์šฉ ๊ธˆ์ง€
  }
}
๐Ÿ’ก Prettier + ESLint ๊ฐ™์ด ์“ธ ๋•Œ ์ถฉ๋Œ ๋ฐฉ์ง€! eslint-config-prettier ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๋ฉด ESLint์˜ ํฌ๋งทํŒ… ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•ด์„œ Prettier๋ž‘ ์ถฉ๋Œ ์•ˆ ๋‚จ.
npm install -D eslint-config-prettier
๊ทธ๋ฆฌ๊ณ  .eslintrc์˜ extends์— "prettier" ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ!

๐Ÿš€ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ ํ™•์žฅ

ํ•„์ˆ˜ Auto Import โ€” ES6, TS, JSX, TSX ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ ์น˜๋ฉด ์ž๋™์œผ๋กœ import ๋ฌธ ์ถ”๊ฐ€ํ•ด์คŒ. React ๊ฐœ๋ฐœํ•  ๋•Œ ์ง„์งœ ์—†์œผ๋ฉด ์†์ด ์—ด ๋ฐฐ๋Š” ๋” ์›€์ง์—ฌ์•ผ ํ•จ ใ…‹ใ…‹
ํ•„์ˆ˜ Path Intellisense ํŒŒ์ผ ๊ฒฝ๋กœ ์ž๋™์™„์„ฑ. import๋‚˜ require์—์„œ ๊ฒฝ๋กœ ์ž…๋ ฅํ•  ๋•Œ ํŒŒ์ผ ๋ชฉ๋ก ์ž๋™์œผ๋กœ ๋ณด์—ฌ์คŒ. ์˜คํƒ€๋กœ ์ธํ•œ ๋ชจ๋“ˆ ๋ชป ์ฐพ๋Š” ์—๋Ÿฌ ํ™• ์ค„์–ด๋“ฆ.
ํ•„์ˆ˜ JavaScript (ES6) code snippets ์ž์ฃผ ์“ฐ๋Š” JS ํŒจํ„ด๋“ค์„ ๋‹จ์ถ•ํ‚ค๋กœ ์ž…๋ ฅ. ์˜ˆ๋ฅผ ๋“ค์–ด clg ์น˜๋ฉด console.log()๊ฐ€ ์ž๋™์™„์„ฑ๋จ. imp ์น˜๋ฉด import ๋ฌธ ์ž๋™์™„์„ฑ. ์ง„์งœ ์†๊ฐ€๋ฝ ์•„๋‚„ ์ˆ˜ ์žˆ์Œ ใ…‹ใ…‹
๋‹จ์ถ•์–ด ์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ
clg console.log()
imp import moduleName from 'module'
imd import { } from 'module'
exp export default
anfn ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์Šค๋‹ˆํŽซ
nfn ์ผ๋ฐ˜ ํ•จ์ˆ˜ ์Šค๋‹ˆํŽซ

๐ŸŽจ UI/UX ๊ฐœ์„  ํ™•์žฅ

์ถ”์ฒœ Bracket Pair Colorizer 2 (ํ˜„์žฌ VS Code ๋‚ด์žฅ)

๊ด„ํ˜ธ ์Œ์„ ์ƒ‰๊น”๋กœ ๊ตฌ๋ถ„ํ•ด์คŒ. ์ค‘์ฒฉ๋œ ๊ด„ํ˜ธ ๋งŽ์„ ๋•Œ ์–ด๋””์„œ ์—ด๊ณ  ๋‹ซํžˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณด์ž„. VS Code 1.60 ์ดํ›„๋ถ€ํ„ฐ๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ๋“ค์–ด์™”์Œ. settings.json์—์„œ "editor.bracketPairColorization.enabled": true ์„ค์ •ํ•˜๋ฉด ๋จ.
์ถ”์ฒœ indent-rainbow ๋“ค์—ฌ์“ฐ๊ธฐ ๋ ˆ๋ฒจ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ƒ‰์ƒ์œผ๋กœ ํ‘œ์‹œํ•ด์คŒ. ํŒŒ์ด์ฌ์ฒ˜๋Ÿผ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์ค‘์š”ํ•œ ์–ธ์–ด์—์„œ ํŠนํžˆ ์œ ์šฉํ•˜๊ณ , JS์—์„œ๋„ ์ค‘์ฒฉ ๊ตฌ์กฐ ํŒŒ์•…ํ•  ๋•Œ ๋„์›€๋จ.
์ถ”์ฒœ Material Icon Theme ํŒŒ์ผ ์•„์ด์ฝ˜์„ ์˜ˆ์˜๊ฒŒ ๋ฐ”๊ฟ”์คŒ. js, ts, json, css ํŒŒ์ผ๋งˆ๋‹ค ๋‹ค๋ฅธ ์•„์ด์ฝ˜ ๋ณด์—ฌ์ค˜์„œ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ์—์„œ ํŒŒ์ผ ๊ตฌ๋ถ„์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง. ์ด๊ฑฐ ์—†์œผ๋ฉด ํ—ˆ์ „ํ•จ ใ…‹ใ…‹
์ถ”์ฒœ One Dark Pro / GitHub Theme ํ…Œ๋งˆ๋Š” ์ทจํ–ฅ์ด์ง€๋งŒ ์ถ”์ฒœํ•˜๋Š” ๊ฑฐ ๋‘ ๊ฐœ์ž„. One Dark Pro๋Š” Atom ์—๋””ํ„ฐ์˜ ๋‹คํฌ ํ…Œ๋งˆ๋ฅผ VS Code๋กœ ์˜ฎ๊ธด ๊ฑฐ๊ณ , GitHub Theme์€ GitHub ์Šคํƒ€์ผ์˜ ๊น”๋”ํ•œ ํ…Œ๋งˆ. ๋ˆˆ ๋œ ํ”ผ๋กœํ•œ ํ…Œ๋งˆ ๊ณ ๋ฅด๋Š” ๊ฒŒ ์žฅ์‹œ๊ฐ„ ์ฝ”๋”ฉ์— ์ง„์งœ ์ค‘์š”ํ•จ.

4๏ธโƒฃ ๊ณ ๊ธ‰ ๊ฐœ๋ฐœ์ž๋“ค์ด ์“ฐ๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๐Ÿง 

๊ณ ๊ธ‰ ๊ฐœ๋ฐœ์ž ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋กœ๋“œ๋งต VS Code ํ™•์žฅ ์ƒํƒœ๊ณ„ GitLens Git ํžˆ์Šคํ† ๋ฆฌ ์‹œ๊ฐํ™” blame ์ •๋ณด ์ธ๋ผ์ธ ํ‘œ์‹œ Thunder Client API ํ…Œ์ŠคํŠธ ๋„๊ตฌ Postman ๋Œ€์ฒด Live Share ์‹ค์‹œ๊ฐ„ ํ˜‘์—… ์ฝ”๋”ฉ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ Error Lens ์—๋Ÿฌ๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ์ฆ‰์‹œ ํ‘œ์‹œ GitHub Copilot AI ์ฝ”๋“œ ์ž๋™์™„์„ฑ

๐Ÿ” GitLens โ€” Git ์ŠˆํผํŒŒ์›Œ

GitLens๋Š” ์ง„์งœ ๊ฒŒ์ž„ ์ฒด์ธ์ €์ž„. ์ฝ”๋“œ ํ•œ ์ค„ ํ•œ ์ค„์— ๋งˆ์šฐ์Šค ์˜ฌ๋ฆฌ๋ฉด ๋ˆ„๊ฐ€, ์–ธ์ œ, ์™œ ์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ๋ฐ”๋กœ ๋ณด์ž„. ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ "์ด ์ฝ”๋“œ ๋ˆ„๊ฐ€ ์ง  ๊ฑฐ์•ผ?!" ํ•  ๋•Œ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅ ใ…‹ใ…‹

GitLens ์ฃผ์š” ๊ธฐ๋Šฅ: ๐Ÿ”ธ Inline Blame โ€” ๊ฐ ์ค„ ์˜†์— ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ •๋ณด ํ‘œ์‹œ
๐Ÿ”ธ File History โ€” ํŒŒ์ผ์˜ ์ „์ฒด ๋ณ€๊ฒฝ ํžˆ์Šคํ† ๋ฆฌ
๐Ÿ”ธ Branch Compare โ€” ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ฐจ์ด์  ์‹œ๊ฐํ™”
๐Ÿ”ธ Commit Graph โ€” ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ์‹œ๊ฐํ™” (๋ฌด๋ฃŒ ๋ฒ„์ „๋„ ๊ธฐ๋ณธ ์ œ๊ณต)
๐Ÿ”ธ Code Lens โ€” ํ•จ์ˆ˜/ํด๋ž˜์Šค ์œ„์— ์ตœ๊ทผ ๋ณ€๊ฒฝ ์ •๋ณด ํ‘œ์‹œ

โšก Error Lens โ€” ์—๋Ÿฌ๋ฅผ ์ฆ‰์‹œ ๋ˆˆ์•ž์—

๊ธฐ๋ณธ VS Code๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ‘์ค„๋งŒ ๊ทธ์–ด์ฃผ๋Š”๋ฐ, Error Lens๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๋‹น ์ค„ ์˜†์— ๋ฐ”๋กœ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œ์‹œํ•ด์คŒ. ์—๋Ÿฌ ํŒจ๋„ ์—ด์–ด์„œ ํ™•์ธํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์‚ฌ๋ผ์ง. ์„ค์น˜ํ•˜๋ฉด "์•„ ์ด๊ฒŒ ์—†์—ˆ๋‹ค๊ณ ?" ์‹ถ์„ ๊ฑฐ์ž„ ใ…‹ใ…‹

๐ŸŒฉ๏ธ Thunder Client โ€” API ํ…Œ์ŠคํŠธ๋ฅผ VS Code ์•ˆ์—์„œ

Postman ์“ฐ๋˜ ์‚ฌ๋žŒ๋“ค ์ฃผ๋ชฉ! Thunder Client๋Š” VS Code ์•ˆ์—์„œ HTTP ์š”์ฒญ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ์ž„. REST API ๊ฐœ๋ฐœํ•  ๋•Œ Postman ์ผœ๊ณ  VS Code ์ผœ๊ณ  ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋Š” ๊ฑฐ ์ง„์งœ ๊ท€์ฐฎ์ž–์•„. Thunder Client ์“ฐ๋ฉด ์—๋””ํ„ฐ ์•ˆ์—์„œ ๋‹ค ํ•ด๊ฒฐ๋จ.

๐Ÿ’ก Thunder Client ํŠน์ง• - GET, POST, PUT, DELETE ๋“ฑ ๋ชจ๋“  HTTP ๋ฉ”์„œ๋“œ ์ง€์›
- ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๊ฐ€๋Šฅ (๊ฐœ๋ฐœ/์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜ URL ๋ถ„๋ฆฌ)
- ์ปฌ๋ ‰์…˜์œผ๋กœ ์š”์ฒญ ๊ทธ๋ฃนํ™”
- ์‘๋‹ต JSON ์ž๋™ ํฌ๋งทํŒ…
- ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„ (Postman๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋ฒผ์›€)

๐Ÿค– GitHub Copilot โ€” AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ

2024๋…„ ๊ธฐ์ค€์œผ๋กœ GitHub Copilot์€ ์ง„์งœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋ฐ”๊ฟ”๋†“์€ ๋„๊ตฌ์ž„. ์œ ๋ฃŒ ์„œ๋น„์Šค์ง€๋งŒ ํ•™์ƒ์€ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ , ์›” $10 ์ •๋„์ธ๋ฐ ๊ทธ ์ด์ƒ์˜ ๊ฐ€์น˜๋Š” ์ถฉ๋ถ„ํžˆ ํ•จ.

๐Ÿ™‹ "AI๊ฐ€ ์ฝ”๋“œ ์งœ์ฃผ๋ฉด ์‹ค๋ ฅ์ด ์•ˆ ๋Š˜์ง€ ์•Š๋‚˜์š”?"

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

Copilot์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ:

๐Ÿ”ธ ์ฝ”๋“œ ์ž๋™์™„์„ฑ โ€” ์ฃผ์„ ์“ฐ๋ฉด ์ฝ”๋“œ ์ œ์•ˆ, Tab์œผ๋กœ ์ˆ˜๋ฝ
๐Ÿ”ธ Copilot Chat โ€” ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋Œ€ํ™”ํ˜•์œผ๋กœ ์งˆ๋ฌธ
๐Ÿ”ธ ์ฝ”๋“œ ์„ค๋ช… โ€” ์„ ํƒํ•œ ์ฝ”๋“œ ์„ค๋ช… ์š”์ฒญ
๐Ÿ”ธ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ โ€” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž๋™ ์ƒ์„ฑ
๐Ÿ”ธ ๋ฒ„๊ทธ ์ˆ˜์ • ์ œ์•ˆ โ€” ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ˆ˜์ • ๋ฐฉ๋ฒ• ์ œ์•ˆ

5๏ธโƒฃ ์‹ค์ „ JavaScript ํ”„๋กœ์ ํŠธ ์„ธํŒ… ํ”Œ๋กœ์šฐ ๐Ÿ› ๏ธ

์ž, ์ด์ œ ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋–ค ์ˆœ์„œ๋กœ ์„ธํŒ…ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์ด ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋ฉด ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ฝ”๋“œ ์Šคํƒ€์ผ ํ†ต์ผ๋˜๊ณ  ํ˜‘์—…์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์ง ๐Ÿ‘‡

1
ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
npm init -y ๋˜๋Š” Vite/CRA ๊ฐ™์€ ์Šค์บํด๋”ฉ ๋„๊ตฌ ์‚ฌ์šฉ
2
ESLint + Prettier ์„ค์น˜ ๋ฐ ์„ค์ •
์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์Šคํƒ€์ผ ํ†ต์ผ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ธํŒ…
3
Husky + lint-staged ์„ค์ •
์ปค๋ฐ‹ ์ „ ์ž๋™์œผ๋กœ ๋ฆฐํŠธ ๊ฒ€์‚ฌ ์‹คํ–‰ (๋‚˜์œ ์ฝ”๋“œ ์ปค๋ฐ‹ ๋ฐฉ์ง€!)
4
.editorconfig ํŒŒ์ผ ์ƒ์„ฑ
VS Code ์™ธ ๋‹ค๋ฅธ ์—๋””ํ„ฐ ์‚ฌ์šฉ์ž์™€๋„ ์Šคํƒ€์ผ ํ†ต์ผ
5
.vscode/settings.json ๊ณต์œ 
ํŒ€์› ๋ชจ๋‘ ๊ฐ™์€ VS Code ์„ค์ • ์‚ฌ์šฉ

๐Ÿถ Husky + lint-staged โ€” ๋‚˜์œ ์ฝ”๋“œ ์ปค๋ฐ‹ ๋ฐฉ์ง€

Husky๋Š” Git ํ›…์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž„. lint-staged๋ž‘ ๊ฐ™์ด ์“ฐ๋ฉด ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ESLint์™€ Prettier๋ฅผ ์‹คํ–‰ํ•ด์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ๋งŒ ์ปค๋ฐ‹์ด ๋จ. ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์ง„์งœ ํ•„์ˆ˜์ž„!

# Husky์™€ lint-staged ์„ค์น˜
npm install -D husky lint-staged

# Husky ์ดˆ๊ธฐํ™”
npx husky init

# .husky/pre-commit ํŒŒ์ผ์— ๋‚ด์šฉ ์ถ”๊ฐ€
echo "npx lint-staged" > .husky/pre-commit

# package.json์— lint-staged ์„ค์ • ์ถ”๊ฐ€
# "lint-staged": {
#   "*.{js,jsx,ts,tsx}": [
#     "eslint --fix",
#     "prettier --write"
#   ],
#   "*.{json,css,md}": [
#     "prettier --write"
#   ]
# }
โš ๏ธ ์ฃผ์˜! Husky v9๋ถ€ํ„ฐ ์„ค์ • ๋ฐฉ์‹์ด ๋ฐ”๋€Œ์—ˆ์Œ. npx husky init ๋ช…๋ น์–ด๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด .husky ํด๋”๊ฐ€ ์ƒ๊ธฐ๊ณ  ๊ฑฐ๊ธฐ์„œ ํ›… ํŒŒ์ผ ๊ด€๋ฆฌํ•จ. ๊ตฌ๋ฒ„์ „ ์„ค์ • ๋ฐฉ์‹์ด๋ž‘ ๋‹ค๋ฅด๋‹ˆ๊นŒ ๊ณต์‹ ๋ฌธ์„œ ๊ผญ ํ™•์ธํ•˜์ž!

๐Ÿ“ .vscode ํด๋” โ€” ํŒ€ ์„ค์ • ๊ณต์œ 

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .vscode ํด๋” ๋งŒ๋“ค๊ณ  ์„ค์ • ํŒŒ์ผ๋“ค ๋„ฃ์–ด๋‘๋ฉด ํŒ€์›๋“ค์ด ๊ฐ™์€ ์„ค์ •์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ. ์ด ํด๋”๋Š” Git์— ์ปค๋ฐ‹ํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ๊ฒŒ ์ข‹์Œ.

// .vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact"
  ]
}

// .vscode/extensions.json โ€” ์ถ”์ฒœ ํ™•์žฅ ๋ชฉ๋ก
{
  "recommendations": [
    "esbenp.prettier-vscode",
    "dbaeumer.vscode-eslint",
    "eamodio.gitlens",
    "usernamehw.errorlens",
    "rangav.vscode-thunder-client"
  ]
}
๐Ÿ’ก extensions.json ๊ฟ€ํŒ! .vscode/extensions.json์— ์ถ”์ฒœ ํ™•์žฅ ๋ชฉ๋ก์„ ๋„ฃ์–ด๋‘๋ฉด, ํŒ€์›์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด์—ˆ์„ ๋•Œ VS Code๊ฐ€ ์ž๋™์œผ๋กœ "์ด ํ™•์žฅ๋“ค ์„ค์น˜ํ• ๊นŒ์š”?" ๋ผ๊ณ  ๋ฌผ์–ด๋ด„. ํŒ€ ์˜จ๋ณด๋”ฉํ•  ๋•Œ ์ง„์งœ ํŽธํ•จ ใ…‹ใ…‹

6๏ธโƒฃ ๋นŒ๋“œ ๋„๊ตฌ & ๋ฒˆ๋“ค๋Ÿฌ โ€” Vite๊ฐ€ ๋Œ€์„ธ์ธ ์ด์œ  โšก

JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ๋„๊ตฌ๋Š” ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์ฃผ์ œ์ž„. ์˜ˆ์ „์—๋Š” Webpack์ด ์ ˆ๋Œ€ ๊ฐ•์ž์˜€๋Š”๋ฐ, ์š”์ฆ˜์€ Vite๊ฐ€ ๋ฌด์„ญ๊ฒŒ ์น˜๊ณ  ์˜ฌ๋ผ์˜ค๊ณ  ์žˆ์Œ.

๋นŒ๋“œ ๋„๊ตฌ ๋น„๊ต Webpack ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฒˆ๋“ค๋Ÿฌ ์ดˆ๊ธฐ ๋นŒ๋“œ ๋А๋ฆผ (์ˆ˜์‹ญ ์ดˆ) ์ƒํƒœ๊ณ„ ๊ฐ€์žฅ ํ’๋ถ€ ์„ค์ • ์ž์œ ๋„ ๋†’์Œ ์„ค์ • ๋ณต์žกํ•จ Vite โšก ์ถ”์ฒœ ์ฐจ์„ธ๋Œ€ ๋นŒ๋“œ ๋„๊ตฌ ์ดˆ๊ณ ์† HMR (๋ฐ€๋ฆฌ์ดˆ) ์„ค์ • ๊ฐ„๋‹จ, ์ฆ‰์‹œ ์‹œ์ž‘ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ € ์ง€์› ์ œํ•œ esbuild / Rollup ํŠน์ˆ˜ ๋ชฉ์  ๋ฒˆ๋“ค๋Ÿฌ esbuild: ๊ทนํ•œ์˜ ์†๋„ Rollup: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒˆ๋“ค๋ง ์ƒํƒœ๊ณ„ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์Œ Vite ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋จ

๐Ÿš€ Vite๋กœ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

# Vite๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
npm create vite@latest my-project

# ํ”„๋ ˆ์ž„์›Œํฌ ์„ ํƒ (vanilla, vue, react, preact, lit, svelte)
# ์–ธ์–ด ์„ ํƒ (js, ts)

cd my-project
npm install
npm run dev  # ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘ (๊ธฐ๋ณธ ํฌํŠธ: 5173)

Vite์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ HMR(Hot Module Replacement) ์†๋„์ž„. Webpack์€ ํŒŒ์ผ ์ˆ˜์ •ํ•˜๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ฒˆ๋“ค๋งํ•˜๋Š”๋ฐ, Vite๋Š” ์ˆ˜์ •๋œ ๋ชจ๋“ˆ๋งŒ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ”๋กœ ์ „๋‹ฌํ•จ. ๊ทธ๋ž˜์„œ ์ €์žฅํ•˜๋ฉด ๊ฑฐ์˜ ์ฆ‰์‹œ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜๋จ ใ…‹ใ…‹ ์ด๊ฑฐ ํ•œ๋ฒˆ ๊ฒฝํ—˜ํ•˜๋ฉด Webpack์œผ๋กœ ๋ชป ๋Œ์•„๊ฐ.

๐Ÿ’ก Vite + VS Code ์กฐํ•ฉ ๊ฟ€ํŒ Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘์— VS Code์˜ Live Preview ํ™•์žฅ ๋Œ€์‹  Vite ์ž์ฒด HMR์„ ์“ฐ๋Š” ๊ฒŒ ํ›จ์”ฌ ๋น ๋ฆ„. ๊ทธ๋ฆฌ๊ณ  vite.config.js์—์„œ ํฌํŠธ, ํ”„๋ก์‹œ ์„ค์ • ๋“ฑ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Œ.

7๏ธโƒฃ VS Code์—์„œ JavaScript ๋””๋ฒ„๊น… ์ œ๋Œ€๋กœ ํ•˜๊ธฐ ๐Ÿ›

console.log๋กœ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฑฐ ์†”์งํžˆ ๋‹ค๋“ค ํ•˜์ž–์•„ ใ…‹ใ…‹ ๊ทผ๋ฐ VS Code ๋‚ด์žฅ ๋””๋ฒ„๊ฑฐ ์“ฐ๋ฉด ์ง„์งœ ์ฐจ์›์ด ๋‹ค๋ฆ„. ๋ณ€์ˆ˜ ๊ฐ’ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด๊ณ , ์ฝ”๋“œ ์‹คํ–‰ ํ๋ฆ„ ๋”ฐ๋ผ๊ฐ€๊ณ , ์กฐ๊ฑด๋ถ€ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๊นŒ์ง€ โ€” ์ด๊ฒŒ ์ง„์งœ ๋””๋ฒ„๊น…์ž„.

๐Ÿ”ด ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ ์„ค์ •

๊ธฐ๋ณธ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ: ์ค„ ๋ฒˆํ˜ธ ์™ผ์ชฝ ํด๋ฆญ โ†’ ๋นจ๊ฐ„ ์  ์ƒ๊น€

์กฐ๊ฑด๋ถ€ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ: ๋นจ๊ฐ„ ์  ์šฐํด๋ฆญ โ†’ "Edit Breakpoint" โ†’ ์กฐ๊ฑด ์ž…๋ ฅ
์˜ˆ: i === 5 ์ž…๋ ฅํ•˜๋ฉด i๊ฐ€ 5์ผ ๋•Œ๋งŒ ๋ฉˆ์ถค

๋กœ๊ทธํฌ์ธํŠธ: ์ฝ”๋“œ ์‹คํ–‰ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅ
console.log ๋Œ€์‹  ์“ฐ๋ฉด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋กœ๊ทธ ์ฐ์„ ์ˆ˜ ์žˆ์Œ ๐Ÿ‘

โš™๏ธ launch.json ์„ค์ •

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      // Node.js ํŒŒ์ผ ๋””๋ฒ„๊น…
      "type": "node",
      "request": "launch",
      "name": "Node.js ๋””๋ฒ„๊ทธ",
      "program": "${workspaceFolder}/src/index.js",
      "console": "integratedTerminal"
    },
    {
      // Chrome์—์„œ ์›น์•ฑ ๋””๋ฒ„๊น…
      "type": "chrome",
      "request": "launch",
      "name": "Chrome ๋””๋ฒ„๊ทธ",
      "url": "http://localhost:5173",
      "webRoot": "${workspaceFolder}/src"
    },
    {
      // ํ˜„์žฌ ์—ด๋ฆฐ ํŒŒ์ผ ๋””๋ฒ„๊น…
      "type": "node",
      "request": "launch",
      "name": "ํ˜„์žฌ ํŒŒ์ผ ์‹คํ–‰",
      "program": "${file}"
    }
  ]
}
โš ๏ธ Chrome ๋””๋ฒ„๊น… ์‹œ ์ฃผ์˜! Chrome ๋””๋ฒ„๊น… ์„ค์ •์—์„œ url์€ Vite๋‚˜ webpack-dev-server๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•จ. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๋””๋ฒ„๊ฑฐ ์—ฐ๊ฒฐํ•˜๋Š” ์ˆœ์„œ ์ง€์ผœ์•ผ ํ•จ!

๐Ÿ” ๋””๋ฒ„๊น… ํŒจ๋„ ํ™œ์šฉ

Variables ํŒจ๋„: ํ˜„์žฌ ์Šค์ฝ”ํ”„์˜ ๋ชจ๋“  ๋ณ€์ˆ˜ ๊ฐ’ ํ™•์ธ

Watch ํŒจ๋„: ํŠน์ • ํ‘œํ˜„์‹ ๊ฐ’์„ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋ง
์˜ˆ: arr.length, user.name ๊ฐ™์€ ํ‘œํ˜„์‹ ์ถ”๊ฐ€

Call Stack ํŒจ๋„: ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ ํ™•์ธ, ์–ด๋””์„œ ํ˜ธ์ถœ๋๋Š”์ง€ ์ถ”์ 

Debug Console: ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ์—์„œ ๋ฉˆ์ถ˜ ์ƒํƒœ๋กœ ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ

8๏ธโƒฃ TypeScript ์—ฐ๋™ โ€” JS์—์„œ TS๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๐Ÿ“ˆ

์š”์ฆ˜ JavaScript ํ”„๋กœ์ ํŠธ์—์„œ TypeScript ์•ˆ ์“ฐ๋Š” ๊ณณ ์ฐพ๊ธฐ ํž˜๋“ค์–ด์ง. VS Code๋Š” TypeScript๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„ ํ™•์žฅ ์—†์ด๋„ ํƒ€์ž… ์ฒดํฌ๊ฐ€ ๋จ. ๊ทผ๋ฐ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์„ค์ •ํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ•๋ ฅํ•ด์ง.

๐Ÿ“ฆ TypeScript ๊ด€๋ จ ํ•„์ˆ˜ ํ™•์žฅ

ํ•„์ˆ˜ TypeScript Hero โ€” import ์ž๋™ ์ •๋ ฌ ๋ฐ ๊ด€๋ฆฌ

ํ•„์ˆ˜ Pretty TypeScript Errors โ€” TS ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜

์ถ”์ฒœ TypeScript Importer โ€” ํƒ€์ž… ์ž๋™ import

์ถ”์ฒœ Move TS โ€” ํŒŒ์ผ ์ด๋™ ์‹œ import ๊ฒฝ๋กœ ์ž๋™ ์—…๋ฐ์ดํŠธ
// tsconfig.json ๊ธฐ๋ณธ ์„ค์ •
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,           // ์—„๊ฒฉ ๋ชจ๋“œ (๊ฐ•์ถ”!)
    "noImplicitAny": true,    // any ํƒ€์ž… ์•”๋ฌต์  ์‚ฌ์šฉ ๊ธˆ์ง€
    "strictNullChecks": true, // null/undefined ์ฒดํฌ ๊ฐ•ํ™”
    "esModuleInterop": true,
    "skipLibCheck": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "paths": {
      "@/*": ["./src/*"]      // ๊ฒฝ๋กœ ๋ณ„์นญ ์„ค์ •
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}
๐Ÿ’ก JS ํŒŒ์ผ์—์„œ๋„ ํƒ€์ž… ์ฒดํฌ! TypeScript ์ „ํ™˜์ด ๋ถ€๋‹ด์Šค๋Ÿฌ์šฐ๋ฉด, JS ํŒŒ์ผ ์ƒ๋‹จ์— // @ts-check ์ฃผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด VS Code๊ฐ€ JS ํŒŒ์ผ์—์„œ๋„ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•ด์คŒ. JSDoc ์ฃผ์„์œผ๋กœ ํƒ€์ž… ํžŒํŠธ๋„ ์ค„ ์ˆ˜ ์žˆ์–ด์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ์ข‹์Œ!

9๏ธโƒฃ VS Code ์›Œํฌ์ŠคํŽ˜์ด์Šค & ๊ณ ๊ธ‰ ํ™œ์šฉ ํŒ ๐Ÿ’Ž

๐Ÿ“‚ ๋ฉ€ํ‹ฐ ๋ฃจํŠธ ์›Œํฌ์ŠคํŽ˜์ด์Šค

ํ”„๋ก ํŠธ์—”๋“œ + ๋ฐฑ์—”๋“œ ๊ฐ™์ด ๊ฐœ๋ฐœํ•  ๋•Œ ๋‘ ํด๋”๋ฅผ ํ•˜๋‚˜์˜ VS Code ์ฐฝ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ. File > Add Folder to Workspace๋กœ ํด๋” ์ถ”๊ฐ€ํ•˜๊ณ  .code-workspace ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋ฉด ๋จ.

// myproject.code-workspace
{
  "folders": [
    {
      "name": "ํ”„๋ก ํŠธ์—”๋“œ",
      "path": "./frontend"
    },
    {
      "name": "๋ฐฑ์—”๋“œ",
      "path": "./backend"
    }
  ],
  "settings": {
    "editor.formatOnSave": true
  }
}

๐Ÿ” ๊ฒ€์ƒ‰ & ์น˜ํ™˜ ๊ณ ๊ธ‰ ํ™œ์šฉ

์ •๊ทœ์‹ ๊ฒ€์ƒ‰: Ctrl+Shift+F๋กœ ์ „์ฒด ๊ฒ€์ƒ‰ ์—ด๊ณ  ์ •๊ทœ์‹ ๋ชจ๋“œ ํ™œ์„ฑํ™”

ํŒŒ์ผ ํŒจํ„ด ํ•„ํ„ฐ: "files to include"์— **/*.js ์ž…๋ ฅํ•˜๋ฉด JS ํŒŒ์ผ๋งŒ ๊ฒ€์ƒ‰

์ œ์™ธ ํŒจํ„ด: "files to exclude"์— node_modules,dist ์ž…๋ ฅ

์น˜ํ™˜ ๊ทธ๋ฃน ์ฐธ์กฐ: ์ •๊ทœ์‹ ์บก์ฒ˜ ๊ทธ๋ฃน์„ $1, $2๋กœ ์น˜ํ™˜์— ํ™œ์šฉ

๐ŸŽฏ Tasks ์„ค์ • โ€” ๋ฐ˜๋ณต ์ž‘์—… ์ž๋™ํ™”

// .vscode/tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘",
      "type": "npm",
      "script": "dev",
      "group": "build",
      "presentation": {
        "reveal": "always",
        "panel": "new"
      }
    },
    {
      "label": "๋นŒ๋“œ",
      "type": "npm",
      "script": "build",
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

Ctrl+Shift+B๋กœ ๊ธฐ๋ณธ ๋นŒ๋“œ ํƒœ์Šคํฌ ์‹คํ–‰, Ctrl+Shift+P โ†’ "Run Task"๋กœ ํŠน์ • ํƒœ์Šคํฌ ์‹คํ–‰ ๊ฐ€๋Šฅ. ๋งค๋ฒˆ ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด ์น˜๋Š” ๊ฑฐ ์ค„์ผ ์ˆ˜ ์žˆ์Œ ใ…‹ใ…‹

๐ŸŒ Remote Development โ€” ์–ด๋””์„œ๋“  ๊ฐœ๋ฐœ

Remote - SSH: ์›๊ฒฉ ์„œ๋ฒ„์— SSH๋กœ ์ ‘์†ํ•ด์„œ VS Code๋กœ ๊ฐœ๋ฐœ

Remote - WSL: Windows์—์„œ Linux ํ™˜๊ฒฝ์œผ๋กœ ๊ฐœ๋ฐœ (Windows ์‚ฌ์šฉ์ž ๊ฐ•์ถ”!)

Dev Containers: Docker ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

GitHub Codespaces: ๋ธŒ๋ผ์šฐ์ €์—์„œ VS Code ํ™˜๊ฒฝ์œผ๋กœ ๊ฐœ๋ฐœ
๐Ÿ’ก Windows ๊ฐœ๋ฐœ์ž์—๊ฒŒ WSL ๊ฐ•์ถ”! Windows์—์„œ JavaScript ๊ฐœ๋ฐœํ•  ๋•Œ WSL(Windows Subsystem for Linux) + VS Code Remote WSL ์กฐํ•ฉ์ด ์ง„์งœ ์ข‹์Œ. Linux ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ Windows GUI ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ตœ๊ณ ์˜ ์กฐํ•ฉ์ž„. ํŠนํžˆ Node.js ๊ด€๋ จ ํŒจํ‚ค์ง€๋“ค์ด Linux์—์„œ ํ›จ์”ฌ ์•ˆ์ •์ ์œผ๋กœ ๋Œ์•„๊ฐ.

๐Ÿ”Ÿ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…, ํ˜ผ์ž ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด? ๐Ÿค

์ง€๊ธˆ๊นŒ์ง€ JavaScript ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…๋ถ€ํ„ฐ VS Code ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ์—„์ฒญ ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ค˜๋Š”๋ฐ, ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒํ•œํ…Œ๋Š” ์ข€ ๋ฒ…์ฐฐ ์ˆ˜ ์žˆ์Œ ใ…‹ใ…‹ ๊ทผ๋ฐ ์ด๊ฒŒ ํ•œ๋ฒˆ ์ œ๋Œ€๋กœ ์„ธํŒ…ํ•ด๋‘๋ฉด ์ง„์งœ ์˜ค๋ž˜ ์จ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ง€์‹์ด๋ผ์„œ ํˆฌ์žํ•  ๊ฐ€์น˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ์žˆ์Œ!

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

JS ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ โœ… ๊ธฐ๋ณธ ํ™˜๊ฒฝ โœ“ Node.js LTS ์„ค์น˜ โœ“ nvm์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ โœ“ VS Code ์„ค์น˜ ๋ฐ settings.json ์„ค์ • โœ“ ์ฝ”๋”ฉ ํฐํŠธ ์„ค์น˜ (Fira Code ๋“ฑ) โœ“ Prettier + ESLint ์„ค์ • โœ“ Husky + lint-staged ์„ค์ • ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ โœ“ Prettier ํ™•์žฅ ์„ค์น˜ โœ“ ESLint ํ™•์žฅ ์„ค์น˜ โœ“ GitLens ์„ค์น˜ โœ“ Error Lens ์„ค์น˜ โœ“ Material Icon Theme ์„ค์น˜ โœ“ Thunder Client ์„ค์น˜ ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์™„๋ฃŒํ•˜๋ฉด ์ง„์งœ ํ”„๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์™„์„ฑ! ๐ŸŽ‰

๐ŸŽฏ ๋งˆ์ง€๋ง‰์œผ๋กœ โ€” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…์˜ ์ฒ ํ•™

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

์ฒ˜์Œ์—๋Š” ์ด๊ฒƒ์ €๊ฒƒ ์„ค์น˜ํ•˜๊ณ  ์„ธํŒ…ํ•˜๋Š” ๊ฒŒ ๊ท€์ฐฎ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•œ๋ฒˆ ์ œ๋Œ€๋กœ ์„ธํŒ…ํ•ด๋‘๋ฉด ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ฝ”๋”ฉ ์ž์ฒด์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์ข‹์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋ชฉ์ ์ด์ž–์•„ ใ…‹ใ…‹

๊ทธ๋ฆฌ๊ณ  ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์„ธํŒ… ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฑฐ๋‚˜, ๋ณธ์ธ์ด ์•Œ๊ณ  ์žˆ๋Š” ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ž„. ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์„œ๋กœ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฒŒ ๊ฒฐ๊ตญ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์ด๋‹ˆ๊นŒ ๐Ÿ’ช

๐Ÿ’ก ์ตœ์ข… ์š”์•ฝ โ€” ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ๋“ค ๐Ÿ”ธ Node.js LTS + nvm์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ
๐Ÿ”ธ VS Code settings.json ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
๐Ÿ”ธ Prettier + ESLint๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ
๐Ÿ”ธ Husky + lint-staged๋กœ ์ปค๋ฐ‹ ์ „ ์ž๋™ ๊ฒ€์‚ฌ
๐Ÿ”ธ GitLens, Error Lens, Thunder Client ๋“ฑ ์ƒ์‚ฐ์„ฑ ํ™•์žฅ
๐Ÿ”ธ Vite๋กœ ๋น ๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
๐Ÿ”ธ VS Code ๋‚ด์žฅ ๋””๋ฒ„๊ฑฐ ํ™œ์šฉ
๐Ÿ”ธ .vscode ํด๋”๋กœ ํŒ€ ์„ค์ • ๊ณต์œ 

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

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.