TypeScript 7.0 신기능 심층 분석: Go 언어로 전면 재작성된 10배 빠른 컴파일러

TypeScript · Release 7.0

TypeScript 7.0 신기능 심층 분석: Go 언어로 전면 재작성된 10배 빠른 컴파일러

typescriptTypeScript릴리스Go병렬 컴파일성능 최적화

데이터 소스:GitHub Releases + 官方博客 + HN

TypeScript 7.0은 기념비적인 아키텍처 혁신을 담아낸 메이저 업데이트입니다. 이번 릴리스의 핵심 테마는 바로 ‘극강의 속도와 동시성’으로, 컴파일러 엔진 전체를 기존 JavaScript에서 Go 언어로 완전히 재작성했습니다. 이번 전면 재구축을 통해 TypeScript는 네이티브 코드 수준의 실행 속도와 공유 메모리 기반의 멀티스레드 처리 역량을 확보했으며, 전체 빌드 시간을 평균 8배에서 12배까지 단축하고 메모리 사용량을 크게 줄였습니다. 이번 글에서는 TypeScript 7.0의 핵심 기능과 업그레이드 시 주의해야 할 사항들을 상세히 정리해 드립니다.

Go 기반의 전면 재작성과 비약적인 성능 향상

TypeScript 7.0의 가장 근본적인 변화는 하위 아키텍처의 대전환입니다. 오랫동안 TypeScript는 언어 자체(TypeScript/JavaScript)로 작성되는 셀프 호스팅(Self-hosting) 방식을 고수해 왔습니다. 그러나 7.0에서는 Microsoft 팀이 컴파일러를 매우 정밀하게 Go 언어로 네이티브 포팅했습니다.

이러한 전환은 대규모 프로젝트가 겪어 온 컴파일 성능 병목을 단번에 해소했습니다. VS Code, Sentry 등 주요 대규모 오픈소스 프로젝트를 대상으로 한 공식 벤치마크 테스트에서 TypeScript 7은 컴파일 시간을 수백 초 단위에서 불과 십여 초, 심지어 수 초 단위로 단축시키며 평균 약 10배에 달하는 성능 향상을 입증했습니다. 더불어 컴파일 전 주기에 걸친 최대 메모리 사용량도 크게 낮추어 로컬 개발과 CI 빌드 전반의 컴퓨팅 리소스를 획기적으로 절감합니다.

새로운 동시성 제어 및 단일 스레드 모드

Go 언어의 뛰어난 동시성 처리 능력을 바탕으로, TypeScript 7.0은 이제 구문 파싱, 타입 검사, 코드 생성 등 컴파일 전 과정에서 병렬 연산을 수행합니다. 이에 따라 병렬 처리 수준을 세부적으로 조정할 수 있는 새로운 CLI 옵션들이 추가되었습니다.

타입 검사를 전담하는 워커 스레드 수는 --checkers 플래그로 설정할 수 있습니다(기본값: 4). 고성능 멀티코어 환경에서는 이 수치를 높여 빌드 시간을 더욱 단축할 수 있으며, 자원이 제한된 CI 컨테이너에서는 낮추어 안정성을 확보할 수 있습니다. 마찬가지로 프로젝트 참조(Project References) 기반의 멀티 프로젝트 아키텍처에서는 --builders 옵션을 통해 동시 빌드 프로젝트 수를 유연하게 제어할 수 있습니다.

또한 디버깅이나 극도로 제한된 환경에서의 원활한 실행을 돕기 위해 새로운 --singleThreaded 플래그가 제공됩니다. 이 플래그를 활성화하면 모든 컴파일 작업이 단일 스레드에서 순차적으로 실행됩니다.

재설계된 Watch 모드 파일 감시 메커니즘

일상적인 개발 과정에서 --watch 모드를 상시 구동하는 팀에게 방대한 node_modules 디렉터리 감시로 인한 높은 CPU 폴링 부하는 이전 버전의 큰 골칫거리였습니다.

TypeScript 7.0은 Parcel 번들러의 기반 기술(@parcel/watcher)에 착안한 새로운 파일 감시 아키텍처를 도입했습니다. 핵심 로직을 Go 언어로 직접 이식함으로써 별도의 C++ 빌드 도구 체인을 요구하지 않으면서도 매우 적은 오버헤드로 크로스 플랫폼 파일 변경을 감지합니다. 이를 통해 대규모 프론트엔드 프로젝트에서도 밀리초 단위의 즉각적인 핫 리로드 피드백을 제공합니다.

생태계 호환성 전략: TypeScript 6 별칭 기반 공존 모델

TypeScript 7.0이 컴파일러 엔진을 Go로 전면 이전함에 따라, 기존에 널리 활용되던 프로그래밍 방식의 컴파일러 API는 현재 외부에 공개되어 있지 않습니다(해당 API는 TypeScript 7.1에서 새로운 형태로 개편되어 제공될 예정입니다). 이로 인해 typescript-eslint와 같이 TS 컴파일러 API에 강하게 의존하는 주변 생태계 도구들은 7.0 엔진을 직접 호출할 수 없습니다.

이 문제를 해결하기 위해 공식적으로 사이드 바이 사이드(Side-by-Side) 공존 방식을 제공합니다. 개발자는 @typescript/typescript6 호환 패키지를 설치하여 한 프로젝트 안에서 CLI 빌드와 에디터 언어 서비스는 고속의 TS 7.0에 맡기고, API를 필요로 하는 도구는 6.0 엔진으로 안전하게 폴백하도록 구성할 수 있습니다.

{
  "devDependencies": {
    "typescript": "npm:@typescript/typescript6@^6.0.2",
    "@typescript/native": "npm:typescript@^7.0.2"
  }
}

템플릿 리터럴 타입의 네이티브 유니코드 지원

문자열 타입 추론 과정에서 이전 버전의 TypeScript는 JavaScript 표준인 UTF-16 코드 유닛 인덱싱을 그대로 따랐습니다. 이로 인해 이모지와 같은 서러게이트 페어(Surrogate Pair) 문자가 중간에서 분리되어 의미를 알 수 없는 깨진 문자열로 처리되는 한계가 있었습니다. TypeScript 7.0에서는 템플릿 리터럴 타입이 유니코드 문자를 온전한 단일 논리 단위로 인식하고 보존합니다.

type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;

type Result = HeadTail<"😀abc">;
// 7.0에서의 추론 결과: ["😀", "abc"]
// 이전 버전에서의 추론 결과: ["\ud83d", "\ude00abc"]

이러한 개선 덕분에 복잡한 문자열에 대한 타입 수준 연산이 대폭 단순화되었으며, 런타임 환경의 for...of 순회나 배열 스프레드 연산의 실제 동작과 일관성을 유지할 수 있게 되었습니다.

JavaScript 지원 규격 조정 및 주요 주요 변경 사항(Breaking Changes)

TypeScript 7.0에서는 더 빠른 분석 속도를 위해 JSDoc 및 일반 JavaScript 파일에 대한 파싱 규격을 강화하고 불필요한 예외 케이스들을 정리했습니다. 예를 들어 @enum 태그의 특수 동작이 제거되어 표준 선언을 사용해야 하며, Closure Compiler 스타일의 함수 타입 표기(예: function(string): void)는 지원이 중단되어 TypeScript 표준 화살표 문법인 (s: string) => void로 작성해야 합니다.

또한 7.0에서는 한층 엄격해진 기본 설정이 적용됩니다(6.0에서 도입되었던 기준들이 이제 경고를 넘어 엄격한 에러로 강제됩니다):

  • strict 모드가 기본 활성화되며, module 기본값은 esnext로 설정됩니다.
  • rootDir의 기본값은 ./이며, types는 기본적으로 []로 초기화됩니다(기존처럼 암시적으로 모든 글로벌 타입을 불러오지 않습니다).
  • target: es5에 대한 지원이 완전히 삭제되었습니다.
  • baseUrl 및 moduleResolution: node가 완전히 사용 중단(deprecated)되었습니다. 공식 팀은 최신 표준 경로 별칭과 함께 nodenext 또는 bundler 모드를 사용할 것을 권장합니다.

업그레이드 권장 가이드

적용 대상권장 업그레이드 시점마이그레이션 주의사항
순수 TypeScript 프로젝트즉시 업그레이드tsconfig.json에서 사용 중단된 baseUrl 필드를 제거하고, 루트 디렉터리가 아닌 소스코드에 "rootDir": "./src"를 명시하며, 필요한 경우 "types": ["node"]를 명시적으로 지정합니다.
JSDoc 기반의 레거시 JS 프로젝트관망 / 신중한 업그레이드7.0의 JSDoc 구문 파싱이 더욱 엄격해졌으므로 Closure 문법에 의존하는 주석들을 TypeScript 표준 표기법으로 전면 재작성해야 합니다.
Vue / Astro / Svelte 프레임워크 개발연기 또는 하이브리드 병용컴파일러 API 파싱에 강하게 의존하는 템플릿 플러그인은 현재 에디터 상에서 7.0에 완전히 대응하지 못하므로, 7.1 출시를 기다리거나 앞서 언급한 공존 모드를 사용합니다.
라이브러리 및 도구 체인 메인테이너호환성 테스트 및 적응패키지가 외부에 노출된 typescript 컴파일러 API에 의존하는 경우, 런타임 오류 방지를 위해 사용자에게 6.0 별칭 호환 패키지 사용을 안내해야 합니다.

참고 자료