TypeScript 7이 Go 기반 컴파일러와 함께 출시되었습니다. 이 컴파일러는 타입 체크 시간을 기존의 10분의 1로 단축하고 메모리 사용량을 최대 4분의 1까지 줄여주며, 개발자가 VS Code에서 “저장”을 누르는 순간 그 변화를 즉각 체감할 수 있게 합니다.
Microsoft가 언어 서비스의 핵심을 Go로 재작성하기로 결정한 것은, TypeScript의 증분 체크(incremental checker)가 대규모 모노레포에서 멈추거나 느려질 수 있다는 수년간의 불만 사항을 반영한 결과입니다. 파싱과 타입 체크라는 핵심 작업을 기존의 JavaScript 구현체에서 분리함으로써, 팀은 언어 수준에서 병렬 처리를 구현하고 Node.js 런타임의 오버헤드를 줄일 수 있었습니다.
왜 재작성이 중요한가
Next.js 또는 Nuxt와 같은 프레임워크로 구축된 현대적인 웹 앱은 수천 개의 모듈을 불러오는 것이 일상적입니다. 이러한 환경에서는 첫 번째 타입 에러가 나타날 때까지 걸리는 시간이 편집-컴파일-디버그 루프의 흐름을 끊을 수 있습니다. 새로운 컴파일러는 VS Code에서 첫 번째 에러를 찾는 시간을 17.5초에서 1.3초 미만으로 단축하며, 이는 해당 에디터에서만 11.9배의 속도 향상을 의미합니다. 다양한 프로젝트의 독립적인 벤치마크에서도 유사한 성능 향상이 확인되었습니다.
- VS Code: 11.9배 빠름
- Sentry: 8.9배 빠름
- Bluesky: 8.7배 빠름
- Playwright: 8.7배 빠름
- Tldraw: 7.7배 빠름
메모리 사용량 또한 개선되었습니다. VS Code의 TypeScript 서버는 이제 RAM을 18% 적게 사용하며, Bluesky는 26%, Tldraw는 15%의 메모리 절감 효과를 보였습니다.
이러한 수치는 실제 생산성으로 이어집니다. 몇 초마다 파일을 저장하는 개발자는 이제 10배 더 빠르게 반복 작업을 수행할 수 있으며, 대규모 코드베이스에서의 일상적인 작업 마찰을 획기적으로 줄일 수 있습니다.
세밀한 제어를 위한 새로운 설정
Go 컴파일러는 팀이 하드웨어와 워크플로우에 맞춰 성능을 조정할 수 있도록 다음과 같은 명령줄 플래그(command-line flags)를 도입했습니다.
- 병렬 처리 (
--checkers및--builders): 파싱과 타입 체크를 동시에 실행하여, 사용자가 속도와 메모리 압박 사이의 균형을 맞출 수 있게 합니다. - 싱글 스레드 모드 (
--singleThreaded): 디버깅을 단순화하며 리소스가 제한된 환경에 적합합니다. - 확장 가능한 워커(Scalable workers): 타입 체크 워커를 빌더 워커와 독립적으로 확장할 수 있어, 맞춤형 빌드 파이프라인 구축이 가능합니다.
- 개선된 watch 모드: 기존의 Node 기반 파일 스캐너를 Go 파일 워처(file watcher)로 교체하여, 거대한
node_modules트리를 재귀적으로 스캔하는 데 드는 막대한 비용을 제거했습니다.
이러한 옵션들을 통해 대규모 조직은 기존 코드를 전면 수정하지 않고도 CI 파이프라인에서 추가적인 성능을 끌어낼 수 있습니다.
리스크와 반론
핵심 구성 요소를 다른 언어로 재작성하는 것에는 논란이 따를 수밖에 없습니다. 일부 개발자들은 Go로의 전환이 성숙한 JavaScript 구현체에서 이미 해결된 새로운 버그나 호환성 문제를 일으킬 수 있다고 우려합니다. 또한, 이번 변화는 TypeScript 툴체인에 Go 런타임 의존성을 추가하므로, Node.js에 엄격하게 종속된 환경을 복잡하게 만들 수 있습니다. 초기 도입자들은 자신들의 커스텀 플러그인과 언어 서버 확장 기능이 변함없이 작동하는지 검증해야 할 것입니다.
향후 주목할 점
Microsoft는 정식 출시 버전에서 Go 기반 컴파일러를 기본값으로 설정했지만, 기존 JavaScript 엔진도 폴백(fallback)용으로 계속 사용할 수 있습니다. 주요 IDE와 CI 서비스의 채택률을 모니터링하면, 성능 향상이 마이그레이션의 번거로움을 상쇄할 만큼 가치 있는지 알 수 있을 것입니다. 또한, 새로운 플래그에 대한 커뮤니티의 피드백은 컴파일러의 진화 방향을 결정할 것입니다. 만약 개발자들이 병렬 옵션을 조정하기 어렵다고 느낀다면, Microsoft는 더 높은 수준의 프리셋(presets)을 도입할 수도 있습니다.
요약: TypeScript 7의 Go 재작성은 최대 10배 빠른 타입 체크와 눈에 띄는 메모리 절감 효과를 제공합니다. 생태계가 새로운 런타임에 원활하게 적응한다면, 이는 대규모 JavaScript 개발을 즉각적으로 더 빠르고 쾌적하게 만드는 전환점이 될 것입니다.
