๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ ํŒ (๊ธฐ์ˆ  ์ ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ)/JS&TS

[์„ค์ •] JS/TS ํ”„๋กœ์ ํŠธ ์„ค์ •๋ฒ• (in Webstorm)

by dev_writer 2025. 1. 28.

์•ˆ๋…•ํ•˜์„ธ์š” dev_writer์ž…๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ๋‹ค์†Œ ์‹ฌํ”Œํ•œ ์ฃผ์ œ๋กœ, JS/TS ํ”„๋กœ์ ํŠธ๋ฅผ Webstorm์—์„œ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด ๋ณด๋Š” ๊ธ€์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋™์•ˆ IntelliJ์—์„œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋งŒ ์ง„ํ–‰ํ–ˆ๋‹ค ๋ณด๋‹ˆ JS/TS ์‹ ๊ทœ ํ”„๋กœ์ ํŠธ๋ฅผ Webstorm์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์ฃผ ์ฐพ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด ์ฐธ์— ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•ด ๋‘๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ๋„ ์š”๊ธดํ•˜๊ฒŒ ์“ฐ์ผ ๊ฒƒ ๊ฐ™์•„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์‹คํ–‰ ํ™˜๊ฒฝ: Mac
์‹คํ–‰ ์–ธ์–ด: TypeScript
์‹คํ–‰ ํ”„๋ ˆ์ž„์›Œํฌ: Express
Webstorm, nvm, node๋Š” ์ปดํ“จํ„ฐ์— ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๋˜, Nest.js ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์“ฐ๋˜ Eslint๋‚˜ Prettier ์„ค์ •์€ ๋ณธ ๊ธ€๊ณผ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ์— ๊ทธ๋Ÿฐ ์ฐจ์›์—์„œ๋„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1๋‹จ๊ณ„: ๋นˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

Webstorm์—์„œ ๋นˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

<์ƒ์„ฑ๊ธฐ>์—์„œ Express๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2๋‹จ๊ณ„: npm init

npm init์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ •์˜ํ•ด ๋‘” ๊ฐ’์ด ์—†๋‹ค๋ฉด ๊ฐ ๋‹จ๊ณ„์—์„œ ์—”ํ„ฐ๋งŒ ์ž…๋ ฅํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

devholic@devholicui-MacBookAir express % npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (express) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/devholic/Desktop/express/package.json:

{
  "name": "express",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "description": ""
}


Is this OK? (yes)

 

3๋‹จ๊ณ„: npm ํŒจํ‚ค์ง€ ์„ค์น˜

๋‹ค์Œ์œผ๋กœ๋Š” ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

// Express
npm i express
npm i --save-dev @types/express

// TypeScript
npm i --save-dev typescript ts-node

// Nodemon
npm i --save-dev nodemon

// ESLint & Prettier
npm i --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-prettier prettier
  • Express: ๋ณธ ๊ธ€์—์„œ ์ง„ํ–‰ํ•  ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
    • @types/express: express ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํƒ€์ž…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. tsconfig.json์—์„œ์˜ Any ํƒ€์ž…์„ ๊ทœ์ œํ•œ๋‹ค๋ฉด (noImplicitAny) express๋ฅผ ์ž„ํฌํŠธ ํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ค์น˜ํ•ด ๋‘ก๋‹ˆ๋‹ค.
  • TypeScript: ๋ณธ ๊ธ€์—์„œ ์ง„ํ–‰ํ•  ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
    • ts-node: TypeScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Node.js ์‹คํ–‰๊ธฐ์ž…๋‹ˆ๋‹ค. TypeScript ํŒŒ์ผ์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. (์„ ํƒ ์‚ฌํ•ญ)
  • Nodemon: ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • ESLint: ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋ณด์žฅํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
    • @typescript-eslint/parser: ESLint๋Š” ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ์ ์šฉ๋˜๊ธฐ ์œ„ํ•ด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • @typescript-eslint/eslint-plugin: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ „์šฉ ์ถ”๊ฐ€ ๊ทœ์น™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • eslint-config-prettier: ESLint์™€ Prettier ๊ฐ„์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Prettier: ์ผ๊ด€๋œ ํ…์ŠคํŠธ ์ž‘์„ฑ์„ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

4๋‹จ๊ณ„: ๊ฐ ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ

๊ฐ ์„ค์ • ํŒŒ์ผ๋“ค์„ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์ž‘์„ฑํ•ด ๋‘ก๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ • ์ž‘์„ฑ (tsconfig.json)

package.json์—์„œ์˜ module์€ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ฆ‰, node ํ™˜๊ฒฝ์€ CommonJS)
{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "esModuleInterop": true,
    "sourceMap": true, // ์„ ํƒ
    "outDir": "./dist" // ์„ ํƒ
  },
  "include": [
    "src/**/*.ts",
    "tests/**/*.spec.ts",
  ]
}
  • compilerOptions: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • target: ์–ด๋Š ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ• ์ง€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ES6 ์ดํ›„๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ES6์œผ๋กœ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
    • module: ๋ณ€ํ™˜๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋ชจ๋“ˆ์„ ๋”ฐ๋ฅผ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CommonJS๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ require๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ES6์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ๋„ import๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ECMAScript๋ฅผ ์„ ํ˜ธํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ECMAScript๋กœ ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ˆ์™ธ (undici-types ๋ชจ๋“ˆ ์กฐํšŒ ๋ถˆ๊ฐ€๋Šฅ ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๋กœ ๋ณด์•„ CommonJS๋กœ ๋‘๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • strict: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์ฒดํ‚น ๋™์ž‘ ๋“ฑ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’๋„ true์ž…๋‹ˆ๋‹ค.
    • noImplicitAny: ๋ณ€์ˆ˜ ๋“ฑ์— ๋ช…์‹œ์ ์œผ๋กœ any๋ฅผ ์ ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ ์–ด์•ผ๋งŒ ์ •์ƒ ์ž‘๋™๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • strictNullChecks: number ๋“ฑ์˜ ํƒ€์ž…์— null, undefined๋ฅผ ๋„ฃ์œผ๋ ค๊ณ  ํ•  ๋•Œ ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • esModuleInterop: CommonJS๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ๋“ค์„ ES6 ๋ชจ๋“ˆ ์‚ฌ์–‘์— ๋งž๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • sourceMap, outDir: outDir์€ ๋ณ€ํ™˜๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ์ƒ์„ฑ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ , sourceMap์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ์†Œ์Šค ๋งต์„ ํฌํ•จ ํ•˜๋„๋ก ํ•˜์—ฌ ๋””๋ฒ„๊น… ์‹œ ์›๋ณธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
      • ๋‹ค๋งŒ, ts-node๋ฅผ ์„ค์น˜ํ•˜๊ณ  start ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด sourceMap, outDir์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (๊ทธ ๋Œ€์‹  ์ปดํŒŒ์ผ ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ธฐ์—, ๋‘˜ ์ค‘์— ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.)
  • include: ์ปดํŒŒ์ผํ•  ํŒŒ์ผ๋“ค์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํŒŒ์ผ๊ณผ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ ์šฉ๋˜๋„๋ก ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Nodemon ์„ค์ • (nodemon.json)

nodemon.json์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

{
  "watch": ["src"],
  "ext": "ts",
}
  • watch: ๊ฐ์‹œํ•  ๊ตฌ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ext: ๊ฐ์‹œํ•  ํ™•์žฅ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„ package.json์˜ ์Šคํฌ๋ฆฝํŠธ์— ์•„๋ž˜์™€ ๊ฐ™์ด nodemon์„ ๋ถ™์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

"scripts": {
    "start": "nodemon --exec 'tsc && node' dist/index.js",
},
...

ESLint

ESLint ์„ค์ •์€ ESLint 9๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ๊นŒ๋‹ค๋กœ์›Œ์กŒ๋Š”๋ฐ, ํ•ด๋‹น ๋ถ€๋ถ„์€ ์•„์ง ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

devholic@devholicui-MacBookAir express % npm init @eslint/config

> express@1.0.0 npx
> create-config

@eslint/create-config: v1.4.0

โœ” How would you like to use ESLint? · problems
โœ” What type of modules does your project use? · esm
โœ” Which framework does your project use? · none
โœ” Does your project use TypeScript? · typescript
โœ” Where does your code run? · node
The config that you've selected requires the following dependencies:

eslint, globals, @eslint/js, typescript-eslint
โœ” Would you like to install them now? · No / Yes
โœ” Which package manager do you want to use? · npm
โ˜•๏ธInstalling...

added 2 packages, changed 1 package, and audited 301 packages in 1s

77 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Successfully created /Users/devholic/Desktop/express/eslint.config.mjs file.

 

์ดํ›„ eslint.config.mjs ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”๋ฐ, ๋นŒ๋“œ ํด๋”์ธ dist์—์„œ๋Š” eslint๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋„๋ก ignore๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';

/** @type {import('eslint').Linter.Config[]} */
export default [
  { files: ['**/*.{js,mjs,cjs,ts}'] },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  {
    ignores: ['dist/*'],
  },
  // ๋งŒ์•ฝ rules๋ฅผ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  {
    rules: {
      // args all: ๋ชจ๋‘, none: ๊ฒ€์‚ฌ X, after-used: ์„ ์–ธ๋œ ์ธ์ž ์ค‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋งŒ ๊ฒฝ๊ณ 
      '@typescript-eslint/no-unused-vars': ['error', { args: 'all' }],
      
      // ์Šคํƒ€์ผ ๊ฒฝ๊ณ  ์˜ˆ์‹œ
      indent: ['error', 2],
    }
  }
];

 

๋˜ํ•œ, Webstorm์—์„œ ์ž‘์„ฑํ•œ ESLint๋ฅผ ๋”ฐ๋ฅด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ESLint์— ๋งž๊ฒŒ ๊ณ ์น˜๋Š” ๊ฒƒ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

ESLint๋Š” ์ž๋™ ๊ตฌ์„ฑ์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค.

Prettier

Prettier ์„ค์ •๋„ Webstorm๊ณผ ํ•จ๊ป˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €. prettierrc์— ํ•ด๋‹น ์ฝ”๋“œ์ฒ˜๋Ÿผ ์„ค์ •์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2
}

 

๊ทธ๋‹ค์Œ, Webstorm ์„ค์ • > ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ > JavaScript > Prettier์—์„œ ์ˆ˜๋™ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ > Prettier ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•œ prettier๋กœ ๋‘ก๋‹ˆ๋‹ค.

 

์ดํ›„ <์ €์žฅ ์‹œ ๋ชจ๋“  ์•ก์…˜>์—์„œ Prettier ์‹คํ–‰๋„ ์„ค์ •ํ•ด ๋‘ก๋‹ˆ๋‹ค.

 

๊ฐ„ํ˜น Prettier์—์„œ ํƒญ ํฌ๊ธฐ๋ฅผ 2๋กœ ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  4๋กœ ๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ํ…๋ฐ์š”, ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋Š” Webstorm ์„ค์ • > ์—๋””ํ„ฐ > ์ฝ”๋“œ ์Šคํƒ€์ผ > JavaScript, TypeScript ๋ถ€๋ถ„์—์„œ์˜ ์„ค์ •์„ 2๋กœ ํ•ด ๋‘๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

 

์ฝ”๋“œ๋ฅผ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์–ด์ง€๋Ÿฝ๊ฒŒ ์ž‘์„ฑํ•ด ๋‘” ๋’ค

 

Cmd + S๋ฅผ ๋ˆ„๋ฅด๋ฉด, Prettier์— ์˜ํ•ด ์ž๋™ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

 

์ตœ์ข… ์ •๋ฆฌ

์ตœ์ข… ์ž‘์„ฑํ•œ package.json๊ณผ ์˜ˆ์‹œ src/index.ts๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// package.json
{
  "name": "express",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "lint": "eslint .",
    "build": "tsc",
    // ์›ํ™œํ•œ nodemon์„ ์œ„ํ•ด ts-node๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•จ
    "start": "nodemon --exec ts-node src/index.ts",
    "prestart": "npm run lint && npm run clean && npm run build",
    "clean": "rimraf dist"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "express": "^4.21.2"
  },
  "devDependencies": {
    "@eslint/js": "^9.19.0",
    "@types/express": "^5.0.0",
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "eslint": "^8.57.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "globals": "^15.14.0",
    "nodemon": "^3.1.9",
    "prettier": "^3.4.2",
    "rimraf": "^6.0.1", // dist ํด๋” ์ œ๊ฑฐ ์šฉ๋„
    "ts-node": "^10.9.2",
    "typescript": "^5.7.3",
    "typescript-eslint": "^8.22.0"
  }
}
// ์˜ˆ์‹œ index.js
import express from 'express';

const app = express();

app.get('/', (req, res) => {
  console.log('Hello World!!');
  res.send('Welcome to the API!');
});

app.listen(3000, async () => {
  // ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log('Server started on port 3000');
});

 

์ฐธ๊ณ  ์ž๋ฃŒ