언어 서버 프로토콜

1 개요[ | ]

Language Server Protocol (LSP)
언어 서버 프로토콜
  • IDE와 프로그래밍 언어별 기능을 제공하는 서버 사이에 사용하는 개방형 JSON-RPC 기반 프로토콜
  • 목적: IDE와 독립적으로 프로그래밍 언어 지원을 구현·배포하는 것
  • 본래 Microsoft Visual Studio Code 용으로 개발되었는데 현재는 공개 표준이다.
  • 스펙은 GitHub에서 호스팅 및 개발된다.[1]

2 배경[ | ]

  • 최신 IDE는 개발자에게 코드 완성 , 리팩토링 , 기호 정의 탐색 , 구문 강조 표시, 오류 및 경고 표시와 같은 기능을 제공한다 .
  • 메소드 이름을 바꾸고 싶은 경우를 생각해보자. 각각의 소스코드 파일들을 수작업으로 편집하여 새 이름으로 변경하는 대신, IDE의 리팩토링 기능을 사용하여 자동으로 수행할 수 있다. 이러한 기능을 지원하려면 IDE가 프로그램 소스와 프로그래밍 언어를 잘 이해해야 한다. 이러한 이해가 없는 단순 검색·치환 도구는 오류를 발생시킬 수 있다.
  • 예를 들어, read라는 메소드 이름을 변경할 때, 부분일치하는 변수 readyState나, 주석에 포함된 already라는 단어를 교체해서는 안된다. 또한 지역변수 이름을 바꿀 때는 같은 이름일지라도 다른 범위에 있는 변수를 변경하면 안된다.
  • 일반적으로 기존 컴파일러나 인터프리터는 이러한 언어 서비스를 제공하기 어렵다. 그 목표가 소스코드를 오브젝트 코드로 변환하거나 코드를 실행하는 것이기 때문이다.
  • 한편 언어 서비스는 완전히 작성되지 않은 소스코드도 처리할 수 있어야 한다. 편집을 하는 중에는 명령문, 프로시저 등의 입력을 완료하지 않은 경우가 있기 때문이다. 소스코드의 변화에 따라 프로그램의 의미도 바뀌는데, 사용자에게 즉각적인 피드백을 제공하려면, 편집기가 수정된 구문과 의미를 매우 빠르게 평가할 수 있어야 한다.
  • Visual Studio Code 개발을 위한 언어 서버 프로토콜의 설계 및 구현 이전에는 대부분의 언어 서비스가 IDE 또는 편집기에 결합되어 있었다. LSP가 없는 경우, 언어 서비스는 일반적으로 도구별 확장 API를 사용하여 구현되었다. 다른 편집기에 동일한 언어 서비스를 제공하려면 그 편집기의 확장 인터페이스에 맞게 작동하도록 기존 코드를 조정하는 노력이 필요했다.
  • LSP를 사용하면 편집기에서 언어 서비스를 분리할 수 있으므로 범용 언어 서버로 활용할 수 있다. 사용자는 언어 서버를 사용하여 다양한 언어에 대한 정교한 지원을 이어갈 수 있다. 편집기 벤더의 부담도 줄어든다.
  • LSP의 개념은 프로그래밍 언어에만 국한되지 않고, 스펙 또는 DSL(도메인 특정 언어)과 같은 모든 종류의 텍스트 기반 언어에 적용할 수 있다

3 기술 개요[ | ]

  • 여러 소스코드 파일을 편집할 때 편집기(텍스트 편집기 또는 IDE)는 언어 서버가 제공하는 언어 서비스를 사용하는 클라이언트 역할을 한다. 언어 서비스의 기능에 리팩토링, 코드 완성 등이 있다.
  • 클라이언트는 사용자가 무엇을 하고 있는지(예: 파일을 열거나 특정 위치에 문자 삽입)를 서버에 알린다. 클라이언트는 텍스트 문서에서 지정된 범위의 형식지정(formatting) 언어 서비스를 수행하도록 서버에 요청할 수 있다. 그러한 요형에는 형식지정된 텍스트를 클라이언트에 되돌려주거나 오류내용이 응답될 수 있다.
  • LSP는 클라이언트와 언어 서버 간에 교환될 메시지를 정의한다. HTTP와 유사한, 헤더가 있는 JSON-RPC이다. 메시지는 서버나 클라이언트에서 시작될 수 있다
  • 이 프로토콜은 클라이언트와 서버 간에 요청, 응답, 알림이 전송되는 방식을 규정하지는 않는다. 예를 들어, 클라이언트와 서버는 JSON 문자열을 교환하는 동일 프로세스 내의 컴포넌트일 수도 있고, 네트워크 소켓으로 통신하는 동일 시스템(또는 다른 시스템)에 있는 서로 다른 프로세스일 수도 있다.

4 같이 보기[ | ]

5 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}