Type Server Protocol(TSP) 개요

Type Server Protocol이란 무엇인가?

Type Server Protocol(TSP)은 타입 서버와 클라이언트(예: IDE) 간의 통신을 원활하게 하기 위해 설계된 특수 JSON-RPC 프로토콜입니다. 주로 호버 텍스트나 진단과 같은 사람이 읽을 수 있는 편집기 기능을 위한 Language Server Protocol(LSP)과 달리, TSP는 구조화된 기계 판독 가능한 타입 분석 데이터를 제공합니다. 이를 통해 도구들은 Markdown 문자열의 취약한 파싱에 의존하지 않고도 계산된 타입, 선언된 타입, 예상 타입과 같은 타입 정보를 프로그래밍 방식으로 소비할 수 있습니다.

TSP가 존재하는 이유

LSP와 같은 기존 프로토콜은 심층적인 타입 시스템 통합보다는 편집기 상호 작용에 최적화되어 있습니다. LSP의 호버 정보는 일반적으로 Markdown으로 전달되는데, 이는 화면 표시에는 뛰어나지만 자동화된 리팩토링 도구, 린터 또는 AI 에이전트가 안정적으로 파싱하기에는 어렵습니다. TSP는 클래스, 함수, 유니온, 모듈을 포함한 실제 타입 그래프를 나타내는 구조화된 태그 타입 객체를 반환함으로써 이 문제를 해결합니다. Microsoft는 이 데이터를 표준화하여 개발자가 다양한 IDE에서 일관된 동작을 유지하면서 서로 다른 타입 체커(예: Pylance 또는 Pyrefly)를 교체할 수 있도록 하는 것을 목표로 합니다.

핵심 아키텍처 및 기능

TSP는 LSP의 동반자로서 기능하며, 종종 동일한 연결을 통해 실행됩니다. 성능과 상태를 관리하기 위해 다음과 같은 몇 가지 핵심 개념을 도입합니다:

  • 스냅샷 기반 분석: 스냅샷은 작업 공간의 특정 시점 보기를 나타내는 음수가 아닌 정수입니다. 타입 분석은 계산 비용이 많이 들기 때문에 결과는 특정 스냅샷에 바인딩됩니다. 파일이 변경되면 서버는 스냅샷을 진행하며, 클라이언트는 업데이트된 정보를 요청해야 합니다.
  • 다중 연결 모드: 대량의 타입 쿼리가 메인 LSP 연결을 차단하는 것을 방지하기 위해 TSP는 선택적인 보조 IPC 채널을 지원합니다. 이를 통해 메인 연결이 변경 가능한 작업 공간 상태 및 수명 주기 이벤트를 처리하는 동안 동시 읽기 전용 타입 쿼리가 가능합니다.
  • 기능 핸드셰이크: 클라이언트와 서버는 표준 LSP 초기화 과정에서 TSP 기능 지원을 협상하여, 서버가 프로토콜을 지원하지 않는 경우에도 하위 호환성과 원활한 성능 저하를 보장합니다.

프로토콜 표면

TSP는 의도적으로 가볍게 설계되었으며, Python 코드에 대한 깊은 통찰력을 제공하는 소규모 쿼리 세트에 집중합니다:

  • typeServer/getComputedType: 코드 흐름에서 추론된 타입(예: 좁히기 후)을 반환합니다.
  • typeServer/getDeclaredType: 소스 코드에 명시적으로 정의된 타입을 반환합니다.
  • typeServer/getExpectedType: 주변 컨텍스트에서 요구하는 타입을 반환합니다.
  • typeServer/resolveImport: 모듈 가져오기에 대한 해결 데이터를 제공합니다.

커뮤니티 관점

TSP의 도입은 Python 도구 생태계의 파편화와 관련하여 상당한 논의를 불러일으켰습니다. 일부 개발자들은 구조화된 데이터로의 전환을 환영하는 반면, 다른 이들은 Microsoft 주도의 프로토콜 확산에 대해 우려를 제기했습니다.

"이 프로토콜의 진정한 가치는 문자열 기반 정보에서 구조화된 데이터로 이동하는 데 있습니다. LSP 호버 정보는 인간을 위한 것입니다. 도구가 타입 정보를 사용하려면 형식을 추측할 필요가 없어야 합니다. 핵심 과제는 전체 타입 그래프를 계산하는 비용과 낮은 지연 시간의 IDE 응답성 사이의 균형을 맞추는 것입니다." — @coindef

비평가들은 이 프로토콜이 현재 Python의 타입 시스템에 매우 특화되어 있어, 틈새 도구로 남을지 아니면 더 넓은 표준으로 발전할지에 대한 의문을 제기했습니다. 또한 basedpyright와 같은 대체 Python 도구의 일부 관리자들은 별도의 프로토콜이 필요한지에 대해 회의적인 입장을 표명했으며, Astral(Ruff 제작자)과 같은 팀은 상호 운용성을 보장하기 위해 이를 지원할 의사가 있음을 밝혔습니다.

Sources

관련

  • 프로젝트
  • 프로젝트
  • Dispatch
  • 프로젝트
  • 프로젝트