ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ์ •๋ง ํ‡ด์ถœ๋ ๊นŒ?

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ์ •๋ง ํ‡ด์ถœ๋ ๊นŒ?

D
dongAuthor
7 min read

์ข€ ์ง€๋‚œ ์ด์•ผ๊ธฐ์ง€๋งŒ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋œจ๊ฑฐ์šด ๋…ผ์Ÿ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Ruby on Rails์˜ ์ฐฝ์‹œ์ž David Heinemeier Hansson(DHH)์ด hotwired/turbo ํ”„๋กœ์ ํŠธ์—์„œ TypeScript๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์‹œ์ž‘๋œ ์ด ๋…ผ์Ÿ์€ "TypeScript๋Š” ๊ณผ์—ฐ ํ•„์š”ํ•œ๊ฐ€?"๋ผ๋Š” ๊ทผ๋ณธ์ ์ธ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ์žˆ์ฃ .

TypeScript๋Š” 2012๋…„ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ์ถœ์‹œํ•œ ์ดํ›„, JavaScript์— ์ •์  ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋„๊ตฌ๋กœ ์ž๋ฆฌ๋งค๊น€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DHH์˜ ๊ฒฐ์ • ์ดํ›„, Svelte ๋“ฑ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ TypeScript ์ œ๊ฑฐ๋ฅผ ๊ฒ€ํ† ํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜ผ๋ž€์— ๋น ์กŒ์–ด์š”.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” TypeScript๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ์ฐฌ๋ฐ˜ ๋…ผ์Ÿ์„ ๊ท ํ˜•์žˆ๊ฒŒ ์‚ดํŽด๋ณด๊ณ , ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— TypeScript๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ ์ œ์‹œํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

DHH

TypeScript๋ฅผ ๋ฐ˜๋Œ€ํ•˜๋Š” ๋ชฉ์†Œ๋ฆฌ

DHH๊ฐ€ Turbo 8์—์„œ TypeScript๋ฅผ ์ œ๊ฑฐํ•œ ์ด์œ 

DHH๋Š” ์ž์‹ ์˜ ๋ธ”๋กœ๊ทธ ๊ธ€ "Turbo 8 is dropping TypeScript"์—์„œ ์ œ๊ฑฐ ๊ฒฐ์ •์˜ ๋ฐฐ๊ฒฝ์„ ์†”์งํ•˜๊ฒŒ ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์ฃผ์žฅ์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

โ€œTypeScript๋Š” ๋‚ด ๊ฐœ๋ฐœ ๊ฒฝํ—˜์— ๊ธฐ์จ์„ ๋”ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐฉํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ์ปดํŒŒ์ผ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํƒ€์ž… ์ฒด์กฐ(type gymnastics)๋กœ ์ฝ”๋“œ๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ฃ . ์‰ฌ์›Œ์•ผ ํ•  ๊ฒƒ๋“ค์ด ์–ด๋ ค์›Œ์ง€๊ณ , ์–ด๋ ค์šด ๊ฒƒ๋“ค์€ ๊ฒฐ๊ตญ any๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.โ€

DHH๋Š” ES6 ์ดํ›„ JavaScript๊ฐ€ ์ถฉ๋ถ„ํžˆ ์„ฑ์ˆ™ํ•œ ์–ธ์–ด๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํด๋ž˜์Šค ๋ฌธ๋ฒ•๊ณผ ๋‹ค์–‘ํ•œ ๊ฐœ์„ ์‚ฌํ•ญ๋“ค์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ, JavaScript ์ž์ฒด๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์ฆ๊ฑฐ์šด ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”.

์ฝ”๋“œ ์˜ค์—ผ๊ณผ ๋ณต์žก์„ฑ ๋ฌธ์ œ

TypeScript ๋ฐ˜๋Œ€๋ก ์ž๋“ค์ด ๊ฐ€์žฅ ์ž์ฃผ ์–ธ๊ธ‰ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ '์ฝ”๋“œ ์˜ค์—ผโ€™์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ JavaScript ์ฝ”๋“œ๊ฐ€ TypeScript๋กœ ์ž‘์„ฑ๋˜๋ฉด ํƒ€์ž… ์ •์˜๋กœ ์ธํ•ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์š”.

// TypeScript
function processUser(user: User & { permissions: Permission[] }): Promise<ProcessedUser | null> {
  // ๊ตฌํ˜„
}

// JavaScript
function processUser(user) {
  // ๊ตฌํ˜„
}

์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ TypeScript๋Š” ํƒ€์ž… ์ •์˜๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ํ”„๋กœํ† ํƒ€์ž… ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํƒ€์ž… ์ •์˜๊ฐ€ ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์ฃ .

์ปดํŒŒ์ผ ์‹œ๊ฐ„๊ณผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค

TypeScript๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— JavaScript๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ ๊ณผ์ •์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์€ ์ ์  ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ์— ๋ถ€๋‹ด์„ ์ฃผ๊ฒŒ ๋ผ์š”.

DHH๋Š” "JavaScript๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์–ธ์–ด"๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋ฉฐ, ๋„๊ตฌ ์—†์ด ์ž์œ ๋กญ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํฐ ์ถ•๋ณต์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋ฅผ ์ง€์ง€ํ•˜๋Š” ์ด์œ 

์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ

TypeScript์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ž…๋‹ˆ๋‹ค. ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ , ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•ด์ค˜์š”.

interface UserProfile {
  id: string;
  name: string;
  email: string;
  createdAt: Date;
}

function updateUserEmail(profile: UserProfile, newEmail: string): UserProfile {
  return {
    ...profile,
    email: newEmail
  };
}

์œ„ ์ฝ”๋“œ์—์„œ ๋งŒ์•ฝ UserProfile ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, TypeScript๋Š” ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฆ‰์‹œ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ผ์ผ์ด ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์ฃ .

์—๋Ÿฌ ๊ฐ์†Œ์™€ ์•ˆ์ •์„ฑ

JavaScript๋Š” ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์—์š”. ๋ฐ˜๋ฉด TypeScript๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ์žก์•„๋ƒ…๋‹ˆ๋‹ค.

function calculateTotal(price: number, quantity: number): number {
  return price * quantity;
}

calculateTotal("100", 5); // ์ปดํŒŒ์ผ ์—๋Ÿฌ: string์€ number์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์ œ๋กœ์ดˆ๋‹˜์€ "๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ TypeScript๋Š” ์•ˆ์ •์  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•์— ํ•„์ˆ˜์ "์ด๋ผ๊ณ  ๊ฐ•์กฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์ด ์ค‘์š”ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฐ ์‚ฌ์ „ ์—๋Ÿฌ ๋ฐฉ์ง€๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜์ฃ .

ํŒ€ ํ˜‘์—…๊ณผ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜

TypeScript๋Š” IDE์˜ ์ž๋™์™„์„ฑ, ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ, ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ ์ฒดํฌ ๋“ฑ ๋›ฐ์–ด๋‚œ ๊ฐœ๋ฐœ ๋„๊ตฌ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž… ์ •์˜๋Š” ์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ ์—ญํ• ์„ ํ•ด์š”.

/**
 * ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
 */
function validateUser(user: User): ValidationResult {
  // IDE๊ฐ€ User ํƒ€์ž…์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ž๋™์™„์„ฑํ•ด์ค๋‹ˆ๋‹ค
  if (!user.email.includes('@')) {
    return { valid: false, error: 'Invalid email' };
  }
  return { valid: true };
}

์ƒˆ๋กœ์šด ํŒ€์›์ด ํ•ฉ๋ฅ˜ํ–ˆ์„ ๋•Œ, ํƒ€์ž… ์ •์˜๋งŒ ๋ด๋„ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ์˜ ๊ฐ€์น˜

๋Œ€๊ธฐ์—…์ด๋‚˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ TypeScript์˜ ๊ฐ€์น˜๋Š” ๋”์šฑ ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๊ณ , ์ˆ˜๋…„๊ฐ„ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ํ•„์ˆ˜์ ์ด์—์š”.

์‹ค์ œ๋กœ Microsoft, Google, Airbnb ๊ฐ™์€ ๋Œ€๊ธฐ์—…๋“ค์ด TypeScript๋ฅผ ์ ๊ทน์ ์œผ๋กœ ๋„์ž…ํ•œ ์ด์œ ๋„ ๋ฐ”๋กœ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ฐ˜์‘

์—‡๊ฐˆ๋ฆฐ ์˜๊ฒฌ๋“ค

DHH์˜ TypeScript ์ œ๊ฑฐ ๊ฒฐ์ •์€ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋œจ๊ฑฐ์šด ๋…ผ์Ÿ์„ ๋ถˆ๋Ÿฌ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋„ ์˜๊ฒฌ์ด ๊ทน๋ช…ํ•˜๊ฒŒ ๊ฐˆ๋ ธ์–ด์š”.

์ฐฌ์„ฑํ•˜๋Š” ์ž…์žฅ:

  • โ€œ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” TypeScript๊ฐ€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด๋‹คโ€
  • โ€œJavaScript์˜ ์œ ์—ฐ์„ฑ์ด TypeScript์˜ ์—„๊ฒฉํ•จ๋ณด๋‹ค ๋‚ซ๋‹คโ€
  • โ€œ์ปดํŒŒ์ผ ๋‹จ๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ธ๋‹คโ€

๋ฐ˜๋Œ€ํ•˜๋Š” ์ž…์žฅ:

  • โ€œ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ๋Š” TypeScript ์—†์ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹คโ€
  • โ€œํƒ€์ž… ์•ˆ์ •์„ฑ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜๋‹คโ€
  • โ€œ์ดˆ๊ธฐ ๋Ÿฌ๋‹์ปค๋ธŒ๋Š” ์žˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ด๋“์ด๋‹คโ€

Turbo์—์„œ TypeScript ์ œ๊ฑฐ ์ž‘์—…์ด merge ๋˜์—ˆ์„ ๋•Œ ๋ฐ˜์‘์€ ๋Œ€์ฒด๋กœ ๋ถ€์ •์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด ๊ฒฐ์ •์— ์šฐ๋ ค๋ฅผ ํ‘œ๋ช…ํ–ˆ์ฃ .

์กฐ์ฝ”๋”ฉ๋‹˜์˜ ์˜๊ฒฌ

์œ ๋ช… ์œ ํŠœ๋ฒ„ ์กฐ์ฝ”๋”ฉ๋‹˜์€ "Svelte์—์„œ๋„ TypeScript๊ฐ€ ํ‡ด์ถœ๋๋‹ค"๋ฉฐ, ์ƒ์‚ฐ์„ฑ์— ๋ฐฉํ•ด๊ฐ€ ๋œ๋‹ค๋Š” ์ด์œ ๋กœ ๋‚ด๋ฆฐ ๊ฒฐ์ •์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ผ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ TypeScript๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์›€์ง์ž„์ด ๋ณด์ด๊ณ  ์žˆ์–ด์š”.

JSDoc์ด๋ผ๋Š” ๋Œ€์•ˆ

TypeScript์˜ ๋Œ€์•ˆ์œผ๋กœ ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ JSDoc์ž…๋‹ˆ๋‹ค. JSDoc์€ ์ฃผ์„์„ ํ†ตํ•ด ํƒ€์ž… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”.

/**
 * @param {string} name - ์‚ฌ์šฉ์ž ์ด๋ฆ„
 * @param {number} age - ์‚ฌ์šฉ์ž ๋‚˜์ด
 * @returns {Object} ์‚ฌ์šฉ์ž ๊ฐ์ฒด
 */
function createUser(name, age) {
  return { name, age };
}

JSDoc์€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„ ์—†์ด ํƒ€์ž… ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ TypeScript๋งŒํผ์˜ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ฒดํฌ๋‚˜ IDE ์ง€์›์„ ์ œ๊ณตํ•˜์ง€๋Š” ๋ชปํ•ด์š”. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด "JSDoc์„ ์“ธ ๋ฐ”์—์•ผ ๊ทธ๋ƒฅ TypeScript๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๋‚ซ๋‹ค"๋Š” ์˜๊ฒฌ์„ ๋‚ด๋†“๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript์™€ TypeScript์˜ ๋ฏธ๋ž˜

ECMAScript์˜ Type Annotations ์ œ์•ˆ

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ECMAScript TC39 ์œ„์›ํšŒ์—์„œ๋Š” JavaScript์— ์ง์ ‘ ํƒ€์ž… ์ฃผ์„(Type Annotations)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Stage 1 ๋‹จ๊ณ„์— ์žˆ๋Š” ์ด ์ œ์•ˆ์ด ํ†ต๊ณผ๋˜๋ฉด, JavaScript ์ž์ฒด์—์„œ ํƒ€์ž…์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”.

// ๋ฏธ๋ž˜์˜ JavaScript?
function add(a: number, b: number): number {
  return a + b;
}

์ค‘์š”ํ•œ ์ ์€ ์ด ํƒ€์ž… ์ฃผ์„๋“ค์ด ๋Ÿฐํƒ€์ž„์—๋Š” ๋ฌด์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฑฐ์ฃ . ์ด๋ ‡๊ฒŒ ๋˜๋ฉด TypeScript์˜ ์ปดํŒŒ์ผ ๋‹จ๊ณ„ ์—†์ด๋„ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

๊ณต์กด์˜ ๊ฐ€๋Šฅ์„ฑ

Type Annotations ์ œ์•ˆ์ด ํ˜„์‹คํ™”๋˜๋”๋ผ๋„, TypeScript๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€์ง€๋Š” ์•Š์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ๋‹จ์ˆœํžˆ ํƒ€์ž… ์ฃผ์„ ์ด์ƒ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ฑฐ๋“ ์š”:

  • ๊ณ ๊ธ‰ ํƒ€์ž… ์‹œ์Šคํ…œ: ์ œ๋„ค๋ฆญ, ์œ ๋‹ˆ์˜จ ํƒ€์ž…, ์ธํ„ฐ์„น์…˜ ํƒ€์ž… ๋“ฑ
  • ํƒ€์ž… ์ถ”๋ก : ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ํŒŒ์•…
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ: ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ
  • ์—„๊ฒฉํ•œ ํƒ€์ž… ์ฒดํฌ: ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ํ†ตํ•œ ์„ธ๋ฐ€ํ•œ ์ œ์–ด

JavaScript์— Type Annotations๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด, TypeScript๋Š” ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๋กœ ํฌ์ง€์…”๋‹๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ

React, Vue, Angular ๊ฐ™์€ ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ๋ชจ๋‘ TypeScript๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. React ๊ณต์‹ ๋ฌธ์„œ๋„ TypeScript ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์ฃ .

// React with TypeScript
interface ButtonProps {
  onClick: () => void;
  children: React.ReactNode;
  disabled?: boolean;
}

const Button: React.FC<ButtonProps> = ({ onClick, children, disabled = false }) => {
  return (
    <button onClick={onClick} disabled={disabled}>
      {children}
    </button>
  );
};

Next.js, Remix ๊ฐ™์€ ๋ฉ”ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๋„ TypeScript๋ฅผ ์ผ๊ธ‰ ์‹œ๋ฏผ(first-class citizen)์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”.

์ด๋Ÿฐ ํ๋ฆ„์„ ๋ณด๋ฉด, ์ ์–ด๋„ ๋‹น๋ถ„๊ฐ„์€ TypeScript๊ฐ€ ์ฃผ๋ฅ˜ ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ ์ž๋ฆฌ๋ฅผ ์ง€ํ‚ฌ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— TypeScript๊ฐ€ ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•˜๊ธฐ

TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ

๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋œ๋‹ค๋ฉด TypeScript ๋„์ž…์„ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”:

ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์˜ˆ์ƒ๋  ๋•Œ

  • 10๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ์ด ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  • 1๋…„ ์ด์ƒ ์ง€์†์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ํ”„๋กœ์ ํŠธ
  • ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ

ํŒ€ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํ˜‘์—…์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

  • 3๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ž‘์—…
  • ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฐ™์€ ํƒ€์ž…์„ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ
  • ์ƒˆ๋กœ์šด ํŒ€์›์˜ ์˜จ๋ณด๋”ฉ์ด ์žฆ์€ ๊ฒฝ์šฐ

์•ˆ์ •์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

  • ๊ธˆ์œต, ์˜๋ฃŒ ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์„œ๋น„์Šค
  • B2B ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์†”๋ฃจ์…˜
  • ์ˆ˜๋ฐฑ๋งŒ ๋ช…์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค

JavaScript๋กœ๋„ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ

๋ฐ˜๋Œ€๋กœ ๋‹ค์Œ ์ƒํ™ฉ์ด๋ผ๋ฉด JavaScript๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด์š”:

ํ”„๋กœํ† ํƒ€์ž…์ด๋‚˜ ๋น ๋ฅธ ์‹คํ—˜์ด ํ•„์š”ํ•  ๋•Œ

  • MVP(Minimum Viable Product) ๊ฐœ๋ฐœ
  • ํ•ด์ปคํ†ค์ด๋‚˜ ๋‹จ๊ธฐ ํ”„๋กœ์ ํŠธ
  • ์•„์ด๋””์–ด ๊ฒ€์ฆ ๋‹จ๊ณ„

์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ

  • ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ
  • ๊ฐ„๋‹จํ•œ ๋žœ๋”ฉ ํŽ˜์ด์ง€๋‚˜ ๋ธ”๋กœ๊ทธ
  • ํ•™์Šต์šฉ ํ† ์ด ํ”„๋กœ์ ํŠธ

์ด๋ฏธ JSDoc์œผ๋กœ ์ถฉ๋ถ„ํ•œ ํƒ€์ž… ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ™•๋ณดํ•œ ๊ฒฝ์šฐ

  • ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Œ
  • ํŒ€์ด JSDoc ์‚ฌ์šฉ์— ์ต์ˆ™ํ•จ
  • TypeScript ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ์ด ๋ถ€๋‹ด์Šค๋Ÿฌ์›€

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•

๊ผญ 0 ์•„๋‹ˆ๋ฉด 100์˜ ์„ ํƒ์„ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „๋žต๋„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”:

์ ์ง„์  ๋„์ž…

  • ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ๋ถ€ํ„ฐ TypeScript๋กœ ์ž‘์„ฑ
  • ์ค‘์š”ํ•œ ํ•ต์‹ฌ ๋กœ์ง๋ถ€ํ„ฐ ํƒ€์ž… ์ถ”๊ฐ€
  • allowJs ์˜ต์…˜์œผ๋กœ JavaScript์™€ TypeScript ํ˜ผ์šฉ

์„ ํƒ์  ์‚ฌ์šฉ

  • API ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋งŒ TypeScript๋กœ ์ •์˜
  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” JavaScript๋กœ ์œ ์ง€
  • ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ํƒ€์ž… ์ถ”๊ฐ€

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋„๊ตฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค

TypeScript ๋…ผ์Ÿ์˜ ํ•ต์‹ฌ์€ "์˜ณ๊ณ  ๊ทธ๋ฆ„"์ด ์•„๋‹™๋‹ˆ๋‹ค. DHH์ฒ˜๋Ÿผ JavaScript์˜ ๋‹จ์ˆœํ•จ๊ณผ ์ž์œ ๋กœ์›€์„ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ TypeScript์˜ ์•ˆ์ •์„ฑ์„ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธธ ์ˆ˜๋„ ์žˆ์–ด์š”.

์ค‘์š”ํ•œ ๊ฑด ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ, ํŒ€์˜ ์—ญ๋Ÿ‰, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ข…ํ•ฉ์ ์œผ๋กœ ๊ณ ๋ คํ•ด์„œ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ๋งŒ๋Šฅ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ฉฐ, JavaScript๋„ ๊ตฌ์‹œ๋Œ€์˜ ์œ ๋ฌผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

ECMAScript์˜ Type Annotations ์ œ์•ˆ์ด ์ง„ํ–‰๋˜๋ฉด์„œ, ์•ž์œผ๋กœ JavaScript์™€ TypeScript์˜ ๊ฒฝ๊ณ„๋Š” ๋”์šฑ ํ๋ ค์งˆ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์ด ์–ด๋”˜๊ฐ€์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ์ตœ์ ์ ์„ ์ฐพ์œผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋” ๋‚˜์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ˆ๊นŒ์š” :)

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ์ •๋ง ํ‡ด์ถœ๋ ๊นŒ? | devdong