TypeScript 6.0 마이그레이션 가이드 — strict 기본값화, ESM 전환, Go 컴파일러 전환 준비
2026년 3월 출시된 TypeScript 6.0의 핵심 변경사항 — strict: true 기본값화, module: esnext 기본값, Temporal API 내장 타입, 컴파일 속도 40~60% 향상. 기존 프로젝트 단계별 마이그레이션 전략과 TypeScript 7.0(Go 기반) 전환 준비까지 정리.
2026년 3월, TypeScript 6.0이 정식 출시됐다. 가장 큰 변화는 두 가지다. strict: true가 기본값이 됐고, TypeScript 7.0(Go 기반 네이티브 컴파일러)으로 이어지는 마지막 JS 기반 버전으로 자리매김했다. 컴파일 속도는 전작 대비 40~60% 빨라졌고, 메모리 사용량은 25% 줄었다.
기존 프로젝트에 영향을 주는 변경 사항이 여럿 있다. tsconfig.json을 그대로 두고 TypeScript 6.0으로 올리면 예상치 못한 타입 에러가 쏟아질 수 있다. 어디서 무엇이 달라지는지, 마이그레이션을 어떻게 처리하는지 정리한다.
대상: TypeScript를 실무에서 사용하는 프론트엔드·백엔드 개발자 · Next.js/React/Node.js 프로젝트 관리자 · TypeScript 6.0 마이그레이션을 앞둔 팀
strict: true 기본값화 — 무엇이 달라지나
TypeScript 6.0부터 tsconfig.json에 strict를 명시하지 않으면 기본값이 true다. 이전까지는 false가 기본이었다. 이 변경 하나가 기존 프로젝트에서 가장 많은 에러를 발생시킨다.
strict 모드는 단일 플래그가 아니라 다음 플래그들의 묶음이다.
strictNullChecks: null과 undefined를 별도 타입으로 처리. 가장 많은 에러 발생
noImplicitAny: 타입 추론 불가 시 자동으로 any를 허용하지 않음
strictFunctionTypes: 함수 파라미터 타입에 반공변성 적용
strictPropertyInitialization: 클래스 프로퍼티가 생성자에서 초기화되지 않으면 에러
strictBindCallApply: bind/call/apply 호출 타입 검사 강화
useUnknownInCatchVariables: catch 블록의 e를 any가 아닌 unknown으로 처리
기존에 strict: false로 작성된 코드베이스에서 6.0으로 업그레이드하면, 가장 먼저 터지는 건 strictNullChecks다. string | undefined를 string으로 그냥 넘기던 코드들이 전부 에러가 된다.
strict: true 영향 예시 — 업그레이드 전후 비교
// TypeScript 5.x (strict: false 기본) — 에러 없음
function getLength(s: string | undefined): number {
return s.length; // undefined일 때 런타임 에러 가능성 있지만 타입 에러는 아님
}
// TypeScript 6.0 (strict: true 기본) — 컴파일 에러
function getLength(s: string | undefined): number {
return s.length;
// Error: Object is possibly 'undefined'. ts(2532)
}
// 수정 방법 1: 옵셔널 체이닝
function getLength(s: string | undefined): number {
return s?.length ?? 0;
}
// 수정 방법 2: 타입 가드
function getLength(s: string | undefined): number {
if (s === undefined) return 0;
return s.length;
}
// 마이그레이션 중 임시 우회 (tsconfig.json)
// "strict": false ← 명시적으로 false 설정하면 이전 동작 유지
// 또는 개별 플래그로 점진적 적용:
// "strictNullChecks": true ← 하나씩 켜기
기존 프로젝트 안전 마이그레이션 방법 TypeScript 6.0으로 올리면서 기존 동작을 유지하려면 tsconfig.json에 "strict": false를 명시적으로 추가해라. 그러면 이전 버전과 동일하게 동작한다. 이후 strictNullChecks부터 하나씩 켜면서 점진적으로 마이그레이션하는 방식이 가장 실용적이다.
TypeScript 6.0: strict: true가 기본값이 되면서 기존 코드베이스에 영향을 주는 변경
module: esnext 기본값화 — ESM이 표준이 됐다
TypeScript 6.0은 module 옵션의 기본값을 commonjs에서 esnext로 변경했다. Node.js가 ESM을 안정적으로 지원한 지 오래됐고, 브라우저 생태계는 이미 ESM이 표준이 된 상황에서 뒤늦은 정렬이다.
실무에서 영향을 받는 부분들:
Node.js 프로젝트: require() 방식으로 작성된 파일이 import/export 기반으로 컴파일된다. package.json에 "type": "module"이 없으면 런타임 에러 발생
CommonJS 라이브러리 interop: import foo from 'cjs-package' 방식이 필요한 경우 esModuleInterop: true 설정 확인
번들러 없는 브라우저: 직접 <script type="module">로 로드할 때 트리셰이킹 자동 적용 가능
Next.js, Vite, tsc 직접 빌드 환경별로 대응이 다르다. 번들러(Vite/webpack)를 쓰는 경우 번들러가 ESM 변환을 처리하므로 대부분 투명하게 동작한다. tsc로 직접 빌드하는 Node.js 서버 코드에서 영향이 크다.
tsconfig.json — TypeScript 6.0 업그레이드 시 주요 설정 검토
// TypeScript 6.0 기본값이 변경된 항목들
// (명시하지 않으면 이 값들이 기본으로 적용됨)
{
"compilerOptions": {
"strict": true, // 6.0 신규 기본값
"module": "esnext", // 6.0 신규 기본값 (이전: commonjs)
"target": "es2022", // 6.0 신규 기본값 (이전: es3)
"moduleResolution": "bundler", // 6.0 신규 기본값
"verbatimModuleSyntax": true // 6.0 신규 기본값
}
}
// Node.js 서버 프로젝트 — CJS 유지가 필요한 경우
{
"compilerOptions": {
"module": "commonjs", // 명시적으로 CJS 지정
"moduleResolution": "node",
"strict": false // 마이그레이션 전 임시
}
}
// Next.js 15+ 프로젝트 — 번들러 처리 위임
{
"compilerOptions": {
"module": "esnext",
"moduleResolution": "bundler", // Next.js 권장
"strict": true
}
}
Temporal API 내장 타입 — Date 객체의 대안이 표준화됐다
TypeScript 6.0은 Temporal API의 타입 정의를 기본 lib에 포함했다. Temporal은 JavaScript의 Date 객체가 가진 구조적 문제들을 해결하기 위해 TC39에서 만든 새로운 날짜/시간 API다. Node.js 22+, 최신 Chrome/Firefox에서 이미 사용 가능하다.
Date 객체의 주요 문제:
타임존 처리가 없거나 불완전함 (UTC와 로컬 타임존 혼용 혼란)
mutable 객체 — 의도치 않은 변경 위험
월이 0부터 시작 (new Date(2026, 0, 1)이 1월 1일)
DST(일광절약시간제) 처리 버그 다수
Temporal은 이를 전부 해결한다. 타임존을 명시적으로 포함하고, 모든 객체가 immutable이며, 월이 1부터 시작한다.
Temporal API 기본 사용 예시 — Date 객체와 비교
// 기존 Date 방식 (여전히 동작하지만 문제가 많음)
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth() + 1; // 0-indexed이라 +1 필요
// Temporal API (TypeScript 6.0 lib에 기본 포함)
const today = Temporal.Now.plainDateISO();
console.log(today.year); // 2026
console.log(today.month); // 4 (4월, 1-indexed)
console.log(today.day); // 5
// 타임존 명시적 처리
const seoulNow = Temporal.Now.zonedDateTimeISO('Asia/Seoul');
const nyNow = Temporal.Now.zonedDateTimeISO('America/New_York');
// Immutable 날짜 연산
const deadline = today.add({ days: 30 });
// today는 변경되지 않음, deadline이 새 객체로 반환됨
console.log(deadline.toString()); // 2026-05-05
// 날짜 차이 계산
const start = Temporal.PlainDate.from('2026-01-01');
const end = Temporal.PlainDate.from('2026-04-05');
const diff = start.until(end);
console.log(diff.days); // 94
// TypeScript 6.0: 이 타입들이 tsconfig lib 없이 바로 사용 가능
function formatDate(date: Temporal.PlainDate): string {
return `${date.year}년 ${date.month}월 ${date.day}일`;
}
Temporal API: 기존 Date 객체의 타임존·mutable 문제를 구조적으로 해결
컴파일 속도 40~60% 향상 — 실제 프로젝트에서 체감하는 차이
TypeScript 6.0의 컴파일 속도 개선은 내부 타입 체커 최적화에서 비롯됐다. 주요 개선 사항:
증분 컴파일 캐시 개선: tsbuildinfo 파일을 더 세밀하게 활용해서 변경된 파일만 재검사하는 범위가 줄어듦
타입 인스턴스화 최적화: 복잡한 제네릭 타입 평가 시 중간 결과 캐싱 개선
Control flow 분석 최적화: narrowing 연산이 더 효율적으로 처리됨
벤치마크 기준(TypeScript 공식 발표)으로 10만 줄 이상 프로젝트에서 초기 빌드 40%, 증분 빌드 60%가 빨라졌다. VS Code의 인텔리센스 응답 속도도 체감이 된다.
메모리 절감(25%)은 대형 모노레포에서 특히 중요하다. CI 환경에서 여러 TypeScript 프로젝트를 병렬로 빌드할 때 메모리 OOM 에러가 줄어든다.
기존 프로젝트 마이그레이션 가이드 — 단계별 접근
TypeScript 6.0으로 업그레이드할 때 권장하는 순서다. 대형 코드베이스일수록 한 번에 다 바꾸려 하면 PR 규모가 감당이 안 된다. 단계별로 처리해라.
TypeScript 6.0 마이그레이션 — 단계별 tsconfig.json 설정
// 1단계: 버전만 올리고 기존 동작 유지 (기존 코드 에러 없음)
{
"compilerOptions": {
"strict": false,
"module": "commonjs",
"target": "es2020"
}
}
// 2단계: strictNullChecks만 먼저 켜기 (가장 임팩트 큰 항목)
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true,
"module": "commonjs"
}
}
// 3단계: 나머지 strict 하위 플래그 순차 적용
{
"compilerOptions": {
"strict": false,
"strictNullChecks": true,
"noImplicitAny": true,
"strictPropertyInitialization": true
}
}
// 최종 목표: 완전한 strict: true
{
"compilerOptions": {
"strict": true,
"module": "esnext",
"target": "es2022"
}
}
# 업그레이드 명령
npm install --save-dev typescript@6
# 에러 현황 파악 (수정 없이 에러 수만 확인)
npx tsc --noEmit 2>&1 | grep 'error TS' | wc -l
대형 코드베이스 마이그레이션 팁 • @ts-strict-ignore 주석으로 파일 단위로 strict 예외 처리 가능 (TypeScript 5.5+) • ts-migrate (Airbnb 오픈소스) 도구로 any를 자동 삽입해서 일단 빌드 통과시킨 뒤 점진적으로 타입 정확도를 높이는 방식도 있음 • CI에서 tsc --noEmit 에러 수를 모니터링하면서 감소 추세 확인 권장
대형 프로젝트 마이그레이션: strict 하위 플래그를 하나씩 켜는 점진적 접근이 현실적
TypeScript 7.0 (Go 기반) 전환 준비 — 6.0이 브릿지인 이유
TypeScript 6.0이 "마지막 JavaScript 기반 TypeScript"라는 의미를 이해해야 한다. TypeScript 팀은 7.0에서 컴파일러를 Go 언어로 완전히 재작성할 계획이다. 목표는 현재 대비 빌드 속도 10배, 메모리 사용량 대폭 절감이다.
왜 Go인가? TypeScript 컴파일러 자체가 TypeScript로 작성되어 있어서, 컴파일러를 컴파일하는 데 컴파일러가 필요한 구조다. Go로 재작성하면 네이티브 바이너리로 실행되므로 JIT 오버헤드가 없고, 병렬 처리가 훨씬 효율적이다.
개발자로서 준비해야 할 것:
호환성: 7.0의 타입 체킹 결과는 6.0과 동일하도록 설계됨. 컴파일 속도만 달라짐. 기존 코드 수정 불필요
플러그인/트랜스포머: TypeScript Compiler API를 직접 사용하는 도구들(ts-jest, ts-node, 일부 webpack 플러그인)이 영향받을 수 있음. 7.0 출시 전후 관련 라이브러리 버전 확인 필요
LSP/에디터 플러그인: VS Code의 TypeScript 언어 서버도 7.0 바이너리로 교체될 예정. 인텔리센스 응답이 체감 가능하게 빨라짐
6.0 기준으로 strict: true, ESM 기반 코드 구조를 갖추면 7.0 전환 시 추가 마이그레이션 비용이 없다. 6.0을 제대로 마이그레이션하는 것이 곧 7.0 준비다.