Ver3.5 ๐ JavaScript ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ VS Code ํ์ฅ ํ๋ก๊ทธ๋จ ํ์ฉ

๐ JavaScript ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ VS Code ํ์ฅ ํ๋ก๊ทธ๋จ ํ์ฉ
์ผ ์์งํ ๋งํด์, ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ
์ ๋๋ก ์ ํ๊ณ ์ฝ๋ฉํ๋ ๊ฑฐ ์ง์ง ๋งจ์์ผ๋ก ์๋ฆฌํ๋ ๊ฑฐ๋ ๋๊ฐ์ ใ
ใ
ใ
์นผ๋ ์๊ณ ๋๋ง๋ ์๋๋ฐ ๋ญ ๋ง๋ค๊ฒ ์ด? ๐
JavaScript ๊ฐ๋ฐํ ๋ ํ๊ฒฝ ์ธํ
์ด ์ผ๋ง๋ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ VS Code ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ด๋ป๊ฒ ํ์ฉํ๋ฉด ์์ฐ์ฑ์ด ํญ๋ฐ์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋์ง ์ค๋ ์์ ๋ฑ๋ฑ์ด ํํค์ณ๋ณผ๊ฒ. ์ง์ง ์ค๋ฌด์์ ์ฐ๋ ๊ฒ๋ค๋ง ๊ณจ๋ผ์ ์๋ ค์ค ํ
๋๊น ์ง์คํด ๐
1๏ธโฃ JavaScript ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ธฐ์ด โ Node.js๋ถํฐ ์์
JavaScript๋ ์๋ ๋ธ๋ผ์ฐ์ ์์๋ง ๋์๊ฐ๋ ์ธ์ด์๋๋ฐ, Node.js๊ฐ ๋ฑ์ฅํ๋ฉด์ ์๋ฒ์์๋ ๋๋ฆด ์ ์๊ฒ ๋์์. ๊ทผ๋ฐ ์ด๊ฒ ๋จ์ํ ์๋ฒ์ฉ์ผ๋ก๋ง ์ฐ์ด๋ ๊ฒ ์๋๋ผ, ๊ฐ๋ฐ ๋๊ตฌ ์์ฒด๊ฐ Node.js ๊ธฐ๋ฐ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ค์นํด์ผ ํจ ใ ใ
๐ง Node.js ์ค์น ๋ฐฉ๋ฒ
LTS ๋ฒ์ ์์ ์ , ์ค๋ฌด ์ถ์ฒ (Long Term Support)
Current ๋ฒ์ ์ต์ ๊ธฐ๋ฅ, ์คํ์ ์์ ํฌํจ
์ง์ง ์ค๋ฌด์์๋ LTS ์จ์ผ ํจ. Current ์ฐ๋ค๊ฐ ํจํค์ง ํธํ ์ ๋ผ์ ๋ฉ๋ถ ์ค๋ ์ฌ๋ ๋ง์ด ๋ดค์ ใ ใ
Node.js๋ฅผ ์ง์ ์ค์นํ๋ ๊ฒ๋ณด๋ค nvm์ผ๋ก ๋ฒ์ ๊ด๋ฆฌํ๋ ๊ฒ ํจ์ฌ ํธํจ. ํ๋ก์ ํธ๋ง๋ค ๋ค๋ฅธ Node ๋ฒ์ ์จ์ผ ํ ๋ ์ง์ง ์ ์ฉํจ.
macOS/Linux:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bashWindows: 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 ๊ธฐ๋ณธ ์ค์ โ 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
}
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 ๊ฐ๋ฐ์ ํนํ๋ ํต์ฌ ํ์ฅ๋ค๋ง ๋ฝ์๋ดค์ ๐
โจ ์ฝ๋ ํ์ง & ํฌ๋งทํ
์ค์น ํ ํ๋ก์ ํธ ๋ฃจํธ์
.prettierrc ํ์ผ ์์ฑ:
// .prettierrc
{
"semi": true, // ์ธ๋ฏธ์ฝ๋ก ์ฌ์ฉ
"singleQuote": true, // ์์๋ฐ์ดํ ์ฌ์ฉ
"tabWidth": 2, // ํญ ๋๋น 2
"trailingComma": "es5", // ํํ ์ผํ
"printWidth": 80, // ์ค ์ต๋ ๊ธธ์ด
"bracketSpacing": true, // ๊ฐ์ฒด ๊ดํธ ๊ณต๋ฐฑ
"arrowParens": "avoid" // ํ์ดํ ํจ์ ๋จ์ผ ํ๋ผ๋ฏธํฐ ๊ดํธ ์๋ต
}
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 ์ฌ์ฉ ๊ธ์ง
}
}
eslint-config-prettier ํจํค์ง ์ค์นํ๋ฉด ESLint์ ํฌ๋งทํ
๊ท์น์ ๋นํ์ฑํํด์ Prettier๋ ์ถฉ๋ ์ ๋จ.npm install -D eslint-config-prettier๊ทธ๋ฆฌ๊ณ .eslintrc์ extends์
"prettier" ์ถ๊ฐํ๋ฉด ๋จ!
๐ ์์ฐ์ฑ ํฅ์ ํ์ฅ
import๋ require์์ ๊ฒฝ๋ก ์
๋ ฅํ ๋ ํ์ผ ๋ชฉ๋ก ์๋์ผ๋ก ๋ณด์ฌ์ค. ์คํ๋ก ์ธํ ๋ชจ๋ ๋ชป ์ฐพ๋ ์๋ฌ ํ ์ค์ด๋ฆ.
clg ์น๋ฉด console.log()๊ฐ ์๋์์ฑ๋จ. imp ์น๋ฉด import ๋ฌธ ์๋์์ฑ. ์ง์ง ์๊ฐ๋ฝ ์๋ ์ ์์ ใ
ใ
| ๋จ์ถ์ด | ์์ฑ๋๋ ์ฝ๋ |
|---|---|
clg |
console.log() |
imp |
import moduleName from 'module' |
imd |
import { } from 'module' |
exp |
export default |
anfn |
ํ์ดํ ํจ์ ์ค๋ํซ |
nfn |
์ผ๋ฐ ํจ์ ์ค๋ํซ |
๐จ UI/UX ๊ฐ์ ํ์ฅ
๊ดํธ ์์ ์๊น๋ก ๊ตฌ๋ถํด์ค. ์ค์ฒฉ๋ ๊ดํธ ๋ง์ ๋ ์ด๋์ ์ด๊ณ ๋ซํ๋์ง ํ๋์ ๋ณด์. VS Code 1.60 ์ดํ๋ถํฐ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ผ๋ก ๋ค์ด์์. settings.json์์
"editor.bracketPairColorization.enabled": true ์ค์ ํ๋ฉด ๋จ.
4๏ธโฃ ๊ณ ๊ธ ๊ฐ๋ฐ์๋ค์ด ์ฐ๋ ํ์ฅ ํ๋ก๊ทธ๋จ ๐ง
๐ GitLens โ Git ์ํผํ์
GitLens๋ ์ง์ง ๊ฒ์ ์ฒด์ธ์ ์. ์ฝ๋ ํ ์ค ํ ์ค์ ๋ง์ฐ์ค ์ฌ๋ฆฌ๋ฉด ๋๊ฐ, ์ธ์ , ์ ์ด ์ฝ๋๋ฅผ ์์ฑํ๋์ง ๋ฐ๋ก ๋ณด์. ํ ํ๋ก์ ํธ์์ "์ด ์ฝ๋ ๋๊ฐ ์ง ๊ฑฐ์ผ?!" ํ ๋ ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅ ใ ใ
๐ธ 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 ์ฐ๋ฉด ์๋ํฐ ์์์ ๋ค ํด๊ฒฐ๋จ.
- ํ๊ฒฝ๋ณ์ ์ค์ ๊ฐ๋ฅ (๊ฐ๋ฐ/์คํ ์ด์ง/ํ๋ก๋์ URL ๋ถ๋ฆฌ)
- ์ปฌ๋ ์ ์ผ๋ก ์์ฒญ ๊ทธ๋ฃนํ
- ์๋ต JSON ์๋ ํฌ๋งทํ
- ๊ฐ๋ณ๊ณ ๋น ๋ฆ (Postman๋ณด๋ค ํจ์ฌ ๊ฐ๋ฒผ์)
๐ค GitHub Copilot โ AI ์ฝ๋ฉ ์ด์์คํดํธ
2024๋ ๊ธฐ์ค์ผ๋ก GitHub Copilot์ ์ง์ง ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋ฐ๊ฟ๋์ ๋๊ตฌ์. ์ ๋ฃ ์๋น์ค์ง๋ง ํ์์ ๋ฌด๋ฃ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ $10 ์ ๋์ธ๋ฐ ๊ทธ ์ด์์ ๊ฐ์น๋ ์ถฉ๋ถํ ํจ.
Copilot์ ํต์ฌ ๊ธฐ๋ฅ:
๐ธ Copilot Chat โ ์ฝ๋์ ๋ํด ๋ํํ์ผ๋ก ์ง๋ฌธ
๐ธ ์ฝ๋ ์ค๋ช โ ์ ํํ ์ฝ๋ ์ค๋ช ์์ฒญ
๐ธ ํ ์คํธ ์์ฑ โ ํจ์์ ๋ํ ๋จ์ ํ ์คํธ ์๋ ์์ฑ
๐ธ ๋ฒ๊ทธ ์์ ์ ์ โ ์๋ฌ ๋ฐ์ ์ ์์ ๋ฐฉ๋ฒ ์ ์
5๏ธโฃ ์ค์ JavaScript ํ๋ก์ ํธ ์ธํ ํ๋ก์ฐ ๐ ๏ธ
์, ์ด์ ์ค์ ๋ก ํ๋ก์ ํธ ์์ํ ๋ ์ด๋ค ์์๋ก ์ธํ ํ๋์ง ์์๋ณด์. ์ด ์์๋๋ก ํ๋ฉด ํ ํ๋ก์ ํธ์์๋ ์ฝ๋ ์คํ์ผ ํต์ผ๋๊ณ ํ์ ์ด ํจ์ฌ ์์ํด์ง ๐
npm init -y ๋๋ Vite/CRA ๊ฐ์ ์ค์บํด๋ฉ ๋๊ตฌ ์ฌ์ฉ
์ฝ๋ ํ์ง๊ณผ ์คํ์ผ ํต์ผ์ ์ํ ๊ธฐ๋ณธ ์ธํ
์ปค๋ฐ ์ ์๋์ผ๋ก ๋ฆฐํธ ๊ฒ์ฌ ์คํ (๋์ ์ฝ๋ ์ปค๋ฐ ๋ฐฉ์ง!)
VS Code ์ธ ๋ค๋ฅธ ์๋ํฐ ์ฌ์ฉ์์๋ ์คํ์ผ ํต์ผ
ํ์ ๋ชจ๋ ๊ฐ์ 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"
# ]
# }
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"
]
}
6๏ธโฃ ๋น๋ ๋๊ตฌ & ๋ฒ๋ค๋ฌ โ Vite๊ฐ ๋์ธ์ธ ์ด์ โก
JavaScript ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋น๋ ๋๊ตฌ๋ ๋น ์ง ์ ์๋ ์ฃผ์ ์. ์์ ์๋ Webpack์ด ์ ๋ ๊ฐ์์๋๋ฐ, ์์ฆ์ 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.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}"
}
]
}
url์ Vite๋ webpack-dev-server๊ฐ ์คํ ์ค์ธ ์ฃผ์๋ฅผ ์
๋ ฅํด์ผ ํจ. ๊ฐ๋ฐ ์๋ฒ ๋จผ์ ์คํํ๊ณ ๋๋ฒ๊ฑฐ ์ฐ๊ฒฐํ๋ ์์ ์ง์ผ์ผ ํจ!
๐ ๋๋ฒ๊น ํจ๋ ํ์ฉ
Watch ํจ๋: ํน์ ํํ์ ๊ฐ์ ๊ณ์ ๋ชจ๋ํฐ๋ง
์:
arr.length, user.name ๊ฐ์ ํํ์ ์ถ๊ฐCall Stack ํจ๋: ํจ์ ํธ์ถ ์คํ ํ์ธ, ์ด๋์ ํธ์ถ๋๋์ง ์ถ์
Debug Console: ๋ธ๋ ์ดํฌํฌ์ธํธ์์ ๋ฉ์ถ ์ํ๋ก ์ฝ๋ ์คํ ๊ฐ๋ฅ
8๏ธโฃ TypeScript ์ฐ๋ โ JS์์ TS๋ก ์ ๊ทธ๋ ์ด๋ ๐
์์ฆ JavaScript ํ๋ก์ ํธ์์ TypeScript ์ ์ฐ๋ ๊ณณ ์ฐพ๊ธฐ ํ๋ค์ด์ง. VS Code๋ TypeScript๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ณ๋ ํ์ฅ ์์ด๋ ํ์ ์ฒดํฌ๊ฐ ๋จ. ๊ทผ๋ฐ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ค์ ํ๋ฉด ํจ์ฌ ๊ฐ๋ ฅํด์ง.
๐ฆ TypeScript ๊ด๋ จ ํ์ ํ์ฅ
ํ์ 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"]
}
// @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 - WSL: Windows์์ Linux ํ๊ฒฝ์ผ๋ก ๊ฐ๋ฐ (Windows ์ฌ์ฉ์ ๊ฐ์ถ!)
Dev Containers: Docker ์ปจํ ์ด๋ ์์์ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ
GitHub Codespaces: ๋ธ๋ผ์ฐ์ ์์ VS Code ํ๊ฒฝ์ผ๋ก ๊ฐ๋ฐ
๐ ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ , ํผ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด? ๐ค
์ง๊ธ๊น์ง JavaScript ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๋ถํฐ VS Code ํ์ฅ ํ๋ก๊ทธ๋จ๊น์ง ์์ฒญ ๋ง์ ๋ด์ฉ์ ๋ค๋ค๋๋ฐ, ์ฒ์ ์ ํ๋ ์ฌ๋ํํ ๋ ์ข ๋ฒ ์ฐฐ ์ ์์ ใ ใ ๊ทผ๋ฐ ์ด๊ฒ ํ๋ฒ ์ ๋๋ก ์ธํ ํด๋๋ฉด ์ง์ง ์ค๋ ์จ๋จน์ ์ ์๋ ์ง์์ด๋ผ์ ํฌ์ํ ๊ฐ์น๊ฐ ์ถฉ๋ถํ ์์!
๋ง์ฝ ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ์ด๋ JavaScript ํ์ต์์ ๋งํ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด, ์ฌ๋ฅ๋ท์์ JavaScript ์ ๋ฌธ๊ฐ๋ค์ ๋์์ ๋ฐ์ ์ ์์. ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๋ถํฐ ์ฝ๋ ๋ฆฌ๋ทฐ, ํ๋ก์ ํธ ๋ฉํ ๋ง๊น์ง ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ๊ฐ๋ฐ์๋ค์ด ์์ผ๋๊น ์ฐธ๊ณ ํด๋ด ๐
๐ฏ ๋ง์ง๋ง์ผ๋ก โ ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ์ ์ฒ ํ
๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ์ ํ๋ฒ ํ๊ณ ๋๋๋ ๊ฒ ์๋. ์๋ก์ด ๋๊ตฌ๊ฐ ๋์ค๊ณ , ํ์ ์๊ตฌ์ฌํญ์ด ๋ฐ๋๊ณ , ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๊ณ์ ์งํํด์ผ ํจ. ์ค์ํ ๊ฑด ๋๊ตฌ์ ๋๋ ค๋ค๋์ง ๋ง๊ณ ๋๊ตฌ๋ฅผ ๋ด ๊ฒ์ผ๋ก ๋ง๋๋ ๊ฒ์.
์ฒ์์๋ ์ด๊ฒ์ ๊ฒ ์ค์นํ๊ณ ์ธํ ํ๋ ๊ฒ ๊ท์ฐฎ๊ฒ ๋๊ปด์ง ์ ์๋๋ฐ, ํ๋ฒ ์ ๋๋ก ์ธํ ํด๋๋ฉด ๊ทธ ๋ค์๋ถํฐ๋ ์ฝ๋ฉ ์์ฒด์๋ง ์ง์คํ ์ ์์. ๊ทธ๊ฒ ๋ฐ๋ก ์ข์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ชฉ์ ์ด์์ ใ ใ
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ธํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ฑฐ๋, ๋ณธ์ธ์ด ์๊ณ ์๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์. ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์์ ์๋ก ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ๊ฒ ๊ฒฐ๊ตญ ๊ฐ์ฅ ๋น ๋ฅธ ๊ธธ์ด๋๊น ๐ช
๐ธ VS Code settings.json ์ปค์คํฐ๋ง์ด์ง
๐ธ Prettier + ESLint๋ก ์ฝ๋ ํ์ง ๊ด๋ฆฌ
๐ธ Husky + lint-staged๋ก ์ปค๋ฐ ์ ์๋ ๊ฒ์ฌ
๐ธ GitLens, Error Lens, Thunder Client ๋ฑ ์์ฐ์ฑ ํ์ฅ
๐ธ Vite๋ก ๋น ๋ฅธ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ
๐ธ VS Code ๋ด์ฅ ๋๋ฒ๊ฑฐ ํ์ฉ
๐ธ .vscode ํด๋๋ก ํ ์ค์ ๊ณต์
์ด ๋ชจ๋ ๊ฑธ ๋ค ํ๋ฒ์ ์ ์ฉํ๋ ค ํ์ง ๋ง๊ณ , ํ๋์ฉ ์ตํ๊ฐ๋ฉด์ ๋ณธ์ธ ๊ฒ์ผ๋ก ๋ง๋ค์ด๊ฐ๋ ๊ฒ ํฌ์ธํธ์ผ! ํ์ดํ ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.