TypeScript 6.0 Beta — TS 7 가기 전에 tsconfig부터 정리하자

9 min read
TypeScripttsconfig마이그레이션Breaking Changes
TypeScript 6.0 Beta — TS 7 가기 전에 tsconfig부터 정리하자

strict가 기본이 되는 날

TypeScript 6.0 Beta가 나왔다. 이번 릴리스는 새로운 문법이나 기능보다 기본값 대청소에 가깝다. --strict가 드디어 기본 true가 되고, targetes2025로, moduleesnext로 바뀐다. 지금까지 "켜야 하는데 안 켜고 있던 것들"이 이제 처음부터 켜져 나온다.

포인트: 6.0은 단독 릴리스라기보다, Go로 재작성된 TypeScript 7.0으로 가는 징검다리다. 6.0에서 정리하지 않으면 7.0에서 한꺼번에 맞는다.

설치.sh
npm install -D typescript@beta

바뀌는 기본값 한눈에 보기

옵션5.x 기본값6.0 기본값영향도
strictfalsetrue높음
modulecommonjsesnext높음
targetes5 또는 es3es2025높음
types자동 탐색[] (빈 배열)높음
rootDir추론. (tsconfig 위치)중간
noUncheckedSideEffectImportsfalsetrue중간
esModuleInteropfalsetrue (변경 불가)낮음

가장 주의할 건 types: []이다. 이전에는 node_modules/@types/ 아래의 모든 타입 패키지를 자동으로 가져왔다. 6.0부터는 명시하지 않으면 아무것도 안 가져온다.

tsconfig.json
{
  "compilerOptions": {
    "types": ["node"]
  }
}

이걸 안 넣으면 process, Buffer, __dirname 같은 Node.js 전역 타입이 전부 사라진다. 빌드가 갑자기 수백 개의 에러를 뿜는다면, 십중팔구 이 설정이 원인이다.

[💡 잠깐! 이 용어는?] @types 패키지: DefinitelyTyped 커뮤니티가 관리하는 서드파티 라이브러리의 타입 선언 패키지다. @types/node, @types/react 등이 있으며, types 배열에 명시하면 해당 패키지의 타입만 컴파일에 포함된다.


삭제되는 옵션들

6.0에서 deprecated 처리되고, 7.0에서 완전히 제거되는 옵션들이 있다. 비유하면 집 리모델링 전에 철거 딱지를 붙이는 단계다.

제거 옵션대체 방법
target: "es5"최소 es2015 이상 사용
--moduleResolution nodenodenext 또는 bundler 사용
--module amd/umd/systemjsESM으로 전환
--baseUrlpaths에 명시적 경로 매핑
--outFile외부 번들러(Vite, esbuild 등) 사용
--downlevelIterationES5 전용이므로 불필요

--moduleResolution node(node10)의 제거가 특히 영향이 크다. 아직 이 설정을 쓰고 있는 프로젝트라면, bundler 또는 nodenext로 전환해야 한다.

tsconfig.json — before
{
  "compilerOptions": {
    "moduleResolution": "node",
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}
tsconfig.json — after
{
  "compilerOptions": {
    "moduleResolution": "bundler",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

baseUrl이 사라지면서 paths의 경로를 ./로 시작하는 상대 경로로 바꿔야 한다. 사소해 보이지만, 대형 프로젝트에서는 수십 개의 경로 매핑을 수정해야 할 수 있다.


새로운 기능들

기본값 정리만 하는 게 아니다. 실용적인 기능도 들어왔다.

ES2025 타입과 Temporal API

es2025 타겟이 추가되면서 최신 ECMAScript 빌트인 타입을 사용할 수 있다.

es2025-features.ts
// RegExp.escape — 특수문자 자동 이스케이프
const pattern = new RegExp(RegExp.escape("$100.00"))
 
// Promise.try — 동기/비동기 에러를 일관되게 처리
const result = await Promise.try(() => {
  return riskyOperation()
})
 
// Set 메서드 — 집합 연산
const a = new Set([1, 2, 3])
const b = new Set([2, 3, 4])
const intersection = a.intersection(b) // Set {2, 3}
const difference = a.difference(b)     // Set {1}
temporal-api.ts
// Temporal API — 날짜/시간의 새로운 표준
const now = Temporal.Now.instant()
const yesterday = now.subtract({ hours: 24 })
 
const date = Temporal.PlainDate.from("2026-02-20")
const nextWeek = date.add({ weeks: 1 })

[💡 잠깐! 이 용어는?] Temporal API: Date 객체의 문제점(타임존 처리, 불변성 부재, API 일관성 등)을 해결하기 위해 제안된 차세대 날짜/시간 API다. Stage 3 단계이며, 대부분의 최신 브라우저에서 구현이 진행 중이다.

Map의 getOrInsert

Map에서 "없으면 넣고 반환" 패턴을 한 줄로 처리할 수 있다.

map-upsert.ts
const cache = new Map<string, number[]>()
 
// before — 매번 존재 여부 확인
if (!cache.has("users")) {
  cache.set("users", [])
}
cache.get("users")!.push(1)
 
// after — getOrInsert로 한 줄
cache.getOrInsert("users", []).push(1)
 
// 비용이 큰 초기화는 콜백으로
cache.getOrInsertComputed("users", () => expensiveInit())

Subpath Imports #/ 지원

Node.js 20+의 subpath imports에서 #/ 프리픽스를 사용할 수 있다.

package.json
{
  "imports": {
    "#/*": "./dist/*"
  }
}
사용 예시.ts
// before
import { utils } from "#root/utils.js"
 
// after — 더 깔끔한 경로
import { utils } from "#/utils.js"

TS 7.0 대비 — stableTypeOrdering

--stableTypeOrdering 플래그는 6.0에서 가장 전략적인 추가 기능이다. Go로 재작성된 TS 7.0은 타입 추론 순서가 달라질 수 있는데, 이 플래그를 켜면 6.0에서 미리 그 차이를 확인할 수 있다.

tsconfig.json
{
  "compilerOptions": {
    "stableTypeOrdering": true
  }
}

주의할 점은 약 25%의 성능 오버헤드가 있다는 것이다. CI에서만 켜서 호환성을 검증하고, 로컬 개발에서는 끄는 전략이 현실적이다.

tsconfig.ci.json
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "stableTypeOrdering": true
  }
}

마이그레이션 체크리스트

6.0으로 올릴 때 순서대로 확인할 항목이다.

  • types 배열에 필요한 타입 패키지 명시 (["node"] 등)
  • moduleResolutionbundler 또는 nodenext로 변경
  • baseUrl 제거 후 paths를 상대 경로로 수정
  • targetes5es2015 이상으로 올리기
  • moduleamd/umd/systemjs면 ESM으로 전환
  • --outFile 사용 중이면 외부 번들러로 교체
  • CI에서 --stableTypeOrdering 켜서 TS 7.0 호환성 검증

급하게 올려야 하는데 deprecated 옵션이 너무 많다면, "ignoreDeprecations": "6.0"을 tsconfig에 추가해서 임시로 넘어갈 수 있다. 하지만 7.0에서는 이 옵션 자체가 사라지니, 미루는 것이지 해결하는 것이 아니다.

자동 마이그레이션 도구 ts5to6도 제공된다.

자동-마이그레이션.sh
npx ts5to6 --project tsconfig.json

마무리

TypeScript 6.0은 화려한 신기능보다 기술 부채 청산에 집중한 릴리스다. strict: true가 기본이 되고, CommonJS 중심의 레거시 옵션들이 정리된다. 불편할 수 있지만, 이 정리가 끝나야 Go 네이티브 TS 7.0의 성능 혜택을 제대로 받을 수 있다.

  • 지금 당장 할 일: types: ["node"] 명시, moduleResolution 전환
  • CI에서 할 일: --stableTypeOrdering으로 7.0 호환성 사전 검증
  • 하지 말 것: ignoreDeprecations로 무한정 미루기

결국 6.0은 질문 하나를 던지는 릴리스다. "너의 tsconfig, 정말 네가 의도한 대로 설정돼 있어?"


참고:

관심 있을 만한 포스트

Tsonic — TypeScript를 네이티브 바이너리로 컴파일하는 실험

TypeScript → C# → NativeAOT 파이프라인으로 네이티브 실행 파일을 만드는 Tsonic. 어떻게 동작하고, 어떤 한계가 있는지 살펴봤다.

TypeScriptNativeAOT

Babel 7.29.0 — 10년 역사의 마지막 마이너, 그리고 8 RC1

2026년 1월 31일, Babel 7의 마지막 마이너 릴리스가 공개됐다. 이 버전이 갖는 역사적 의미와 Babel 8 RC1의 핵심 변화를 정리한다.

BabelJavaScript

jQuery 4.0 — 10년 만의 메이저 릴리스, 무엇이 바뀌었나

jQuery가 20주년을 맞아 10년 만에 메이저 버전을 출시했다. IE 지원 축소, ES 모듈 전환, Trusted Types 등 핵심 변경 사항을 정리한다.

jQueryJavaScript

달리는 차의 엔진을 바꾸다 — Nx 모노레포에서 Bun 도입까지의 여정

Nx 18에서 21까지 버전 업그레이드와 Bun 패키지 매니저 도입을 동시에 진행한 컬리의 마이그레이션 전략과 실전 이슈를 정리한다.

NxBun

Babel 8 Beta — CJS를 버리고 ESM 전용으로 간다

2년간의 알파를 거쳐 베타에 진입한 Babel 8의 핵심 변경사항과 마이그레이션 전략을 정리한다.

BabelESM

Bun vs Node.js vs Deno — 뭐가 다른지, 그래서 뭘 쓰면 좋은지 (2026 기준)

런타임 3대장 비교: 호환성(Node), 속도/번들(Bun), 올인원/보안(Deno). 팀/프로덕트 상황별 선택 기준과 체크리스트까지 정리.

BunNode.js

OOM이 터지고 나서야 깨달은 것들 — Webpack4에서 Vite로 갈아탄 5년 묵은 CMS

CI 빌드가 OOM으로 터진 뒤, 5년 동안 방치된 Webpack4 기반 CMS를 Vite로 전환하며 빌드 시간 48%, 번들 크기 81%를 줄인 과정.

ViteWebpack

AI 코딩의 맹점 — Artifacts 없이 에이전트는 기억을 잃는다

PRD, ADR, TDD가 AI 코딩 워크플로우에서 왜 선택이 아닌 필수인지, 실전 구조와 함께 살펴본다.

AI 코딩Artifacts