๐17์ฅ ํค์๋๐
pm2
redis
AWS
Lightsail
tsconfig.json ๋ด์ฉ: ์ต์ ์ด ๊ต์ฅํ ๋ค์ํ๋ค (์ฃผ์์ฒ๋ฆฌ ๋์ด์์)
๋ ๋ง์ ์ค๋ช
: https://aka.ms/tsconfig
{
"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. */
}
}
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 ์ด๋ฆ = (๋งค๊ฐ๋ณ์: ๋งค๊ฐ๋ณ์ํ์
): ๋ฐํ๊ฐํ์
=> ํจ์๋ด์ฉ;
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);
11์ฅ์ NodeBird ํ๋ก์ ํธ์ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฉํ์!
npm i typescript
npx tsc --init
tsconfig.json ์ค์ ํ์ผ์์ allowJS ์ต์
์ true๋ก ์ค์ : ์ ์ฒด ํ๋ก์ ํธ์์ ์ผ๋ถ๋ง ts๋ก ์์ฑํด๋ ๋ค๋ฅธ js ์ฝ๋์ ํจ๊ป ์ฌ์ฉํ ์ ์์.
ํ์ ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ต์คํ๋ ์ค, cookie-parser ๋ฑ)์ ํ์ ์ ์๋ฅผ ์ ์ฉํด ๋ .
ํจํค์ง๋ณ ์ง์ ์ฌ๋ถ๋ฅผ npm ํํ์ด์ง์์ ํ์ธ ๊ฐ๋ฅ
NodeBird ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ํ์
์ ์ ํจํค์ง๋ฅผ ๋ชจ๋ ์ค์นํ๊ธฐ
npm i -D @types/bcrypt @types/cookie-parser @types/express @types/express-session @types/morgan @types/nunjucks @types/passport @types/sequelize @types/node
๋ถ๋ช
.env์ COOKIE_SECRET์ ๋ฃ์๋๋ฐ ์ string์ด ์๋๋ผ string|undefined๋ผ๋ ๊ฑธ๊น?
์ด์ ๋ tsc๊ฐ ๊ทธ๊ฑธ ์ ์ ๋๋ก ๋๋ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค... (.env๋ ํ์
์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋๊ธฐ์ ๊ทธ ๊ฐ์ด ์ค์ ๋ก ์กด์ฌํ๋์ง ์ ์ ์์ด์ string|undefined ๋ผ๊ณ ์ถ๋ก ํ ๊ฒ)
ํด๊ฒฐ: ํ์ ๋ค์ ๋๋ํ๋ฅผ ๋ถ์ฌ undefined๊ฐ ์๋์ ๋ช ์
secret: process.env.COOKIE_SECRET!,
๋ชจ๋ ํ์ผ์ ts๋ก ๋ณํํ๊ธฐ ์ ๊น์ง ์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋ฌด์ํ๊ณ ์งํ
๋๋ถ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์ ์๋ฅผ ์ค์นํ์ฌ ํด๊ฒฐ - NodeBird ํ๋ก์ ํธ๊ฐ ์ต์คํ๋ ์ค, ์ํ๋ผ์ด์ฆ, ํจ์คํฌํธ ๋ฑ์ ๊ฐํ๊ฒ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ
์์ฑ=์์ฑ๊ฐ ์ ์ง์ ํ๋ ค๊ณ ํ๋๋ฐ ๊ฐ์ฒด์ ํด๋น ์์ฑ์ด ์๋ ๊ฒฝ์ฐ => ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ค!
import IUser from '../models/user';
declare global {
interface Error {
status?: number;
}
namespace Express {
interface User extends IUser {}
}
}
https://chiabi.github.io/2018/08/30/typescript/
(์ด์ ๊น์ง์ ๋ฐฉ๋ฒ: ํจ์คํฌํธ, ์ํ๋ผ์ด์ฆ ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์ ์ ์ค์นํด์ ํด๊ฒฐ)
๋ฐฉ๋ฒ 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๋ผ๋ ํ์ ์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ํจ์ ์์ฒด์ ํ์ดํํ ์๋ ์์ (๋งค๊ฐ๋ณ์์ ๋ฐํ๊ฐ์ ์๋์ผ๋ก ํ์ดํ๋จ)
๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํ์ดํํ๋ค.
ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ํ๋ผ์ด์ฆ ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ ํ์ง ๋ชปํ ๋ ๋ฐ์.
11์ฅ์ ์๋์ผ๋ก ๋ชจ๋ธ์ ๋ถ๋ฌ์ค๋ ์ฝ๋ ๋์ ์ผ์ผ์ด importํ๋๋ก ์์ฑ.
๋ํ, ์ง์ ๋ชจ๋ธ์ getPosts, addHashtags, addFollowing ๋ฉ์๋๋ฅผ ํ์ดํํด์ผ ํจ.
๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํ์ดํํ๋ค.
๊ฐ๋ฐ์ ํธ์์ฑ๋ณด๋ค๋ ์๋ฌ ๋ฐฉ์ง๋ฅผ ์ํด ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒ.
[์ถ์ฒ] ์กฐํ์, ใNode.js ๊ต๊ณผ์ใ, ๊ธธ๋ฒ(2020), p781-829
[๋ ธ๋ 2] 15์ฅ. AWS๋ก ๋ฐฐํฌํ๊ธฐ (0) | 2024.01.12 |
---|---|
[๋ ธ๋ 2] 12์ฅ. ์น ์์ผ์ผ๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ์ ์กํ๊ธฐ (0) | 2024.01.05 |
[๋ ธ๋ 2] 11์ฅ. ๋ ธ๋ ์๋น์ค ํ ์คํธํ๊ธฐ (1) | 2023.12.29 |
[๋ ธ๋ 2] 10์ฅ. ์น API ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2023.12.22 |
[๋ ธ๋ 2] 9์ฅ. ์ต์คํ๋ ์ค๋ก SNS ์๋น์ค ๋ง๋ค๊ธฐ (1) | 2023.12.01 |