logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Typescript

Typescript Overview

Rawon
2025년 11월 17일
목차
TypeScript 완벽 가이드: 기초부터 환경설정까지
🎯 TypeScript는 왜 탄생했을까?
JavaScript의 고민
TypeScript의 독특한 접근
⚙️ TypeScript는 어떻게 동작할까?
일반적인 프로그래밍 언어의 동작 방식
컴파일 과정의 비밀: AST
TypeScript만의 특별한 컴파일 과정
🛠️ TypeScript 개발 환경 구축하기
1단계: @types/node 설치
2단계: TypeScript 컴파일러 설치
3단계: TSX로 더 편하게 개발하기
⚙️ TypeScript 컴파일러 옵션 설정하기
📂 include - 컴파일 대상 지정
🎯 target - JavaScript 버전 설정
📦 module - 모듈 시스템 설정
📁 outDir - 출력 디렉터리 지정
🔒 strict - 엄격한 타입 검사
🔄 moduleDetection - 자동 모듈 감지
🎓 마무리하며

목차

TypeScript 완벽 가이드: 기초부터 환경설정까지
🎯 TypeScript는 왜 탄생했을까?
JavaScript의 고민
TypeScript의 독특한 접근
⚙️ TypeScript는 어떻게 동작할까?
일반적인 프로그래밍 언어의 동작 방식
컴파일 과정의 비밀: AST
TypeScript만의 특별한 컴파일 과정
🛠️ TypeScript 개발 환경 구축하기
1단계: @types/node 설치
2단계: TypeScript 컴파일러 설치
3단계: TSX로 더 편하게 개발하기
⚙️ TypeScript 컴파일러 옵션 설정하기
📂 include - 컴파일 대상 지정
🎯 target - JavaScript 버전 설정
📦 module - 모듈 시스템 설정
📁 outDir - 출력 디렉터리 지정
🔒 strict - 엄격한 타입 검사
🔄 moduleDetection - 자동 모듈 감지
🎓 마무리하며

이 글은 아래 강의를 바탕으로 정리한 글입니다. 🤗

plain
<https://inf.run/UGoRu>

TypeScript 완벽 가이드: 기초부터 환경설정까지

안녕하세요! 오늘은 프론트엔드 개발의 필수 도구가 된 TypeScript에 대해 알아보겠습니다. JavaScript를 더 안전하고 생산적으로 사용할 수 있게 해주는 TypeScript, 과연 왜 이렇게 많은 개발자들이 열광하는 걸까요? 함께 살펴보시죠! 🚀


🎯 TypeScript는 왜 탄생했을까?

TypeScript는 C#의 아버지로 불리는 마이크로소프트의 개발자 **앤더스 하일스버그(Anders Hejlsberg)**가 만든 오픈소스 프로그래밍 언어입니다. 현재도 전 세계 수많은 개발자들이 이 언어의 발전에 기여하고 있으며, 활발한 커뮤니티를 자랑하고 있습니다.

TypeScript는 완전히 새로운 언어가 아닙니다. JavaScript에 타입 시스템을 추가한 확장판이라고 할 수 있죠. 기존 JavaScript 코드를 더 안전하게 작성할 수 있도록 도와주는 도구입니다.

JavaScript의 고민

JavaScript는 동적 타입 언어로서 큰 장점을 가지고 있습니다. 하나의 변수에 다양한 타입의 값을 자유롭게 넣을 수 있어 매우 유연하죠. 하지만 이런 유연함은 양날의 검입니다.

문제는 실행 전까지 오류를 발견할 수 없다는 점입니다. 잘못된 코드를 작성해도 런타임에만 오류가 나타나기 때문에, 프로젝트 규모가 커질수록 예상치 못한 버그로 인해 서비스가 중단될 위험이 커집니다.

TypeScript의 독특한 접근

정적 타입 시스템(Java, C++ 등)은 안전하지만 모든 변수에 타입을 명시해야 해서 코드량이 많아지고 번거롭습니다. TypeScript는 이 두 가지 문제를 동시에 해결하는 독특한 방법을 제시합니다.

💡 TypeScript는 **점진적 타입 시스템(Gradual Type System)**을 사용합니다. 변수의 초기값을 보고 자동으로 타입을 추론하기 때문에, 안전성을 확보하면서도 개발 편의성을 유지할 수 있습니다.

5af7ce74-5a16-455f-8451-1032361355d7.png

💡 타입 시스템이란?
프로그래밍 언어에서 타입을 어떻게 정의하고, 언제 검사하며, 어떻게 관리할지를 규정한 체계입니다. 크게 두 가지로 나뉩니다.

1. 정적 타입 시스템: 코드 실행 전에 모든 변수의 타입을 미리 결정 (Java, C++)
2. 동적 타입 시스템: 코드 실행 중에 변수의 타입을 유동적으로 결정 (JavaScript, Python)

image.png


⚙️ TypeScript는 어떻게 동작할까?

일반적인 프로그래밍 언어의 동작 방식

대부분의 프로그래밍 언어는 다음과 같은 과정을 거쳐 실행됩니다.

  1. 개발자가 코드 작성
  2. 컴파일러가 코드를 기계어(바이트 코드)로 변환
  3. 컴퓨터가 변환된 코드를 실행

image.png

컴파일 과정의 비밀: AST

컴파일러는 코드를 바로 기계어로 변환하지 않습니다. 그 전에 **AST(Abstract Syntax Tree, 추상 문법 트리)**라는 중간 형태로 변환합니다.

📌 AST란?
코드에서 공백, 주석, 탭 같은 실행과 무관한 요소들을 제거하고, 코드를 트리 형태의 자료구조로 분해하여 저장한 것입니다. 컴파일러가 코드를 이해하기 쉬운 형태로 만든 것이죠.

image.png

TypeScript만의 특별한 컴파일 과정

TypeScript는 일반 언어와 조금 다른 방식으로 동작합니다.

  1. TypeScript 코드 → AST 변환
  2. 타입 검사 수행 ⭐ (TypeScript만의 특별한 단계!)
  3. AST → JavaScript 코드 변환
  4. JavaScript 코드가 Node.js나 브라우저에서 실행

⚠️ 중요한 포인트: TypeScript의 타입 코드는 컴파일 후 모두 사라집니다! 타입 검사는 오직 개발 단계에서만 수행되며, 최종 JavaScript 코드에는 타입 정보가 포함되지 않습니다.

이런 방식 덕분에 TypeScript로 작성한 코드는 타입 검사를 통과한 안전한 JavaScript 코드가 됩니다. 런타임 전에 미리 오류를 잡아내어 더 안정적인 프로그램을 만들 수 있는 것이죠.

image.png


🛠️ TypeScript 개발 환경 구축하기

이제 실제로 TypeScript를 사용하기 위한 환경을 설정해봅시다!

1단계: @types/node 설치

먼저 Node.js의 내장 기능(console, fs 등)에 대한 타입 정보를 제공하는 패키지를 설치해야 합니다.

bash
npm install --save-dev @types/node

⭐ 왜 필요할까요? TypeScript는 코드 실행 전에 타입 검사를 수행합니다. 만약 console.log처럼 Node.js가 제공하는 기능의 타입이 정의되지 않으면, TypeScript 컴파일러가 "이게 뭔지 모르겠어요!"라며 오류를 발생시킵니다. @types/node는 이런 내장 기능들의 타입 정보를 제공해줍니다.

2단계: TypeScript 컴파일러 설치

TypeScript 컴파일러(TSC)는 npm의 typescript 패키지에 포함되어 있습니다.

bash
sudo npm install -g typescript

설치 후에는 다음과 같이 사용할 수 있습니다.

bash
# TypeScript 파일 컴파일
tsc index.ts

# 생성된 JavaScript 파일 실행
node index.js

3단계: TSX로 더 편하게 개발하기

매번 컴파일하고 실행하는 것은 번거롭습니다. **TSX(TypeScript Execute)**를 사용하면 한 번에 실행할 수 있습니다!

bash
# TSX 설치
sudo npm install -g tsx

# TypeScript 파일 바로 실행
tsx src/index.ts

TSX를 사용하면 JavaScript 파일을 생성하지 않고도 TypeScript 코드를 바로 실행할 수 있어 개발이 훨씬 편리해집니다. 🚀


⚙️ TypeScript 컴파일러 옵션 설정하기

TypeScript의 진정한 힘은 컴파일러 옵션을 통해 프로젝트에 맞게 세밀하게 조정할 수 있다는 점입니다. tsconfig.json 파일에서 다양한 옵션을 설정할 수 있습니다.

📂 include - 컴파일 대상 지정

TypeScript 컴파일러에게 어떤 파일을 컴파일할지 알려줍니다.

json
{
  "include": ["src"]
}

이 설정은 "src 폴더 안의 모든 TypeScript 파일을 컴파일해줘"라는 의미입니다.

🎯 target - JavaScript 버전 설정

컴파일 결과로 생성될 JavaScript 코드의 버전을 지정합니다.

json
{
  "compilerOptions": {
    "target": "ESNext"
  },
  "include": ["src"]
}

ESNext는 최신 JavaScript 문법을 사용한다는 의미입니다. 구형 브라우저 지원이 필요하다면 ES5나 ES6로 설정할 수 있습니다.

📦 module - 모듈 시스템 설정

생성될 JavaScript 코드가 사용할 모듈 시스템을 결정합니다.

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext"
  },
  "include": ["src"]
}

📁 outDir - 출력 디렉터리 지정

컴파일된 JavaScript 파일이 저장될 위치를 설정합니다.

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "outDir": "dist"
  },
  "include": ["src"]
}

이제 tsc 명령어를 실행하면 컴파일된 파일이 dist 폴더에 생성됩니다. 소스 코드와 빌드 결과물을 깔끔하게 분리할 수 있죠!

🔒 strict - 엄격한 타입 검사

TypeScript의 타입 검사를 얼마나 엄격하게 수행할지 결정하는 가장 중요한 옵션입니다.

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "outDir": "dist",
    "strict": true
  },
  "include": ["src"]
}

strict: true로 설정하면 더 안전한 코드를 작성할 수 있지만, 초기에는 오류가 많이 발생할 수 있습니다. 프로젝트의 성격에 따라 조절하세요.

🔄 moduleDetection - 자동 모듈 감지

TypeScript의 모든 파일은 기본적으로 전역 파일로 취급됩니다. 따라서 서로 다른 파일에서 같은 이름의 변수를 선언하면 충돌이 발생합니다.

이 문제를 해결하려면 각 파일에 export나 import 키워드를 사용해 독립 모듈로 만들어야 하는데, 매번 하기엔 번거롭죠. moduleDetection 옵션이 이를 자동화해줍니다!

json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "outDir": "dist",
    "strict": true,
    "moduleDetection": "force"
  },
  "include": ["src"]
}

이제 모든 TypeScript 파일이 자동으로 독립 모듈로 취급되어 변수명 충돌 걱정 없이 개발할 수 있습니다!


🎓 마무리하며

TypeScript는 단순히 JavaScript에 타입을 추가한 것 이상의 가치를 제공합니다. 코드의 안정성을 높이고, 개발 경험을 향상시키며, 대규모 프로젝트에서도 유지보수가 용이한 코드를 작성할 수 있게 해줍니다.

처음에는 타입 시스템이 낯설고 복잡하게 느껴질 수 있지만, 익숙해지면 TypeScript 없이는 개발하기 어려울 정도로 강력한 도구가 됩니다.

이 글이 TypeScript를 시작하는 데 도움이 되었기를 바랍니다. 다음 포스트에서는 TypeScript의 기본 타입과 고급 타입에 대해 더 자세히 알아보겠습니다!