7/5 TIL (TypeScript ๋ณต์Šต)

Hwiยท2024๋…„ 7์›” 5์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
64/96

๐Ÿ“š ์ง„ํ–‰ํ•œ ๊ณต๋ถ€

  • Next.js Route Handlers
  • TypeScript ๋ณต์Šต

๐Ÿ“— Route Handlers

[๊ณต๋ถ€ ๋ชฉํ‘œ]

  • Next.js๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  React์™€์˜ ์ฐจ์ด์  ์ดํ•ด
  • Next.js์˜ ํŠน์ง•์ธ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์ดํ•ด
  • ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์— ๊ผญ ํ•„์š”ํ•œ ํŠน๋ณ„ํ•œ ํŒŒ์ผ๋“ค ์ดํ•ด
  • ํŽ˜์ด์ง€ ์ด๋™๊ณผ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ดํ•ด

๐Ÿ“– 01. Full Stack์ด๋ž€?


์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์ธ ๋ชจ์Šต์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด์„  ๋ณดํ†ต ์ด๋Ÿฌํ•œ ๋‚ด์šฉ์ด ํ•„์š”ํ•จ

  • FE = FrontEnd
    • ๋ธŒ๋ผ์šฐ์ € ์ƒ(๋˜๋Š” ๋ชจ๋ฐ”์ผ ์•ฑ ๋“ฑ)์— ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์œผ๋กœ, UI ์˜์—ญ
  • BE = BackEnd
    • ์™ธ๋ถ€์˜ ์–ด๋–ค ์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ ํ•ธ๋“ค๋ง ๋“ฑ ์ฃผ์š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜์—ญ
  • DB = DataBase
    • ๋ฐฑ์—”๋“œ์— ์˜ํ•ด ํ•ธ๋“ค๋ง ๋˜๋Š”, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๐Ÿ“– 02. Router Handlers

๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Œ

allow you to create custom request handlers for a given route using the Webย Requestย andย Responseย APIs.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” Web ์š”์ฒญ ๋ฐ ์‘๋‹ต API๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ. HTTP๋ฅผ ๋ฐฐ์šฐ๋ฉฐ ์šฐ๋ฆฐ ์›น ํ™˜๊ฒฝ์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์„œ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๊ณ  ๊ทธ๊ฒƒ์€ ๋Œ€์ฒด๋กœ REST API๋กœ ์„ค๋ช…์ด ๋จ

  • GET / POST / PATCH / PUT / DELETE

์ •๋„๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , Router Handlers์—์„œ ์ด ๋ถ€๋ถ„์„ ๋งŒ๋“ฌ


app directory ๋‚ด๋ถ€์— route.ts ํŒŒ์ผ์„ ๋งŒ๋‚˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Next.js๋Š” router handlers ๋กœ ์ธ์‹ํ•จ


๐Ÿ“— TypeScript ๋ณต์Šต

๐Ÿ“– 01. TypeScript ์“ฐ๋Š” ์ด์œ 

  • JavaScript๋Š” Dynamic Typing ๊ฐ€๋Šฅํ•จ. 5 - '3' ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ์›๋ž˜๋Š” ์ˆซ์ž - ์ˆซ์ž๋งŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ JS๊ฐ€ ์•Œ์•„์„œ ๋ฌธ์ž์—ด 3์„ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์คŒ. ์ฆ‰, ์ฝ”๋“œ๋ฅผ ๊ธธ๊ฒŒ ์งค ๋• ์ž์œ ๋„ & ์œ ์—ฐ์„ฑ์€ ์˜คํžˆ๋ ค ์•ˆ ์ข‹์•„์ง (ํ”„๋กœ์ ํŠธ ์ปค์งˆ ์ˆ˜๋ก ๋‹จ์ ๋ฟ์ž„)
  • TypeScript๋Š” ํƒ€์ž…์„ ์—„๊ฒฉํžˆ ๊ฒ€์‚ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋ฐ”๋กœ์žก๊ธฐ ์‰ฝ๊ณ , ๋˜ํ•œ ์˜คํƒ€๋„ ์žก์•„์คŒ
    ์ฝ”๋“œ ์—๋””ํ„ฐ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์—ญํ• ๋กœ ๋ด๋„ ๋ฌด๋ฐฉํ•จ

  • ์ด๋กœ ์ธํ•ด ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋˜๊ณ  ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋จ


๐Ÿ“– 02. ๊ธฐ๋ณธ ํƒ€์ž… ์„ ์–ธ

  • ๋ฌธ์ž์—ด : let hello: string = "hi"!;
  • ์ˆซ์ž : let num: number = 123;
  • ๋ฐฐ์—ด :
let arr: number[] = [1,2,3];
let arr1: Array<number> = [1,2,3];
let arr2: Array<string> = ["hi", "hihi"];
let arr4: [string, number] = ["hi", 24];
  • ๊ฐ์ฒด :
let hwi: object = { name: "hwi", age: 24 };
let person: { name: string; age: number } = {
  name: "hwi",
  age: 24
};
- ๋ถˆ๋ฆฌ์–ธ : `let trueFalse: boolean = true;`
  • ํŠœํ”Œ : ๋ฐฐ์—ด์˜ ์„œ๋ธŒํƒ€์ž…
    ๋ฌด์กฐ๊ฑด ์ •ํ•ด์ง„ ํƒ€์ž…์„ ์ˆœ์„œ๋Œ€๋กœ ์จ์•ผ ํ•จ
let a: [string, number]; // ํŠœํ”Œ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ

a = ["hi", 5]; // ์„ฑ๊ณต
a = [5, "h1"]; // ์˜ค๋ฅ˜ (์ˆœ์„œ๊ฐ€ ์•ˆ ๋งž์Œ)
a = ["h1", 5, 521]; // ์˜ค๋ฅ˜ (๊ฐœ์ˆ˜๊ฐ€ ์•ˆ ๋งž์Œ)

๐Ÿ“– 03. ํ•จ์ˆ˜ ์„ ์–ธ

TypeScript ํ•จ์ˆ˜๋Š” JavaScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ช… ํ•จ์ˆ˜(named function)๊ณผ ์ต๋ช… ํ•จ์ˆ˜(anonymous function)์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

์ด๋ฅผ ํ†ตํ•ด API์—์„œ ํ•จ์ˆ˜ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋˜์ง€ ์ผํšŒ์„ฑ ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋˜์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

(3)-1. ํ•จ์ˆ˜ ํƒ€์ž… ์„ ์–ธ

TypeScript์—์„  ํŒŒ๋ผ๋ฏธํ„ฐ์™€ return ๊ฐ’์˜ ํƒ€์ž… ์„ ์–ธ ๊ฐ€๋Šฅ

function add(a: number, b: number): number {
	return a + b;
}

(3)-2. ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜ (optional parameter)

optional parametter๋Š” ?๋ฅผ ์•ž์— ๋ถ™์—ฌ์ฃผ๋ฉด ๋จ

function addName(firstName: string, lastName?: string) {
	if (lastName) {
    	return firstName + " " + lastName;
    } else {
    	return firstName;
    }
}

๐Ÿ“– 04. interface

TypeScript๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ’์˜ ํ˜•ํƒœ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์›์น™ ์ค‘ ํ•˜๋‚˜์ž„. ์ด๋ฅผ "๋•ํƒ€์ดํ•‘(duck typing)" ํ˜น์€ "๊ตฌ์กฐ์  ์„œ๋ธŒํƒ€์ดํ•‘(structural subtyping)"์ด๋ผ๊ณ ๋„ ํ•จ.

TypeScript์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋Ÿฐ ํƒ€์ž…๋“ค์˜ ์ด๋ฆ„์„ ์ง“๋Š” ์—ญํ• ์„ ํ•˜๊ณ , ์ฝ”๋“œ ์•ˆ์˜ ๊ณ„์•ฝ์„ ์ •์˜ํ•˜๋Š” ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์˜ ๊ณ„์•ฝ์„ ์ •์˜ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ž„.

์ฆ‰, ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…๋“ค์„ obj ํ˜•ํƒœ์˜ ๋ฌถ์Œ์œผ๋กœ ์ •์˜ํ•ด ์ƒˆ๋กœ์šด ํƒ€์ž…์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ

(4)-1. interface ์„ ์–ธ

interface User {
  	name: string;
  	age: number;
}

(4)-2. ๋ณ€์ˆ˜ ํ™œ์šฉ

const hwi: User = {name: "hwijin", age: 24}

(4)-3. ํ•จ์ˆ˜ ์ธ์ž๋กœ ํ™œ์šฉ

function getUser(user: User) {
	console.log(user);
}

getUser({name: "hwijin", age: 24});

(4)-4. ํ•จ์ˆ˜ ๊ตฌ์กฐ ํ™œ์šฉ

interface Add {
	(a: number, b: number): number;
}

let handleAdd: Add = (a, b) => a + b;

console.log(handleAdd(2,7));

(4)-5. ๋ฐฐ์—ด ํ™œ์šฉ

interface NumberArray {
[index: number]: number;
}

let arr: NumberArray = [2, 5, 7];

(4)-6. interface ํ™•์žฅ

interface Person {
	name: string;
  	age: number;
}

interface Job extends Person {
	job: string;
}

const hwijin: Job = {
	name: "hwijin",
  	age: 24,
  	job: "Developer"
};

๐Ÿ“– 05. Type

ํƒ€์ž… ํ‚ค์›Œ๋“œ๋Š” interface์™€ ๋‹ค๋ฅด๊ฒŒ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณ„์นญ ๋ถ€์—ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ

(5)-1. ํƒ€์ž… ๋ณ„์นญ ์„ ์–ธ

type StringOrBoolean = string | boolean;

const a: StringOrBoolean = "hihi~";
const b: StringOrBoolean = false;

(5)-2. type๊ณผ interface ์ฐจ์ด

ํƒ€์ž… ๋ณ„์นญ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์  โžก๏ธ ํƒ€์ž…์˜ ํ™•์žฅ ๊ฐ€๋Šฅ / ๋ถˆ๊ฐ€๋Šฅ ์—ฌ๋ถ€
์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ™•์žฅ์ด ๊ฐ€๋Šฅ, ํƒ€์ž… ๋ณ„์นญ์€ ๋ถˆ๊ฐ€๋Šฅ. ๋”ฐ๋ผ์„œ interface๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋” ํŽธ๋ฆฌํ•จ


๐Ÿ“– 06. ์—ฐ์‚ฐ์ž (Operator)

(6)-1. ์œ ๋‹ˆ์˜จ ํƒ€์ž… (Union Type)

ํ•œ ๊ฐœ ์ด์ƒ์˜ type์„ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
| ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

function strOrNum (value: string | number) {
	if(typeof value === "string") {
    	return 1
    } else if (typeof value === "number") {
    	return 2
    } else {
    	throw new TypeError("๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž๋งŒ ๊ฐ€๋Šฅ");
    }
}

(6)-2. ๊ต์ฐจ ํƒ€์ž… (Intersection Type)

ํ•ฉ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ๊ฐœ๋…
ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ, ํ•จ์ˆ˜ ์ธ์ž์— ๋ช…์‹œํ•œ type๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•ด์•ผ ํ•จ
& ํ‚ค์›Œ๋“œ

interface Person {
	name: string;
  	age: number;
}

interface Job {
	job: string
  	skill: string;
}

type human = Person & Job;

let aHuman: human = {
	name: "hwijin",
  	age: 24,
  	job: "Developer",
  	skill: "React, TypeScript, NextJS"
};

๐Ÿ“– 07. Class

(6)-1. ์ ‘๊ทผ ์ œํ•œ์ž

ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๊ฐ€ ์ง€์›ํ•˜๋Š” ์ ‘๊ทผ ์ œํ•œ์ž public, private, protected๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์˜๋ฏธ ๋˜ํ•œ ๋™์ผ

(6)-2. Class์—์„œ์˜ ํƒ€์ž… ์„ ์–ธ

class Person {
	private name: string;
  	public age: number;
  	readonly job: string;
  
  constructor(name: string, age: number, job: string) {
  	this.name = name;
    this.age = age;
    this.job = job;
  }
}

๐Ÿ“– 08. Enum

์ด๋ฆ„์ด ์žˆ๋Š” ์ƒ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ. ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„๋ฅผ ๋ฌธ์„œํ™” ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋ถ„๋˜๋Š” ์‚ฌ๋ก€ ์ง‘ํ•ฉ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ. TypeScript๋Š” ์ˆซ์ž์™€ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์—ด๊ฑฐํ˜•์„ ์ œ๊ณต

(8)-1. ์ˆซ์žํ˜• Enum

enum Food {
	Chicken, // 0
  	rice, // 1
  	Pizza // 2
}

const likeFood = Food.Pizza; // 2

(8)-2. ๋ฌธ์ž์˜ Enum

enum Human {
	kim = "๊น€",
 	park = "๋ฐ•"
}

const human = Human.kim; // ๊น€

๐Ÿ“– 09. ์ œ๋„ค๋ฆญ

C#๊ณผ Java ๊ฐ™์€ ์–ธ์–ด์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ์ƒ์ž์˜ ์ฃผ์š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋Š” ์ œ๋„ค๋ฆญ์ž„. ์ฆ‰, ๋‹จ์ผ ํƒ€์ž…์ด ์•„๋‹Œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์—์„œ ์ž‘๋™ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜๋ฉด ๊ฐ™์€ ๊ธฐ๋Šฅ์˜ ํ•จ์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ณ  ํƒ€์ž… ์ถ”๋ก ์—์„œ ๊ฐ•์ ์„ ๊ฐ€์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ

(8)-1. ์ œ๋„ค๋ฆญ ์„ ์–ธ
<T>์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์„ ์–ธํ•จ

function numberLog<T>(number: T): T {
	console.log(number);
  	return number;
}

numberLog<number>(1234124)=

(8)-2. interface์— ์ œ๋„ค๋ฆญ ์„ ์–ธ

interface Coffee<T> {
	price: number;
  	caffeine: <T>
}

const americano: Coffee<> 
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์–ด~~~

0๊ฐœ์˜ ๋Œ“๊ธ€