TechFeedTechFeed
Frontend

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: nullundefined를 별도 타입으로 처리. 가장 많은 에러 발생
  • noImplicitAny: 타입 추론 불가 시 자동으로 any를 허용하지 않음
  • strictFunctionTypes: 함수 파라미터 타입에 반공변성 적용
  • strictPropertyInitialization: 클래스 프로퍼티가 생성자에서 초기화되지 않으면 에러
  • strictBindCallApply: bind/call/apply 호출 타입 검사 강화
  • useUnknownInCatchVariables: catch 블록의 eany가 아닌 unknown으로 처리

기존에 strict: false로 작성된 코드베이스에서 6.0으로 업그레이드하면, 가장 먼저 터지는 건 strictNullChecks다. string | undefinedstring으로 그냥 넘기던 코드들이 전부 에러가 된다.

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 모드 기본값 변경 — tsconfig.json 설정 비교
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}일`; }
TypeScript 6.0 Temporal API — Date 객체 대체, 타임존 처리 개선
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 에러 수를 모니터링하면서 감소 추세 확인 권장
TypeScript 6.0 마이그레이션 단계 — strict 모드 점진적 적용 로드맵
대형 프로젝트 마이그레이션: 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 준비다.

TypeScript 6.0TypeScriptstrict 모드ESMTemporal API마이그레이션tsconfigTypeScript 7Go 컴파일러프론트엔드

관련 포스트

Next.js 15 핵심 변경사항 총정리2026-02-15Tailwind CSS v4 심층 분석 — Oxide 엔진, CSS-first 설정, 마이그레이션 전략2026-03-25Playwright E2E 테스트 자동화 실전 가이드 — 설치부터 CI/CD 통합까지2026-04-03Vercel AI SDK 6 완전 가이드 — 에이전트 1급 추상화, MCP 풀 지원, DevTools2026-04-17