TypeScript 7.0 RC와 Go 컴파일러 전환: tsgo 마이그레이션 가이드

TypeScript 7.0 RC의 Go 기반 tsgo 컴파일러, 병렬 타입 체킹, CI 구성과 마이그레이션 시 점검할 변경점을 정리한다.

2026-08-14 · 최초 발행 2026-08-02

Microsoft는 2026년 6월 18일 TypeScript 7.0 RC를 발표했다. 14년 동안 자기 자신을 컴파일하던 TypeScript 컴파일러는 Go로 포팅됐으며, TypeScript 6.0보다 약 10배 빠른 타입 체킹 속도를 기록했다. VS Code 프로젝트 150만 줄 기준 빌드 시간은 77.8초에서 7.5초로 줄었다.

Project Corsa가 겨냥한 컴파일러 병목

기존 TypeScript 컴파일러는 TypeScript로 작성된 self-hosted 구조였고 Node.js 런타임에서 동작했다. 이 구조에서는 싱글 스레드 제약과 JavaScript GC 오버헤드를 피하기 어려웠다. 대규모 코드베이스의 타입 체킹은 병렬 처리하기 어려웠고, 빌드 대기는 수십 초까지 늘어났다.

Microsoft 내부 프로젝트명인 Project Corsa는 이 병목을 해소하기 위해 시작됐다. 접근 방식은 새 컴파일러를 설계하는 대신, 기존 알고리즘과 데이터 구조를 Go로 충실하게 옮기는 것이었다. TypeScript 6.0의 타입 체킹 시맨틱을 100% 유지하는 포팅이므로, TypeScript 7.0은 호환성을 깨지 않고 실행 성능을 개선한다.

Go 선택에는 경량 동시성과 공유 메모리 구조가 관련된다. 고루틴 하나의 메모리 비용은 약 2KB이고, OS 스레드의 수 MB와 차이가 난다. 여러 타입 체커는 같은 심볼 테이블에 직렬화 없이 동시에 접근할 수 있다.

tsgo에서 타입 체킹을 나누는 방식

Node.js 기반 컴파일러는 타입 체킹을 단일 스레드에서 처리했다. Worker Threads를 활용해도 공유 메모리가 없어 직렬화 비용이 발생했다. Go 기반 tsgo는 Project References 빌드와 타입 체킹을 각각 병렬화한다.

tsconfig.json 파싱파일 의존성 그래프 구성Project References 분석--builders N 설정Builder 워커 #1(서브프로젝트 A)Builder 워커 #2(서브프로젝트 B)Builder 워커 #3(서브프로젝트 C)--checkers N 설정Checker 고루틴 #1공유 심볼 테이블Checker 고루틴 #2공유 심볼 테이블Checker 고루틴 #3공유 심볼 테이블Checker 고루틴 #4공유 심볼 테이블타입 오류 집계증분 빌드 캐시 갱신진단 결과 출력

--checkers는 동시에 동작할 타입 체커 고루틴 수를 정한다. 기본값은 4이며, CI 러너의 코어 수와 메모리 상한에 맞춰 조정한다. 워커를 늘리면 체킹 속도는 빨라지지만 메모리 사용량도 비례해 커진다.

# 타입 체킹 워커 8개로 실행
tsgo --checkers 8 --noEmit

# 디버깅 환경에서 단일 스레드 강제
tsgo --singleThreaded --noEmit

모노레포에서 Project References 빌드의 병렬도를 정하는 옵션은 --builders다. 이 값은 --checkers와 곱해진다. --checkers 4 --builders 4라면 최대 16개의 타입 체커가 동시에 동작한다. 설정을 과도하게 높이면 메모리를 급격히 소비하므로 러너 사양을 기준으로 튜닝해야 한다.

# 모노레포 병렬 빌드 (checkers × builders = 최대 16 타입 체커)
tsgo --build --checkers 4 --builders 4

# CI 8코어 러너 최적 설정 예시
tsgo --build --checkers 6 --builders 2 --noEmit

공개 벤치마크가 보여 주는 변화

Microsoft가 공개한 기업 프로젝트 벤치마크에서는 8~10배의 속도 향상이 제시됐다.

프로젝트 TS 6.0 TS 7.0 RC 개선율
VS Code (150만 줄) 77.8초 7.5초 10.4배
Sentry 133초 16초 8.3배
Playwright 9.3초 1.24초 7.5배
Bloomberg 내부 모노레포 측정 중 측정 중 ~10배

메모리는 3배 절감되며, GitHub Actions나 CircleCI처럼 GB당 과금하는 CI 환경에서는 비용 절감과도 연결된다. 속도 개선의 절반은 Node.js GC가 없는 네이티브 바이너리 실행에서, 나머지 절반은 공유 메모리 기반 병렬 타입 체킹에서 나온다.

Watch와 증분 캐시의 변경점

--watch 모드의 파일 감시도 새로 구성됐다. 기존 폴링 방식은 Parcel 번들러에서 포팅한 파일 감시기로 교체됐고, OS 레벨 파일 시스템 이벤트를 직접 구독한다. 폴링 지연 없이 대규모 디렉토리 트리에서도 일정한 반응 속도를 목표로 한다.

증분 빌드 캐시는 파일 내용 해시를 기준으로 변경 파일과 의존 파일만 다시 처리한다. 첫 빌드 뒤의 작은 수정에서는 타입 체킹 시간이 수백 밀리초 수준으로 떨어진다.

언어 서버까지 이어지는 tsgo 전환

TypeScript 7.0 RC의 tsgo 바이너리는 Language Server Protocol(LSP)도 구현한다. VS Code의 TypeScript 언어 서버가 tsgo 기반으로 바뀌면 자동완성, 타입 힌트, 오류 표시에 걸리는 시간도 함께 줄어든다.

VS Code Insiders에서는 tsgo 기반 언어 서버를 실험적으로 제공하고 있다. 이 통합에서는 프로젝트 로딩 시간이 기존 대비 8배 빨라졌다는 수치가 제시됐다.

tsconfig과 도구 의존성을 먼저 점검한다

마이그레이션에서 확인할 기본값은 rootDirtypes다. rootDir의 기본값은 "./"로 변경됐다. tsconfig.jsonsrc 디렉터리 상위에 있다면 출력 구조를 유지하기 위해 rootDir: "./src"를 명시해야 한다.

types는 기본 빈 배열로 바뀐다. Node.js, Jest, Mocha 등의 전역 @types 패키지에 의존하는 프로젝트는 tsconfig.jsontypes 배열에 해당 타입을 명시한다.

{
  "compilerOptions": {
    "rootDir": "./src",
    "types": ["node", "jest"],
    "strict": true
  }
}

전환 흐름은 RC 설치 후 설정과 의존 도구를 검토하고, 전체 타입 체킹을 통과시킨 뒤 CI 병렬도를 조정하는 순서다.

typescript-eslint 충돌커스텀 트랜스포머문제 없음없음현재 프로젝트TS 6.x(1) RC 설치npm i -D typescript@rc(2) tsconfig.jsonrootDir·types 검토(3) ESLint·변환기의존성 확인typescript 별칭 설정npm:@typescript/typescript6@^6TS 7.1 대기Transformer API 안정화(4) tsgo --noEmit전체 타입 체크(5) 오류 있음?오류 수정기존 시맨틱 동일 보장(6) CI 파이프라인--checkers·--builders 튜닝(7) GA 출시프로덕션 전환

typescript-eslint처럼 TypeScript API를 직접 사용하는 도구는 devDependencies에 별칭을 추가해 TypeScript 6.0과 공존시킨다. 커스텀 트랜스포머나 Compiler API 통합은 Transformer API 안정화가 예정된 TypeScript 7.1까지 마이그레이션을 보류하는 것이 공식 권고다.

CI 병렬화는 잡 밖이 아니라 tsgo 안으로 옮길 수 있다

TypeScript 6.x에서는 느린 타입 체킹을 피하기 위해 모노레포를 패키지별로 나누고 여러 CI 잡으로 병렬 실행하는 구성이 일반적이었다. 잡 오케스트레이션이 복잡해지고 캐시 무효화 관리도 어려워진다.

TypeScript 7.0에서는 단일 CI 잡 내부에서 --checkers--builders를 이용해 병렬도를 처리할 수 있다. 잡 수가 줄면 오케스트레이션 복잡도와 큐 대기 시간도 함께 감소한다.

# GitHub Actions CI 최적화 예시
- name: Type Check
  run: tsgo --build --checkers ${{ runner.cpu-count }} --builders 2 --noEmit

- name: Transpile (esbuild로 분리)
  run: esbuild --bundle src/index.ts --outdir=dist

TypeScript 7.0은 --noEmit 타입 체킹에 집중하고, JavaScript 트랜스파일은 esbuild나 SWC에 맡기는 역할 분리가 2026년 빌드 생태계의 표준으로 자리잡았다.

tsgo와 네이티브 빌드 도구의 역할 경계

tsgo가 빨라졌더라도 esbuild, SWC, Biome 같은 네이티브 도구를 대체하는 것은 아니다. 각 도구가 맡는 단계가 다르다.

도구 언어 역할 속도 기준
tsgo (TS 7.0) Go 타입 체킹 + LSP ~10배 vs TS 6
esbuild Go 번들링 + 트랜스파일 ~100배 vs Babel
SWC Rust 트랜스파일 + 최소화 ~20배 vs Babel
Biome Rust 린팅 + 포매팅 ~25배 vs ESLint
Turbopack Rust 번들링 (Next.js) ~10배 vs Webpack

tsgo는 타입 체킹의 정확도를 유지한다. esbuild와 SWC는 타입을 무시하고 트랜스파일만 수행하므로 런타임 타입 안전성을 확보하지 못한다. tsgo --noEmit으로 타입을 검증한 뒤 esbuild 또는 SWC로 JavaScript를 출력하는 조합이 고성능 TypeScript 빌드 파이프라인의 기준이다.

컴파일러 최적화 관점에서는 데이터플로우 분석의 의존성 그래프를 따라 독립 서브트리를 병렬 처리하고, 의미적으로 바뀐 심볼만 다시 분석하는 선택적 재컴파일(Selective Recompilation)을 적용한 사례로 볼 수 있다.

RC 이후의 생태계 변화

TypeScript 7.0 GA 출시는 RC 기준 약 한 달 내로 예상되지만 공식 확정 날짜는 없다. 로드맵에서는 Transformer API 안정화가 예정된 TypeScript 7.1, VS Code 기본 TypeScript 서버의 tsgo 기반 전환, 더 엄격한 타입 수준 도입, Nx와 Turborepo 등의 --builders 플래그 통합 준비가 주목할 변화다.

Figma, Vercel, Canva처럼 대형 TypeScript 코드베이스를 운영하는 기업들이 RC 단계에서 베타 피드백을 제공했다는 점도 빠른 수용을 예고한다. Go 포팅으로 얻은 10배 속도와 3배 메모리 절감은 개발 생산성과 CI 비용에 직접 영향을 준다. 기존 시맨틱을 유지하는 전환인 만큼, rootDirtypes 기본값 및 API 의존 도구를 확인한 뒤 단계적으로 적용할 수 있다.

Sources

TypeScripttsgoGo 컴파일러타입 체킹CI/CD