์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋…ธ๋“œ 2] 17์žฅ. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋…ธ๋“œ ๊ฐœ๋ฐœ

23-24/Node.js 2

by _๋„๋‹ด 2024. 1. 19. 10:00

๋ณธ๋ฌธ

728x90

๐ŸŒŸ17์žฅ ํ‚ค์›Œ๋“œ๐ŸŒŸ

pm2

redis

AWS

Lightsail

 

1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํƒ€์ž…์ด ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€๋œ ์–ธ์–ด (๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ ๊ฐ’, ๊ฐ์ฒด ๋“ฑ์˜ ์ž๋ฃŒํ˜•)
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ -> tsc(์ปดํŒŒ์ผ๋Ÿฌ) -> ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ -> ๋…ธ๋“œ ์‹คํ–‰
  • ๋””๋…ธ(deno): ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ ๋Œ€์‹  ์œ„ ๋ฐฉ๋ฒ•์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•จ
  • typescript ํŒจํ‚ค์ง€, tsc ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘๋™, tsc --init ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด tsconfig.json ์„ค์ •ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

tsconfig.json ๋‚ด์šฉ: ์˜ต์…˜์ด ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•˜๋‹ค (์ฃผ์„์ฒ˜๋ฆฌ ๋˜์–ด์žˆ์Œ)


๋” ๋งŽ์€ ์„ค๋ช…: https://aka.ms/tsconfig

 

TSConfig Reference - Docs on every TSConfig option

From allowJs to useDefineForClassFields the TSConfig reference includes information about all of the active compiler flags setting up a TypeScript project.

www.typescriptlang.org

 

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig to read more about this file */

    /* Language and Environment */
    "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "module": "commonjs",          /* (๋…ธ๋“œ๋ฉด commonjs, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” es2022) Specify what module code is generated. */
    "esModuleInterop": true,           /* CommonJS ๋ชจ๋“ˆ๋„ ECMAScript ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ์ธ์‹ํ•˜๊ฒŒ ํ•ด์คŒ Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    "forceConsistentCasingInFileNames": true,            /* import ์‹œ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ Ensure that casing is correct in imports. */

    /* Type Checking */
    "strict": true,                /* ํ•„์ˆ˜!! ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ ์‹ค์‹œ Enable all strict type-checking options. */
    "skipLibCheck": true     /* ๋‚ด๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž…๋งŒ ๊ฒ€์‚ฌ Skip type checking all .d.ts files. */
  }
}

 

 

๐Ÿ“Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ vs. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ

compare.js

let a = 'hello';
a = 'world';

 

index.ts

let a = 'hello';
a = 'world';

.ts ํŒŒ์ผ์„ npx tsc ๋ช…๋ น์œผ๋กœ .js ํŒŒ์ผ๋กœ ๋ณ€ํ™˜


์ปดํŒŒ์ผ ํ›„์˜ index.js

"use strict";  // tsc์—์„œ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ
let a = 'hello';
a = 'world';

 

ํƒ€์ž… ์ถ”๋ก 

์ดˆ๊ธฐ์— ๋ถ€์—ฌํ•œ ๊ฐ’์ด ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ ts๋Š” a๋ฅผ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋กœ ์ถ”๋ก ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ์ˆซ์ž ํƒ€์ž…์˜ ๊ฐ’ 123์„ ๋„ฃ์œผ๋ฉด ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
(VS Code์—์„œ๋Š” ts->js ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์—๋„ ๋นจ๊ฐ„ ๋ฐ‘์ค„์ด ๋œฌ๋‹ค)

 

๊ทธ๋Ÿฐ๋ฐ? ์ด๋Ÿฐ ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ index.js๋Š” ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ๋œ๋‹ค.
๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ด์ง€ ์•Š๊ณ  ํƒ€์ž… ๊ฒ€์‚ฌ๋งŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” npx tsc --noEmit

 

๐Ÿ“Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๋ช…์‹œ์ ์ธ ํƒ€์ž… ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ(ํƒ€์ดํ•‘)

compare.js

let a = true;
const b = { hello: 'world' };

function add(x, y) { return x + y };
const minus = (x, y) => x - y;

 

index.ts
์ฝœ๋ก (:) ๋’ค์— ํƒ€์ž…์„ ๋ช…์‹œ

let a: boolean = true;
const b: { hello: string } = { hello: 'world' };

function add(x: number, y: number): number { return x + y };
const minus = (x: number, y: number): number => x - y;
function ์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜ํƒ€์ž…): ๋ฐ˜ํ™˜๊ฐ’ํƒ€์ž… { ํ•จ์ˆ˜๋‚ด์šฉ };     // ์ฝ”ํ‹€๋ฆฐ๊ณผ ๊ฐ™์Œ
const ์ด๋ฆ„ = (๋งค๊ฐœ๋ณ€์ˆ˜: ๋งค๊ฐœ๋ณ€์ˆ˜ํƒ€์ž…): ๋ฐ˜ํ™˜๊ฐ’ํƒ€์ž… => ํ•จ์ˆ˜๋‚ด์šฉ;
  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์€ ํ•„์ˆ˜๋กœ ์ง€์ •
  • ๋ฐ˜ํ™˜๊ฐ’์€ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ƒ๋žต ๊ฐ€๋Šฅ
  • tsc๋Š” ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์„ ๋•Œ any ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•จ
  • ๊ฐœ๋ฐœ์ž๋Š” any ํƒ€์ž…์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜๋ฉฐ, tsc๊ฐ€ any ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•œ ๊ฒƒ๋“ค์— ํƒ€์ž…์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋จ.

๐Ÿ“Œ ์ž์ฃผ ์“ฐ์ด๋Š” ํƒ€์ž…

types.ts

  • ๊ฐ™์€ ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์„ ์–ธํ•˜๋ฉด ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„๋‹ค (ํ™•์žฅ)
let a: string | number = 'hello'; // ์œ ๋‹ˆ์–ธ ํƒ€์ดํ•‘
a = 123;

let arr: string[] = []; // ๋ฐฐ์—ด ํƒ€์ดํ•‘
arr.push('hello');

interface Inter {
  hello: string;
  world?: number; // ์žˆ์–ด๋„ ๋˜๊ณ  ์—†์–ด๋„ ๋˜๋Š” ์†์„ฑ
} // ๊ฐ์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํƒ€์ดํ•‘ํ•  ์ˆ˜ ์žˆ์Œ
const b: Inter = { hello: 'interface' };

type Type = {
  hello: string;
  func?: (param?: boolean) => void; // ํ•จ์ˆ˜๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ํƒ€์ดํ•‘ํ•จ
}
const c: Type = { hello: 'type' };

interface Merge {
  x: number,
}
interface Merge {
  y: number,
}
const m: Merge = { x: 1, y: 2 };

export { a }; // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ECMAScript ๋ชจ๋“ˆ์„ ์‚ฌ์šฉ

 

 

๊ฐ์ฒด ๋‹ค๋ฃจ๊ธฐ

1. interface๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•

// ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ
interface MyObjectType {
    // ํ•จ์ˆ˜ ํ”„๋กœํผํ‹ฐ ์„ ์–ธ
    myFunction: () => void;
    // ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋“ค๋„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    name: string;
    age: number;
}

// ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ํ• ๋‹น
let myObject: MyObjectType = {
    myFunction: () => {
        console.log("Hello, I'm a function in the object!");
    },
    name: "John",
    age: 25,
};

 

2. type์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•

 

// ํƒ€์ž… ์„ ์–ธ
type MyObjectType = {
    // ํ•จ์ˆ˜ ํ”„๋กœํผํ‹ฐ ์„ ์–ธ
    myFunction: () => void;
    // ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋“ค๋„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    name: string;
    age: number;
};

// ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ํ• ๋‹น
let myObject: MyObjectType = {
    myFunction: () => {
        console.log("Hello, I'm a function in the object!");
    },
    name: "John",
    age: 25,
};

 

๐Ÿ“Œ ๋…ธ๋“œ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

ts๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ ๋ชจ๋“ˆ์˜ ํƒ€์ž… ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.
npm i -D @types/node ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

import fs from 'fs';

fs.readFile('package.json');

 

์œ„ ์ƒํƒœ๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์‹ค์‹œ npx tsc --noEmit ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

๊ถ๊ธˆํ•œ ํƒ€์ž…์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  F12 ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ํƒ€์ž… ์„ค๋ช…์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (ํƒ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•ด ๋‘” ํƒ€์ž…)
readFile์˜ ํƒ€์ž… ์ •์˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด (@types/node/fs.d.ts๋กœ ์ด๋™) readFile์˜ ์ •์˜๊ฐ€ 3๊ฐœ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (์˜ค๋ฒ„๋กœ๋”ฉ)

  • ํ•จ์ˆ˜ ์ •์˜์— ๋งž๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ
import fs from 'fs';

fs.readFile('package.json', (err, result) => {
    console.log(result);
});
  • ํ”„๋กœ๋ฏธ์Šค ๋ฐฉ์‹
import fs from 'fs/promises';

fs.readFile('package.json')
    .then((result) => { // result๋Š” Buffer ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
        console.log(result);
    })
    .catch(console.error);

 

2. ์ปค๋ฎค๋‹ˆํ‹ฐ ํƒ€์ž… ์ •์˜ ์ ์šฉํ•˜๊ธฐ

11์žฅ์˜ NodeBird ํ”„๋กœ์ ํŠธ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•˜์ž!
npm i typescript
npx tsc --init
tsconfig.json ์„ค์ •ํŒŒ์ผ์—์„œ allowJS ์˜ต์…˜์„ true๋กœ ์„ค์ •: ์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๋ถ€๋งŒ ts๋กœ ์ž‘์„ฑํ•ด๋„ ๋‹ค๋ฅธ js ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

โš ๏ธ TS7016 ์—๋Ÿฌ: ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€์— ํƒ€์ž… ์ •์˜๊ฐ€ ์—†์Œ

๐Ÿ“Œ DefinitelyTyped ํŒจํ‚ค์ง€

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์ต์Šคํ”„๋ ˆ์Šค, cookie-parser ๋“ฑ)์— ํƒ€์ž… ์ •์˜๋ฅผ ์ ์šฉํ•ด ๋‘ .

ํŒจํ‚ค์ง€๋ณ„ ์ง€์› ์—ฌ๋ถ€๋ฅผ npm ํ™ˆํŽ˜์ด์ง€์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

  • TS: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋จ
  • DT: DefinitelyTyped์—์„œ ๋Œ€์‹  ํƒ€์ž… ์ •์˜๋ฅผ ์ œ๊ณต

 

NodeBird ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์ •์˜ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ์„ค์น˜ํ•˜๊ธฐ
npm i -D @types/bcrypt @types/cookie-parser @types/express @types/express-session @types/morgan @types/nunjucks @types/passport @types/sequelize @types/node

 

 

โš ๏ธ TS2322 ์—๋Ÿฌ: string | string[] ํƒ€์ž…์ธ ๊ณณ์— string | undefined ํƒ€์ž…์„ ๋„ฃ์„ ์ˆ˜ ์—†์Œ

๋ถ„๋ช… .env์— COOKIE_SECRET์„ ๋„ฃ์—ˆ๋Š”๋ฐ ์™œ string์ด ์•„๋‹ˆ๋ผ string|undefined๋ผ๋Š” ๊ฑธ๊นŒ?
์ด์œ ๋Š” tsc๊ฐ€ ๊ทธ๊ฑธ ์•Œ ์ •๋„๋กœ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค... (.env๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์•„๋‹ˆ๊ธฐ์— ๊ทธ ๊ฐ’์ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด์„œ string|undefined ๋ผ๊ณ  ์ถ”๋ก ํ•œ ๊ฒƒ)

 

ํ•ด๊ฒฐ: ํƒ€์ž… ๋’ค์— ๋Š๋‚Œํ‘œ๋ฅผ ๋ถ™์—ฌ undefined๊ฐ€ ์•„๋‹˜์„ ๋ช…์‹œ

secret: process.env.COOKIE_SECRET!,

 

โš ๏ธ TS5055 ์—๋Ÿฌ

๋ชจ๋“  ํŒŒ์ผ์„ ts๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฌด์‹œํ•˜๊ณ  ์ง„ํ–‰

 

 

3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ํƒ€์ดํ•‘ํ•˜๊ธฐ

๋Œ€๋ถ€๋ถ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž… ์ •์˜๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํ•ด๊ฒฐ - NodeBird ํ”„๋กœ์ ํŠธ๊ฐ€ ์ต์Šคํ”„๋ ˆ์Šค, ์‹œํ€„๋ผ์ด์ฆˆ, ํŒจ์ŠคํฌํŠธ ๋“ฑ์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ

โš ๏ธ TS2339 ์—๋Ÿฌ: ํŠน์ • ๊ฐ์ฒด์— ์†์„ฑ์ด ์—†์Œ

์†์„ฑ=์†์„ฑ๊ฐ’ ์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๊ฐ์ฒด์— ํ•ด๋‹น ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ => ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค!

  • types/index.d.ts ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค
  • ํ™•์žฅ์ž .d.ts: ํ•ด๋‹น ํŒŒ์ผ์ด ํƒ€์ž… ์ •์˜๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค
import IUser from '../models/user';

declare global {
  interface Error {
    status?: number;
  }

  namespace Express {
    interface User extends IUser {}
  }
}

 

โš ๏ธ TS7006 ์—๋Ÿฌ: Parameter 'X' implicitly has an 'any' type

โš ๏ธ error TS2307: Cannot find module '../config/config' or its corresponding type declarations.

https://chiabi.github.io/2018/08/30/typescript/

 

4. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ํƒ€์ดํ•‘ํ•˜๊ธฐ

(์ด์ „๊นŒ์ง€์˜ ๋ฐฉ๋ฒ•: ํŒจ์ŠคํฌํŠธ, ์‹œํ€„๋ผ์ด์ฆˆ ๋“ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ž… ์ •์˜ ์„ค์น˜ํ•ด์„œ ํ•ด๊ฒฐ)

  • controllers, routes, middlewares ๋“ฑ ์†์ˆ˜ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ ํŒŒ์ผ์„ ํƒ€์ดํ•‘ํ•˜๊ธฐ
  • ๋ฐฉ๋ฒ•: js ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ts๋กœ ๋ณ€๊ฒฝ, ๋ชจ๋“ˆ์„ ECMAScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ˆ˜์ •

 

1) ๋ฏธ๋“ค์›จ์–ด

๋ฐฉ๋ฒ• 1) ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ดํ•‘

err, req, res, next๋ฅผ ํƒ€์ดํ•‘ํ•ด์•ผ ํ•จ (app.ts์™€ middlewares์™€ controllers์—์„œ ์‚ฌ์šฉ ์ค‘)

express๋กœ๋ถ€ํ„ฐ ํƒ€์ž…์„ ๋ถˆ๋Ÿฌ์™€ ํƒ€์ดํ•‘ํ•  ์ˆ˜ ์žˆ์Œ (@types/express/index.d.ts ์ฐธ๊ณ )
middlewares/index.ts ํŒŒ์ผ

 

 

import { Request, Response, NextFunction } from 'express';

const isLoggedIn = (req: Request, res: Response, next: NextFunction) => { ... };

 

๋ฐฉ๋ฒ• 2) ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํƒ€์ดํ•‘

ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ RequestHandler๋ผ๋Š” ํƒ€์ž…์ด๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜ ์ž์ฒด์— ํƒ€์ดํ•‘ํ•  ์ˆ˜๋„ ์žˆ์Œ (๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’์€ ์ž๋™์œผ๋กœ ํƒ€์ดํ•‘๋จ)

 

2) ์ปจํŠธ๋กค๋Ÿฌ

๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ€์ดํ•‘ํ•œ๋‹ค.

  • js ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ts๋กœ ๋ณ€๊ฒฝ
  • ๋ชจ๋“ˆ์„ ECMAScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ˆ˜์ •

โš ๏ธ TS2345 ์—๋Ÿฌ, TS2339 ์—๋Ÿฌ: ์‹œํ€„๋ผ์ด์ฆˆ ๊ด€๋ จ 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹œํ€„๋ผ์ด์ฆˆ ๋ชจ๋ธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•  ๋•Œ ๋ฐœ์ƒ.

11์žฅ์˜ ์ž๋™์œผ๋กœ ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ค๋˜ ์ฝ”๋“œ ๋Œ€์‹  ์ผ์ผ์ด importํ•˜๋„๋ก ์ž‘์„ฑ.
๋˜ํ•œ, ์ง์ ‘ ๋ชจ๋ธ์˜ getPosts, addHashtags, addFollowing ๋ฉ”์„œ๋“œ๋ฅผ ํƒ€์ดํ•‘ํ•ด์•ผ ํ•จ.

 

3) ๋ผ์šฐํ„ฐ

๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ€์ดํ•‘ํ•œ๋‹ค.

  • js ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ ts๋กœ ๋ณ€๊ฒฝ
  • ๋ชจ๋“ˆ์„ ECMAScript ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์œผ๋กœ ์ˆ˜์ •

 

5. ์ดํ‰

๊ฐœ๋ฐœ์˜ ํŽธ์˜์„ฑ๋ณด๋‹ค๋Š” ์—๋Ÿฌ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ.

 

 

[์ถœ์ฒ˜] ์กฐํ˜„์˜, ใ€ŽNode.js ๊ต๊ณผ์„œใ€, ๊ธธ๋ฒ—(2020), p781-829


Node.js #2 

Editor : ์œ ์ฆˆ

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ