TypeScript λ° Node.jsλ₯Ό μ¬μ©νμ¬ κ°λ ₯ν μλ² μΈ‘ νμ μμ μ±μ ꡬννλ λ°©λ²μ μ΄ν΄λ³΄μΈμ. νμ₯ κ°λ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ ꡬμΆμ μν λͺ¨λ² μ¬λ‘, κ³ κΈ κΈ°μ λ° μ€μ©μ μΈ μμ λ₯Ό λ°°μλλ€.
TypeScript Node.js: μλ² μΈ‘ νμ μμ μ± κ΅¬ν
λμμμ΄ μ§ννλ μΉ κ°λ° νκ²½μμ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μλ² μΈ‘ μ ν리μΌμ΄μ μ ꡬμΆνλ κ²μ΄ κ°μ₯ μ€μν©λλ€. JavaScriptλ μ€λ«λμ μΉμ μΈμ΄μμ§λ§, λμ μΈ νΉμ±μΌλ‘ μΈν΄ λ°νμ μ€λ₯κ° λ°μνκ³ λκ·λͺ¨ νλ‘μ νΈλ₯Ό νμ₯νλ λ° μ΄λ €μμ΄ μμ μ μμ΅λλ€. μ μ νμ΄νμ μΆκ°νλ JavaScriptμ μμ μ§ν©μΈ TypeScriptλ μ΄λ¬ν λ¬Έμ μ λν κ°λ ₯ν μ루μ μ μ 곡ν©λλ€. TypeScriptμ Node.jsλ₯Ό κ²°ν©νλ©΄ νμ μμ νκ³ νμ₯ κ°λ₯νλ©° μ μ§ κ΄λ¦¬ κ°λ₯ν λ°±μλ μμ€ν μ ꡬμΆνκΈ° μν κ°λ ₯ν νκ²½μ μ 곡ν©λλ€.
Node.js μλ² μΈ‘ κ°λ°μ μν TypeScriptλ₯Ό μ νν΄μΌ νλ μ΄μ
TypeScriptλ Node.js κ°λ°μ λ§μ μ΄μ μ μ 곡νμ¬ JavaScriptμ λμ νμ΄νμ λ΄μ¬λ λ§μ μ ν μ¬νμ ν΄κ²°ν©λλ€.
- ν₯μλ νμ μμ μ±: TypeScriptλ μ»΄νμΌ μ μ격ν νμ κ²μ¬λ₯Ό μ μ©νμ¬ νλ‘λμ νκ²½μ λλ¬νκΈ° μ μ μ μ¬μ μΈ μ€λ₯λ₯Ό ν¬μ°©ν©λλ€. μ΄λ κ² νλ©΄ λ°νμ μμΈμ μνμ΄ μ€μ΄λ€κ³ μ ν리μΌμ΄μ μ μ λ°μ μΈ μμ μ±μ΄ ν₯μλ©λλ€. APIκ° μ¬μ©μ IDλ₯Ό μ«μλ‘ μμνμ§λ§ λ¬Έμμ΄μ μμ νλ μλ리μ€λ₯Ό μμν΄ λ³΄μΈμ. TypeScriptλ κ°λ° μ€μ μ΄ μ€λ₯λ₯Ό νλκ·Έ μ§μ νμ¬ νλ‘λμ νκ²½μμ μ μ¬μ μΈ μΆ©λμ λ°©μ§ν©λλ€.
- ν₯μλ μ½λ μ μ§ κ΄λ¦¬μ±: νμ μ£Όμμ μ¬μ©νλ©΄ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ λ¦¬ν©ν°λ§ν μ μμ΅λλ€. νμμ μμ ν λ λͺ νν νμ μ μλ κ°λ°μκ° μ½λλ² μ΄μ€μ μ¬λ¬ λΆλΆμ λͺ©μ κ³Ό μμλλ λμμ λΉ λ₯΄κ² νμ νλ λ° λμμ΄ λ©λλ€. μ΄λ μ§ννλ μꡬ μ¬νμ΄ μλ μ₯κΈ° νλ‘μ νΈμ νΉν μ€μν©λλ€.
- ν₯μλ IDE μ§μ: TypeScriptμ μ μ νμ΄νμ ν΅ν΄ IDE(ν΅ν© κ°λ° νκ²½)λ μ°μν μλ μμ±, μ½λ νμ λ° λ¦¬ν©ν°λ§ λꡬλ₯Ό μ 곡ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ κ°λ°μ μμ°μ±μ΄ ν¬κ² ν₯μλκ³ μ€λ₯ λ°μ κ°λ₯μ±μ΄ μ€μ΄λλλ€. μλ₯Ό λ€μ΄ VS Codeμ TypeScript ν΅ν©μ μ§λ₯μ μΈ μ μ λ° μ€λ₯ κ°μ‘° νμλ₯Ό μ 곡νμ¬ κ°λ° μλλ₯Ό λμ΄κ³ ν¨μ¨μ±μ λμ λλ€.
- μ‘°κΈ° μ€λ₯ κ°μ§: μ»΄νμΌ μ€μ νμ κ΄λ ¨ μ€λ₯λ₯Ό μλ³ν¨μΌλ‘μ¨ TypeScriptλ₯Ό μ¬μ©νλ©΄ κ°λ° μ£ΌκΈ° μ΄κΈ°μ λ¬Έμ λ₯Ό ν΄κ²°νμ¬ μκ°μ μ μ½νκ³ λλ²κΉ λ Έλ ₯μ μ€μΌ μ μμ΅λλ€. μ΄ μ¬μ μλ°©μ μ κ·Ό λ°©μμ μ€λ₯κ° μ ν리μΌμ΄μ μ ν΅ν΄ μ νλμ΄ μ¬μ©μμκ² μν₯μ λ―ΈμΉλ κ²μ λ°©μ§ν©λλ€.
- μ μ§μ μΈ μ±ν: TypeScriptλ JavaScriptμ μμ μ§ν©μ΄λ―λ‘ κΈ°μ‘΄ JavaScript μ½λλ₯Ό TypeScriptλ‘ μ μ§μ μΌλ‘ λ§μ΄κ·Έλ μ΄μ ν μ μμ΅λλ€. λ°λΌμ μ½λλ² μ΄μ€λ₯Ό μμ ν λ€μ μμ±νμ§ μκ³ λ νμ μμ μ±μ μ μ§μ μΌλ‘ λμ ν μ μμ΅λλ€.
TypeScript Node.js νλ‘μ νΈ μ€μ
TypeScript λ° Node.jsλ₯Ό μμνλ €λ©΄ Node.js λ° npm(Node Package Manager)μ μ€μΉν΄μΌ ν©λλ€. μ€μΉκ° μλ£λλ©΄ λ€μ λ¨κ³μ λ°λΌ μ νλ‘μ νΈλ₯Ό μ€μ ν μ μμ΅λλ€.
- νλ‘μ νΈ λλ ν°λ¦¬ λ§λ€κΈ°: νλ‘μ νΈμ μ λλ ν°λ¦¬λ₯Ό λ§λ€κ³ ν°λ―Έλμμ ν΄λΉ λλ ν°λ¦¬λ‘ μ΄λν©λλ€.
- Node.js νλ‘μ νΈ μ΄κΈ°ν:
npm init -yλ₯Ό μ€ννμ¬package.jsonνμΌμ λ§λλλ€. - TypeScript μ€μΉ:
npm install --save-dev typescript @types/nodeλ₯Ό μ€ννμ¬ TypeScript λ° Node.js νμ μ μλ₯Ό μ€μΉν©λλ€.@types/nodeν¨ν€μ§λ Node.js κΈ°λ³Έ μ 곡 λͺ¨λμ λν νμ μ μλ₯Ό μ 곡νμ¬ TypeScriptκ° Node.js μ½λλ₯Ό μ΄ν΄νκ³ μ ν¨μ±μ κ²μ¬ν μ μλλ‘ ν©λλ€. - TypeScript κ΅¬μ± νμΌ λ§λ€κΈ°:
npx tsc --initλ₯Ό μ€ννμ¬tsconfig.jsonνμΌμ λ§λλλ€. μ΄ νμΌμ TypeScript μ»΄νμΌλ¬λ₯Ό ꡬμ±νκ³ μ»΄νμΌ μ΅μ μ μ§μ ν©λλ€. - tsconfig.json ꡬμ±:
tsconfig.jsonνμΌμ μ΄κ³ νλ‘μ νΈ μꡬ μ¬νμ λ°λΌ ꡬμ±ν©λλ€. λͺ κ°μ§ μΌλ°μ μΈ μ΅μ μ λ€μκ³Ό κ°μ΅λλ€. target: ECMAScript λμ λ²μ (μ: "es2020", "esnext")μ μ§μ ν©λλ€.module: μ¬μ©ν λͺ¨λ μμ€ν (μ: "commonjs", "esnext")μ μ§μ ν©λλ€.outDir: μ»΄νμΌλ JavaScript νμΌμ μΆλ ₯ λλ ν°λ¦¬λ₯Ό μ§μ ν©λλ€.rootDir: TypeScript μμ€ νμΌμ λ£¨νΈ λλ ν°λ¦¬λ₯Ό μ§μ ν©λλ€.sourceMap: λ μ¬μ΄ λλ²κΉ μ μν΄ μμ€ λ§΅ μμ±μ νμ±νν©λλ€.strict: μ격ν νμ κ²μ¬λ₯Ό νμ±νν©λλ€.esModuleInterop: CommonJSμ ES λͺ¨λ κ°μ μνΈ μ΄μ©μ±μ νμ±νν©λλ€.
μν tsconfig.json νμΌμ λ€μκ³Ό κ°μ΅λλ€.
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"sourceMap": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": [
"src/**/*"
]
}
μ΄ κ΅¬μ±μ TypeScript μ»΄νμΌλ¬μκ² src λλ ν°λ¦¬μ λͺ¨λ .ts νμΌμ μ»΄νμΌνκ³ μ»΄νμΌλ JavaScript νμΌμ dist λλ ν°λ¦¬μ μΆλ ₯νκ³ λλ²κΉ
μ μν΄ μμ€ λ§΅μ μμ±νλλ‘ μ§μν©λλ€.
κΈ°λ³Έ νμ μ£Όμ λ° μΈν°νμ΄μ€
TypeScriptλ λ³μ, ν¨μ λ§€κ°λ³μ λ° λ°ν κ°μ νμ μ λͺ μμ μΌλ‘ μ§μ ν μ μλ νμ μ£Όμμ λμ ν©λλ€. μ΄λ κ² νλ©΄ TypeScript μ»΄νμΌλ¬κ° νμ κ²μ¬λ₯Ό μννκ³ μ€λ₯λ₯Ό μ‘°κΈ°μ ν¬μ°©ν μ μμ΅λλ€.
κΈ°λ³Έ νμ
TypeScriptλ λ€μκ³Ό κ°μ κΈ°λ³Έ νμ μ μ§μν©λλ€.
string: ν μ€νΈ κ°μ λνλ λλ€.number: μ«μ κ°μ λνλ λλ€.boolean: λΆμΈ κ°(trueλλfalse)μ λνλ λλ€.null: κ°μ μλμ μΈ λΆμ¬λ₯Ό λνλ λλ€.undefined: κ°μ΄ ν λΉλμ§ μμ λ³μλ₯Ό λνλ λλ€.symbol: κ³ μ νκ³ λ³κ²½ν μ μλ κ°μ λνλ λλ€.bigint: μμ μ λ°λμ μ μλ₯Ό λνλ λλ€.any: λͺ¨λ νμ μ κ°μ λνλ λλ€(λλ¬Όκ² μ¬μ©).unknown: νμ μ΄ μλ €μ§μ§ μμ κ°μ λνλ λλ€(anyλ³΄λ€ μμ ν¨).void: ν¨μμμ λ°ν κ°μ΄ μμμ λνλ λλ€.never: κ²°μ½ λ°μνμ§ μλ κ°(μ: νμ μ€λ₯λ₯Ό λ°μμν€λ ν¨μ)μ λνλ λλ€.array: λμΌν νμ μ κ°μ μμ μλ 컬λ μ (μ:string[],number[])μ λνλ λλ€.tuple: νΉμ νμ μ κ°μ μμ μλ 컬λ μ (μ:[string, number])μ λνλ λλ€.enum: λͺ λͺ λ μμμ μ§ν©μ λνλ λλ€.object: λΉμμ νμ μ λνλ λλ€.
λ€μμ νμ μ£Όμμ λͺ κ°μ§ μμ λλ€.
let name: string = "John Doe";
let age: number = 30;
let isStudent: boolean = false;
function greet(name: string): string {
return `Hello, ${name}!`;
}
let numbers: number[] = [1, 2, 3, 4, 5];
let person: { name: string; age: number } = {
name: "Jane Doe",
age: 25,
};
μΈν°νμ΄μ€
μΈν°νμ΄μ€λ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€. κ°μ²΄κ° κ°μ ΈμΌ νλ μμ± λ° λ©μλλ₯Ό μ§μ ν©λλ€. μΈν°νμ΄μ€λ νμ μμ μ±μ μ μ©νκ³ μ½λ μ μ§ κ΄λ¦¬μ±μ κ°μ νλ κ°λ ₯ν λ°©λ²μ λλ€.
λ€μμ μΈν°νμ΄μ€μ μμ λλ€.
interface User {
id: number;
name: string;
email: string;
isActive: boolean;
}
function getUser(id: number): User {
// ... λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©μ λ°μ΄ν° κ°μ Έμ€κΈ°
return {
id: 1,
name: "John Doe",
email: "john.doe@example.com",
isActive: true,
};
}
let user: User = getUser(1);
console.log(user.name); // John Doe
μ΄ μμμ User μΈν°νμ΄μ€λ μ¬μ©μ κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€. getUser ν¨μλ User μΈν°νμ΄μ€λ₯Ό μ€μνλ κ°μ²΄λ₯Ό λ°νν©λλ€. ν¨μκ° μΈν°νμ΄μ€μ μΌμΉνμ§ μλ κ°μ²΄λ₯Ό λ°ννλ©΄ TypeScript μ»΄νμΌλ¬κ° μ€λ₯λ₯Ό λ°μμν΅λλ€.
νμ λ³μΉ
νμ λ³μΉμ νμ μ λν μ μ΄λ¦μ λ§λλλ€. μ νμ μ λ§λ€μ§ μκ³ κΈ°μ‘΄ νμ μ λ μ€λͺ μ μ΄κ±°λ νΈλ¦¬ν μ΄λ¦μ μ§μ ν©λλ€.
type StringOrNumber = string | number;
let value: StringOrNumber = "hello";
value = 123;
//볡μ‘ν κ°μ²΄μ λν νμ
λ³μΉ
type Point = {
x: number;
y: number;
};
const myPoint: Point = { x: 10, y: 20 };
TypeScript λ° Node.jsλ₯Ό μ¬μ©νμ¬ κ°λ¨ν API ꡬμΆ
TypeScript, Node.js λ° Express.jsλ₯Ό μ¬μ©νμ¬ κ°λ¨ν REST APIλ₯Ό ꡬμΆν΄ λ³΄κ² μ΅λλ€.
- Express.js λ° ν΄λΉ νμ
μ μ μ€μΉ:
npm install express @types/expressμ€ν - λ€μ μ½λλ₯Ό μ¬μ©νμ¬
src/index.tsλΌλ νμΌμ λ§λλλ€.
import express, { Request, Response } from 'express';
const app = express();
const port = process.env.PORT || 3000;
interface Product {
id: number;
name: string;
price: number;
}
const products: Product[] = [
{ id: 1, name: 'Laptop', price: 1200 },
{ id: 2, name: 'Keyboard', price: 75 },
{ id: 3, name: 'Mouse', price: 25 },
];
app.get('/products', (req: Request, res: Response) => {
res.json(products);
});
app.get('/products/:id', (req: Request, res: Response) => {
const productId = parseInt(req.params.id);
const product = products.find(p => p.id === productId);
if (product) {
res.json(product);
} else {
res.status(404).json({ message: 'Product not found' });
}
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
μ΄ μ½λλ λ κ°μ μλν¬μΈνΈκ° μλ κ°λ¨ν Express.js APIλ₯Ό λ§λλλ€.
/products: μ ν λͺ©λ‘μ λ°νν©λλ€./products/:id: IDλ³λ‘ νΉμ μ νμ λ°νν©λλ€.
Product μΈν°νμ΄μ€λ μ ν κ°μ²΄μ ꡬ쑰λ₯Ό μ μν©λλ€. products λ°°μ΄μλ Product μΈν°νμ΄μ€λ₯Ό μ€μνλ μ ν κ°μ²΄ λͺ©λ‘μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
APIλ₯Ό μ€ννλ €λ©΄ TypeScript μ½λλ₯Ό μ»΄νμΌνκ³ Node.js μλ²λ₯Ό μμν΄μΌ ν©λλ€.
- TypeScript μ½λ μ»΄νμΌ:
npm run tscλ₯Ό μ€νν©λλ€(package.jsonμ μ΄ μ€ν¬λ¦½νΈλ₯Ό"tsc": "tsc"λ‘ μ μν΄μΌ ν μ μμ). - Node.js μλ² μμ:
node dist/index.jsλ₯Ό μ€νν©λλ€.
κ·Έλ° λ€μ λΈλΌμ°μ μμ λλ curlκ³Ό κ°μ λꡬλ₯Ό μ¬μ©νμ¬ API μλν¬μΈνΈμ μ‘μΈμ€ν μ μμ΅λλ€.
curl http://localhost:3000/products
curl http://localhost:3000/products/1
μλ² μΈ‘ κ°λ°μ μν κ³ κΈ TypeScript κΈ°μ
TypeScriptλ μλ² μΈ‘ κ°λ°μμ νμ μμ μ± λ° μ½λ νμ§μ λμ± ν₯μμν¬ μ μλ μ¬λ¬ κ³ κΈ κΈ°λ₯μ μ 곡ν©λλ€.
μ λ€λ¦
μ λ€λ¦μ μ¬μ©νλ©΄ νμ μμ μ±μ ν¬μνμ§ μκ³ λ λ€μν νμ μΌλ‘ μμ ν μ μλ μ½λλ₯Ό μμ±ν μ μμ΅λλ€. νμ μ λ§€κ°λ³μννμ¬ μ½λλ₯Ό λ μ¬μ¬μ© κ°λ₯νκ³ μ μ°νκ² λ§λλ λ°©λ²μ μ 곡ν©λλ€.
λ€μμ μ λ€λ¦ ν¨μμ μμ λλ€.
function identity<T>(arg: T): T {
return arg;
}
let myString: string = identity<string>("hello");
let myNumber: number = identity<number>(123);
μ΄ μμμ identity ν¨μλ T νμ
μ μΈμλ₯Ό μ¬μ©νκ³ λμΌν νμ
μ κ°μ λ°νν©λλ€. <T> ꡬ문μ Tκ° νμ
λ§€κ°λ³μμμ λνλ
λλ€. ν¨μλ₯Ό νΈμΆν λ Tμ νμ
μ λͺ
μμ μΌλ‘ μ§μ νκ±°λ(μ: identity<string>) TypeScriptκ° μΈμμμ μΆλ‘ νλλ‘ ν μ μμ΅λλ€(μ: identity("hello")).
νλ³λ μ λμ¨
νκ·Έλ μ λμ¨μ΄λΌκ³ λ νλ νλ³λ μ λμ¨μ μ¬λ¬ λ€λ₯Έ νμ μ€ νλμΌ μ μλ κ°μ λνλ΄λ κ°λ ₯ν λ°©λ²μ λλ€. μν λ¨Έμ μ λͺ¨λΈλ§νκ±°λ λ€μν μ’ λ₯μ μ€λ₯λ₯Ό λνλ΄λ λ° μμ£Ό μ¬μ©λ©λλ€.
λ€μμ νλ³λ μ λμ¨μ μμ λλ€.
type Success = {
status: 'success';
data: any;
};
type Error = {
status: 'error';
message: string;
};
type Result = Success | Error;
function handleResult(result: Result) {
if (result.status === 'success') {
console.log('μ±κ³΅:', result.data);
} else {
console.error('μ€λ₯:', result.message);
}
}
const successResult: Success = { status: 'success', data: { name: 'John Doe' } };
const errorResult: Error = { status: 'error', message: 'λ¬Έμ κ° λ°μνμ΅λλ€' };
handleResult(successResult);
handleResult(errorResult);
μ΄ μμμ Result νμ
μ Success λ° Error νμ
μ νλ³λ μ λμ¨μ
λλ€. status μμ±μ κ°μ΄ μ΄λ€ νμ
μΈμ§ λνλ΄λ νλ³μμ
λλ€. handleResult ν¨μλ νλ³μλ₯Ό μ¬μ©νμ¬ κ°μ μ²λ¦¬νλ λ°©λ²μ κ²°μ ν©λλ€.
μ νΈλ¦¬ν° νμ
TypeScriptλ νμ μ μ‘°μνκ³ λ κ°κ²°νκ³ ννλ ₯μ΄ νλΆν μ½λλ₯Ό λ§λλ λ° λμμ΄ λλ μ¬λ¬ κΈ°λ³Έ μ 곡 μ νΈλ¦¬ν° νμ μ μ 곡ν©λλ€. μΌλ°μ μΌλ‘ μ¬μ©λλ μ νΈλ¦¬ν° νμ μ λ€μκ³Ό κ°μ΅λλ€.
Partial<T>:Tμ λͺ¨λ μμ±μ μ ν μ¬νμΌλ‘ λ§λλλ€.Required<T>:Tμ λͺ¨λ μμ±μ νμ μ¬νμΌλ‘ λ§λλλ€.Readonly<T>:Tμ λͺ¨λ μμ±μ μ½κΈ° μ μ©μΌλ‘ λ§λλλ€.Pick<T, K>: ν€κ°Kμ μλTμ μμ±λ§ μλ μ νμ μ λ§λλλ€.Omit<T, K>: ν€κ°Kμ μλ μμ±μ μ μΈνTμ λͺ¨λ μμ±μ΄ μλ μ νμ μ λ§λλλ€.Record<K, T>:Kνμ μ ν€μTνμ μ κ°μ΄ μλ μ νμ μ λ§λλλ€.Exclude<T, U>:Uμ ν λΉν μ μλ λͺ¨λ νμ μTμμ μ μΈν©λλ€.Extract<T, U>:Uμ ν λΉν μ μλ λͺ¨λ νμ μTμμ μΆμΆν©λλ€.NonNullable<T>:Tμμnullλ°undefinedλ₯Ό μ μΈν©λλ€.Parameters<T>: ννμμ ν¨μ νμTμ λ§€κ°λ³μλ₯Ό κ°μ Έμ΅λλ€.ReturnType<T>: ν¨μ νμTμ λ°ν νμ μ κ°μ Έμ΅λλ€.InstanceType<T>: μμ±μ ν¨μ νμTμ μΈμ€ν΄μ€ νμ μ κ°μ Έμ΅λλ€.
λ€μμ μ νΈλ¦¬ν° νμ μ μ¬μ©νλ λ°©λ²μ λͺ κ°μ§ μμ λλ€.
interface User {
id: number;
name: string;
email: string;
}
// Userμ λͺ¨λ μμ±μ μ ν μ¬νμΌλ‘ λ§λλλ€.
type PartialUser = Partial<User>;
// Userμ μ΄λ¦ λ° μ΄λ©μΌ μμ±λ§ μλ νμ
μ λ§λλλ€.
type UserInfo = Pick<User, 'name' | 'email'>;
// idλ₯Ό μ μΈν Userμ λͺ¨λ μμ±μ΄ μλ νμ
μ λ§λλλ€.
type UserWithoutId = Omit<User, 'id'>;
TypeScript Node.js μ ν리μΌμ΄μ ν μ€ν
ν μ€ν μ κ°λ ₯νκ³ μμ μ μΈ μλ² μΈ‘ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μΈ λΆλΆμ λλ€. TypeScriptλ₯Ό μ¬μ©ν λ νμ μμ€ν μ νμ©νμ¬ λ³΄λ€ ν¨κ³Όμ μ΄κ³ μ μ§ κ΄λ¦¬ κ°λ₯ν ν μ€νΈλ₯Ό μμ±ν μ μμ΅λλ€.
Node.jsμ λν μΈκΈ° μλ ν μ€ν νλ μμν¬μλ Jest λ° Mochaκ° μμ΅λλ€. μ΄λ¬ν νλ μμν¬λ λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈ λ° μλ ν¬ μλ ν μ€νΈλ₯Ό μμ±νκΈ° μν λ€μν κΈ°λ₯μ μ 곡ν©λλ€.
λ€μμ Jestλ₯Ό μ¬μ©ν λ¨μ ν μ€νΈμ μμ λλ€.
// src/utils.ts
export function add(a: number, b: number): number {
return a + b;
}
// test/utils.test.ts
import { add } from '../src/utils';
describe('add', () => {
it('λ μ«μμ ν©μ λ°νν΄μΌ ν©λλ€.', () => {
expect(add(1, 2)).toBe(3);
});
it('μμλ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€.', () => {
expect(add(-1, 2)).toBe(1);
});
});
μ΄ μμμ add ν¨μλ Jestλ₯Ό μ¬μ©νμ¬ ν
μ€νΈλ©λλ€. describe λΈλ‘μ κ΄λ ¨λ ν
μ€νΈλ₯Ό ν¨κ» κ·Έλ£Ήνν©λλ€. it λΈλ‘μ κ°λ³ ν
μ€νΈ μ¬λ‘λ₯Ό μ μν©λλ€. expect ν¨μλ μ½λ λμμ λν μ΄μ€μ
μ μννλ λ° μ¬μ©λ©λλ€.
TypeScript μ½λμ λν ν μ€νΈλ₯Ό μμ±ν λ ν μ€νΈκ° κ°λ₯ν λͺ¨λ νμ μλ리μ€λ₯Ό λ€λ£¨λλ‘ νλ κ²μ΄ μ€μν©λλ€. μ¬κΈ°μλ λ€μν νμ μ μ λ ₯μ μ¬μ©νμ¬ ν μ€νΈνκ³ , null λ° μ μλμ§ μμ κ°μ μ¬μ©νμ¬ ν μ€νΈνκ³ , μλͺ»λ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ ν μ€νΈνλ κ²μ΄ ν¬ν¨λ©λλ€.
TypeScript Node.js κ°λ°μ μν λͺ¨λ² μ¬λ‘
TypeScript Node.js νλ‘μ νΈκ° μ ꡬμ±λκ³ μ μ§ κ΄λ¦¬ κ°λ₯νλ©° νμ₯ κ°λ₯νλλ‘ νλ €λ©΄ λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ κ²μ΄ μ€μν©λλ€.
- μ격 λͺ¨λ μ¬μ©:
tsconfig.jsonνμΌμμ μ격 λͺ¨λλ₯Ό νμ±ννμ¬ λ μ격ν νμ κ²μ¬λ₯Ό μ μ©νκ³ μ μ¬μ μΈ μ€λ₯λ₯Ό μ‘°κΈ°μ ν¬μ°©ν©λλ€. - λͺ νν μΈν°νμ΄μ€ λ° νμ μ μ: μΈν°νμ΄μ€ λ° νμ μ μ¬μ©νμ¬ λ°μ΄ν° ꡬ쑰λ₯Ό μ μνκ³ μ ν리μΌμ΄μ μ 체μμ νμ μμ μ±μ 보μ₯ν©λλ€.
- μ λ€λ¦ μ¬μ©: νμ μμ μ±μ ν¬μνμ§ μκ³ λ€μν νμ μΌλ‘ μμ ν μ μλ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±νλ €λ©΄ μ λ€λ¦μ μ¬μ©ν©λλ€.
- νλ³λ μ λμ¨ μ¬μ©: μ¬λ¬ λ€λ₯Έ νμ μ€ νλμΌ μ μλ κ°μ λνλ΄λ €λ©΄ νλ³λ μ λμ¨μ μ¬μ©ν©λλ€.
- ν¬κ΄μ μΈ ν μ€νΈ μμ±: λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈ λ° μλ ν¬ μλ ν μ€νΈλ₯Ό μμ±νμ¬ μ½λκ° μ¬λ°λ₯΄κ² μλνκ³ μ ν리μΌμ΄μ μ΄ μμ μ μΈμ§ νμΈν©λλ€.
- μΌκ΄λ μ½λ© μ€νμΌ λ°λ₯΄κΈ°: Prettierμ κ°μ μ½λ ν¬λ§·ν°μ ESLintμ κ°μ λ¦°ν°λ₯Ό μ¬μ©νμ¬ μΌκ΄λ μ½λ© μ€νμΌμ μ μ©νκ³ μ μ¬μ μΈ μ€λ₯λ₯Ό ν¬μ°©ν©λλ€. μ΄λ μΌκ΄λ μ½λλ² μ΄μ€λ₯Ό μ μ§νκΈ° μν΄ νκ³Ό νλ ₯ν λ νΉν μ€μν©λλ€. ESLint λ° Prettierμ λν λ§μ κ΅¬μ± μ΅μ μ ν μ 체μμ 곡μ ν μ μμ΅λλ€.
- μ’ μμ± μ£Όμ μ¬μ©: μ’ μμ± μ£Όμ μ μ½λλ₯Ό λΆλ¦¬νκ³ ν μ€νΈ κ°λ₯μ±μ λμ΄λ μ€κ³ ν¨ν΄μ λλ€. InversifyJSμ κ°μ λꡬλ₯Ό μ¬μ©νλ©΄ TypeScript Node.js νλ‘μ νΈμμ μ’ μμ± μ£Όμ μ ꡬννλ λ° λμμ΄ λ©λλ€.
- μ μ ν μ€λ₯ μ²λ¦¬ ꡬν: μμΈλ₯Ό μ μμ μΌλ‘ ν¬μ°©νκ³ μ²λ¦¬νκΈ° μν΄ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬνν©λλ€. try-catch λΈλ‘ λ° μ€λ₯ λ‘κΉ μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ΄ μΆ©λνλ κ²μ λ°©μ§νκ³ μ μ©ν λλ²κΉ μ 보λ₯Ό μ 곡ν©λλ€.
- λͺ¨λ λ²λ€λ¬ μ¬μ©: Webpack λλ Parcelκ³Ό κ°μ λͺ¨λ λ²λ€λ¬λ₯Ό μ¬μ©νμ¬ μ½λλ₯Ό λ²λ€λ§νκ³ νλ‘λμ μ μ΅μ νν©λλ€. νλ°νΈμλ κ°λ°κ³Ό κ΄λ ¨λ κ²½μ°κ° λ§μ§λ§ λͺ¨λ λ²λ€λ¬λ νΉν ES λͺ¨λλ‘ μμ ν λ Node.js νλ‘μ νΈμλ μ μ©ν μ μμ΅λλ€.
- νλ μμν¬ μ¬μ© κ³ λ €: TypeScriptλ₯Ό μ¬μ©νμ¬ νμ₯ κ°λ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν Node.js μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν ꡬ쑰 λ° κ·μΉμ μ 곡νλ NestJS λλ AdonisJSμ κ°μ νλ μμν¬λ₯Ό μ΄ν΄λ΄ λλ€. μ΄λ¬ν νλ μμν¬μλ μ’ μμ± μ£Όμ , λΌμ°ν λ° λ―Έλ€μ¨μ΄ μ§μκ³Ό κ°μ κΈ°λ₯μ΄ ν¬ν¨λλ κ²½μ°κ° λ§μ΅λλ€.
λ°°ν¬ κ³ λ € μ¬ν
TypeScript Node.js μ ν리μΌμ΄μ λ°°ν¬λ νμ€ Node.js μ ν리μΌμ΄μ λ°°ν¬μ μ μ¬ν©λλ€. κ·Έλ¬λ λͺ κ°μ§ μΆκ° κ³ λ € μ¬νμ΄ μμ΅λλ€.
- μ»΄νμΌ: λ°°ν¬νκΈ° μ μ TypeScript μ½λλ₯Ό JavaScriptλ‘ μ»΄νμΌν΄μΌ ν©λλ€. μ΄λ λΉλ νλ‘μΈμ€μ μΌλΆλ‘ μνν μ μμ΅λλ€.
- μμ€ λ§΅: νλ‘λμ νκ²½μμ λλ²κΉ μ λ μ½κ² λ§λ€λ €λ©΄ λ°°ν¬ ν¨ν€μ§μ μμ€ λ§΅μ ν¬ν¨νλ κ²μ κ³ λ €νμμμ€.
- νκ²½ λ³μ: νκ²½ λ³μλ₯Ό μ¬μ©νμ¬ λ€μν νκ²½(μ: κ°λ°, μ€ν μ΄μ§, νλ‘λμ )μ λ§κ² μ ν리μΌμ΄μ μ ꡬμ±ν©λλ€. μ΄λ νμ€ μ¬λ‘μ΄μ§λ§ μ»΄νμΌλ μ½λλ₯Ό μ²λ¦¬ν λ ν¨μ¬ λ μ€μν΄μ§λλ€.
Node.jsμ λν μΈκΈ° μλ λ°°ν¬ νλ«νΌμ λ€μκ³Ό κ°μ΅λλ€.
- AWS(Amazon Web Services): EC2, Elastic Beanstalk λ° Lambdaλ₯Ό ν¬ν¨νμ¬ Node.js μ ν리μΌμ΄μ μ λ°°ν¬νκΈ° μν λ€μν μλΉμ€λ₯Ό μ 곡ν©λλ€.
- GCP(Google Cloud Platform): Compute Engine, App Engine λ° Cloud Functionsλ₯Ό ν¬ν¨νμ¬ AWSμ μ μ¬ν μλΉμ€λ₯Ό μ 곡ν©λλ€.
- Microsoft Azure: Node.js μ ν리μΌμ΄μ μ λ°°ν¬νκΈ° μν Virtual Machines, App Service λ° Azure Functionsμ κ°μ μλΉμ€λ₯Ό μ 곡ν©λλ€.
- Heroku: Node.js μ ν리μΌμ΄μ μ λ°°ν¬ λ° κ΄λ¦¬λ₯Ό κ°μννλ PaaS(Platform-as-a-Service)μ λλ€.
- DigitalOcean: Node.js μ ν리μΌμ΄μ μ λ°°ν¬νλ λ° μ¬μ©ν μ μλ VPS(Virtual Private Server)λ₯Ό μ 곡ν©λλ€.
- Docker: μ ν리μΌμ΄μ κ³Ό ν΄λΉ μ’ μμ±μ λ¨μΌ 컨ν μ΄λλ‘ ν¨ν€μ§ν μ μλ 컨ν μ΄λν κΈ°μ μ λλ€. μ΄λ κ² νλ©΄ Dockerλ₯Ό μ§μνλ λͺ¨λ νκ²½μ μ ν리μΌμ΄μ μ μ½κ² λ°°ν¬ν μ μμ΅λλ€.
κ²°λ‘
TypeScriptλ Node.jsλ₯Ό μ¬μ©νμ¬ κ°λ ₯νκ³ νμ₯ κ°λ₯ν μλ² μΈ‘ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μμ΄ κΈ°μ‘΄ JavaScriptλ³΄λ€ ν¬κ² κ°μ λ κΈ°λ₯μ μ 곡ν©λλ€. νμ μμ μ±, ν₯μλ IDE μ§μ λ° κ³ κΈ μΈμ΄ κΈ°λ₯μ νμ©νμ¬ λ μ μ§ κ΄λ¦¬ κ°λ₯νκ³ μμ μ μ΄λ©° ν¨μ¨μ μΈ λ°±μλ μμ€ν μ λ§λ€ μ μμ΅λλ€. TypeScriptλ₯Ό μ±ννλ λ°μλ νμ΅ κ³‘μ μ΄ μμ§λ§ μ½λ νμ§ λ° κ°λ°μ μμ°μ± μΈ‘λ©΄μμ μ₯κΈ°μ μΈ μ΄μ μ κ°μΉ μλ ν¬μμ λλ€. μ ꡬμ±λκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ μ λν μμκ° κ³μ μ¦κ°ν¨μ λ°λΌ TypeScriptλ μ μΈκ³ μλ² μΈ‘ κ°λ°μμκ² μ μ λ μ€μν λκ΅¬κ° λ κ²μ λλ€.