| [Glossary] LSP 완벽 정리 | Language Server Protocol을 쉽게 이해하는 법 |
한 줄 요약: LSP(Language Server Protocol)란, IDE(코드 에디터)와 언어별 분석 서버 사이의 통신을 표준화해 어떤 에디터에서도 동일한 코드 인텔리전스(자동완성, 오류 검사, 리팩토링 등)를 사용할 수 있게 하는 오픈 프로토콜이다.
1. LSP란 무엇인가?
LSP 이전에는 각 IDE가 각 언어를 위한 지원을 직접 구현해야 했습니다. Python 지원을 원하면 VS Code 팀이 만들고, JetBrains 팀이 만들고, Vim 팀이 만들어야 했습니다. 10개 에디터 × 20개 언어 = 200개 통합이 필요했습니다.
LSP는 이 문제를 M×N → M+N으로 줄였습니다. 각 언어는 Language Server 하나만 만들면 되고, 각 에디터는 LSP 클라이언트 하나만 구현하면 됩니다.
Microsoft가 VS Code 개발 중 2016년 제안했고, 현재 거의 모든 주요 에디터와 언어가 지원합니다.
LSP가 MCP에 미친 영향: Anthropic의 MCP는 LSP의 철학을 AI 도구에 적용한 것입니다. “에디터와 언어 서버”의 관계를 “AI 모델과 외부 도구”의 관계로 확장했습니다.
2. 핵심 개념 이해하기
LSP 아키텍처
┌─────────────────────────────────────┐
│ IDE/에디터 (LSP 클라이언트) │
│ VS Code, Vim, Neovim, Emacs... │
│ │
│ • 자동완성 요청 │
│ • 오류 표시 │
│ • 정의 이동 │
└──────────────────┬──────────────────┘
│ JSON-RPC 2.0 (stdio/TCP)
↓
┌─────────────────────────────────────┐
│ Language Server (LSP 서버) │
│ Pyright(Python), rust-analyzer... │
│ │
│ • 소스 코드 분석 │
│ • 타입 추론 │
│ • 심볼 검색 │
└─────────────────────────────────────┘
LSP의 핵심 기능(Capabilities)
| 기능 | LSP 메서드 | 설명 |
|---|---|---|
| 자동완성 | textDocument/completion |
코드 입력 중 제안 |
| 정의 이동 | textDocument/definition |
변수/함수 선언으로 이동 |
| 오류 진단 | textDocument/publishDiagnostics |
실시간 오류 표시 |
| 리팩토링 | textDocument/rename |
전체 프로젝트 이름 변경 |
| 포맷팅 | textDocument/formatting |
코드 자동 정렬 |
| 심볼 검색 | workspace/symbol |
프로젝트 전체 심볼 검색 |
LSP 통신 예시
// 자동완성 요청 (에디터 → Language Server)
{
"jsonrpc": "2.0",
"id": 1,
"method": "textDocument/completion",
"params": {
"textDocument": {"uri": "file:///project/main.py"},
"position": {"line": 10, "character": 5}
}
}
// 자동완성 응답 (Language Server → 에디터)
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"items": [
{"label": "print", "kind": 3, "detail": "Built-in function"},
{"label": "pandas", "kind": 9, "detail": "Module"},
{"label": "path", "kind": 6, "detail": "from os import path"}
]
}
}
3. 실무 적용 예시
Python LSP 서버를 간단하게 구현하는 예시입니다 (pygls 라이브러리 활용).
from pygls.server import LanguageServer
from lsprotocol.types import (
TEXT_DOCUMENT_COMPLETION,
TEXT_DOCUMENT_DID_OPEN,
CompletionItem,
CompletionList,
CompletionParams,
DidOpenTextDocumentParams,
)
server = LanguageServer("my-language-server", "v0.1")
# 파일이 열릴 때
@server.feature(TEXT_DOCUMENT_DID_OPEN)
def did_open(ls: LanguageServer, params: DidOpenTextDocumentParams):
ls.show_message(f"파일 열림: {params.text_document.uri}")
# 자동완성 요청 처리
@server.feature(TEXT_DOCUMENT_COMPLETION)
def completions(params: CompletionParams) -> CompletionList:
# 커스텀 키워드 자동완성
items = [
CompletionItem(label="agent"),
CompletionItem(label="orchestrator"),
CompletionItem(label="tool_calling"),
CompletionItem(label="context_window"),
]
return CompletionList(is_incomplete=False, items=items)
if __name__ == "__main__":
server.start_io() # stdio 방식으로 실행
VS Code 플러그인에서 연결:
{
"contributes": {
"languages": [{"id": "myLang", "extensions": [".ml"]}],
"configuration": {
"type": "stdio",
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
4. LSP vs 유사 개념 비교
| 구분 | LSP | MCP | DAP (Debug Adapter Protocol) |
|---|---|---|---|
| 목적 | 코드 인텔리전스 | AI 도구 연결 | 디버거 표준화 |
| 영감 | 원조 | LSP에서 영감 | LSP에서 영감 |
| 통신 | JSON-RPC 2.0 | JSON-RPC 2.0 | JSON-RPC 2.0 |
| 클라이언트 | IDE/에디터 | AI 모델/호스트 | IDE 디버거 UI |
| 서버 | Language Server | MCP 서버 | Debug Adapter |
| 표준화 수준 | ✅ 매우 성숙 | ✅ 성장 중 | ✅ 성숙 |
5. 마치며
LSP는 “한 번 만들어 어디서나 사용” 철학을 IDE 생태계에 실현했고, MCP는 이 철학을 AI 생태계로 확장했습니다. LSP를 이해하면 MCP 설계 원칙을 더 깊이 이해할 수 있습니다. 에디터 플러그인 개발이나 AI 도구 통합에 관심 있다면 LSP 명세를 직접 읽어보는 것을 강력히 권장합니다.
참고 자료
- LSP 공식 사이트 — Microsoft의 LSP 공식 사양 및 구현 가이드
- pygls 라이브러리 — Python LSP 서버 구현 라이브러리
함께 읽으면 좋은 용어
이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.
댓글 남기기