타입스크립트, 이제 Go로 다시 태어난다: 10배 빨라지는 이유와 커뮤니티 반응까지

7 hours ago 1

마이크로소프트가 최근 TypeScript 컴파일러를 Go 언어로 포팅한다고 발표했습니다. 이 결정은 개발 커뮤니티에 큰 화제가 되었는데, 과연 왜 마이크로소프트는 TypeScript를 Go로 재작성하기로 했을까요? 기존 TypeScript의 한계, Go를 선택한 이유와 Rust가 아닌 Go인 이유, 그리고 앞으로의 로드맵과 커뮤니티의 반응까지 종합적으로 살펴보겠습니다.

기존 타입스크립트의 한계: 성능과 유지보수 문제

현재의 타입스크립트 컴파일러(tsc)는 JavaScript(정확히는 TypeScript로 작성된 JS)로 구현되어 Node.js 환경에서 동작합니다. 이는 간편한 배포와 쉬운 확장성이라는 장점이 있었지만, 다음과 같은 근본적인 성능 문제가 있었습니다.

  • 대규모 프로젝트에서의 느린 빌드 속도
    프로젝트가 커질수록 로딩 및 타입 검사에 걸리는 시간이 급격히 증가해 개발 생산성을 저하시켰습니다.
  • 단일 스레드 동작으로 인해 멀티코어 CPU의 병렬성을 충분히 활용하지 못했습니다.
  • Node.js의 가비지 컬렉션과 JIT 컴파일 오버헤드로 인해 최적화에 제약이 있었습니다.

실제 VS Code 수준(약 150만 라인)의 프로젝트는 전체 빌드에 최대 1분 이상 걸리는 문제가 지속되어 왔습니다.

Go 언어로의 전환: 10배 빨라지는 TypeScript

이러한 문제를 근본적으로 해결하기 위해 타입스크립트 팀은 네이티브 언어로의 포팅을 결정했고, 선택된 언어는 Go였습니다. Go로 포팅하면 다음과 같은 이점이 명확히 나타납니다.

  • 컴파일 성능 대폭 향상 (최대 10배): 초기 테스트에서 VS Code 전체 빌드 시간을 77.8초에서 7.5초로 단축하여 약 10배의 성능 향상을 입증했습니다.
  • 멀티코어 활용 가능: Go의 멀티스레딩 지원 덕분에 병렬로 파싱, 바인딩, 타입 검사를 실행할 수 있게 되었습니다.
  • 메모리 효율성 향상: 네이티브 코드의 메모리 효율 개선과 공유 메모리 활용으로 메모리 사용량이 최대 50% 감소했습니다.
  • 간편한 배포 및 유지보수성 향상: Go는 정적 컴파일을 지원하여 단일 바이너리 형태로 배포할 수 있어 환경 설정 및 CI/CD가 간편해집니다. 또한, 정적 타입 덕분에 컴파일러 자체의 안정성도 높아집니다.

결과적으로 개발자들이 더욱 빠르고 안정적인 개발 경험을 얻을 수 있게 되며, IDE의 초기 로딩과 코드 편집 응답 속도가 획기적으로 빨라질 것으로 기대됩니다.

왜 Rust가 아니라 Go인가?

발표 직후 가장 큰 논쟁거리는 왜 Rust가 아니라 Go를 선택했느냐는 것이었습니다. Rust는 최근 JavaScript 도구 생태계에서 성능을 높이는 새로운 표준처럼 여겨졌기 때문입니다. Rust를 선택하지 않은 이유는 다음과 같습니다.

  • 구조적 호환성 문제: 기존 TypeScript 컴파일러(tsc)는 JS의 GC와 가변 객체 그래프를 광범위하게 활용합니다. Rust로 옮기려면 공유 가변성(shared mutability) 문제로 인해 수많은 부분을 재설계해야 했고, 이는 호환성을 깨고 버그를 초래할 위험이 컸습니다.
  • 복잡성 증가: Rust의 엄격한 메모리 관리 규칙을 준수하면서 기존 기능을 그대로 구현하려면 과도하게 unsafe 코드를 사용하는 등 Rust의 장점을 살리지 못하는 결과를 초래할 수 있었습니다.
  • 개발자 경험의 일관성: 타입스크립트 설계자 Anders Hejlsberg는 "새로운 패러다임으로 재설계하는 리스크보다는 기존의 동작 방식을 최대한 유지하는 것이 중요했다"고 밝혔습니다. Go는 JS와 유사한 가비지 컬렉터를 사용하며 메모리 관리와 코드 스타일 측면에서 기존 코드베이스와 호환성이 높았습니다.

실제 Rust 기반의 SWC 컴파일러 개발자(kdy1) 역시 과거 타입스크립트 컴파일러를 Rust로 포팅하는 시도를 했지만, 구조적 한계 때문에 중단한 사례도 있습니다.

앞으로의 로드맵과 일정

마이크로소프트는 이번 프로젝트를 TypeScript 7.0 버전에서 공식적으로 출시할 예정입니다. 구체적인 로드맵은 다음과 같습니다.

  • 2025년 중반까지 Go로 작성된 TypeScript 컴파일러의 프리뷰 버전 제공 예정
  • 2025년 말까지 타입 검사 및 언어 서비스까지 기능 완비(feature-complete) 예정
  • 이후 기존 JS 버전(TypeScript 6.x 버전)은 상당 기간 유지하면서 개발자가 점진적으로 전환하도록 지원

현재 GitHub에 Go 포팅 버전의 초기 코드가 공개되어 있어, 개발자들이 직접 테스트하고 피드백을 줄 수 있습니다.

커뮤니티 및 전문가들의 반응: 기대와 우려 사이

커뮤니티에서는 대체로 긍정적인 평가가 많습니다. 특히 현업 개발자들은 "10배 빨라진 컴파일 속도"에 큰 기대를 나타냈습니다. 하지만 Rust가 아니라 Go를 선택한 것에 대한 일부 아쉬움과 우려도 있었습니다. 특히 WebAssembly 번들 크기나 성능 측면에서 Rust보다 불리할 수 있다는 점에 대한 지적도 나왔습니다.

그럼에도 불구하고, 마이크로소프트가 공개한 포팅 이유와 기술적 설명을 접한 뒤에는 다수의 개발자가 납득하고 긍정적으로 평가했습니다. 무엇보다 "중요한 건 컴파일러의 성능 향상과 안정성이며, 결과가 좋다면 언어 선택은 부차적이다"라는 의견이 힘을 얻고 있습니다.

결론: TypeScript의 새로운 도약을 기대하며

결론적으로 마이크로소프트의 이번 선택은 TypeScript의 향후 10년을 대비한 전략적인 결정으로 평가됩니다. Go로의 포팅이 성공적으로 이루어진다면, 앞으로 더 많은 프로젝트들이 TypeScript의 강력한 타입 시스템과 함께 더욱 향상된 성능과 생산성을 경험할 수 있을 것입니다. Rust 등 다른 후보 언어를 둘러싼 초기 논쟁도 있었지만, 결과적으로 이번 포팅 결정은 실용적이고 현실적인 선택이라는 평가를 받고 있습니다.

타입스크립트의 새로운 시대가 열리고 있습니다. 마이크로소프트의 이번 결정이 실제 어떤 성과로 이어질지, 커뮤니티와 함께 기대하며 지켜볼 일입니다.


출처 및 참고자료

Read Entire Article