GitHub Copilot CLI에 언어 서버를 적용해 실제 코드 인텔리전스 제공
출처: GitHub Blog
GitHub Copilot CLI가 JAR 파일을 임시 디렉터리로 추출하고, .class 파일을 grep한 뒤, 원시 바이트코드에서 API 시그니처를 조합하는 모습을 본 적 있나요? 에이전트는 영리하지만, 언어 서버가 없으면 이것이 최선입니다.
Language Server Protocol (LSP)은 VS Code와 같은 편집기에서 “정의로 이동”, “참조 찾기”, “타입 해석” 등을 가능하게 하는 표준입니다. 터미널에서도 똑같이 작동합니다. LSP Setup 스킬은 Copilot CLI용 LSP 서버의 설치와 구성을 자동화해, 에이전트가 텍스트 검색 휴리스틱에 의존하지 않고 코드에 대한 정확하고 구조화된 답변을 제공하도록 합니다.
이 글에서는 스킬이 내부적으로 어떻게 동작하는지, 생성되는 구성 형식을 살펴보고, 현재 지원되는 14개 언어 중 원하는 언어에 대해 설정하는 방법을 안내합니다.
문제점: 휴리스틱 기반 코드 이해
LSP 서버가 없을 경우, GitHub Copilot CLI의 에이전트는 텍스트 검색과 바이너리 추출을 통해 API 정보를 역공학합니다. 예를 들어 Java 프로젝트에서는 다음과 같은 작업을 할 수 있습니다.
# 의존성 JAR 찾기
find ~/.m2/repository -name "*httpclient*.jar"
# 임시 디렉터리로 추출
mkdir /tmp/httpclient && cd /tmp/httpclient
jar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar
# 추출된 클래스 파일에서 메서드 검색
grep -r "execute" --include="*.class" .
Python에서는 site-packages 안의 파일을 cat하고, TypeScript에서는 node_modules를 탐색합니다. 이러한 텍스트 기반 접근 방식은 간단한 경우에 동작하지만, 원시 텍스트에 대한 패턴 매칭에 불과해 실제 의미론적 분석을 수행하지 않으므로 제네릭, 오버로드, 전이 타입 등을 놓치고, 컴파일된 바이트코드를 전혀 볼 수 없습니다. 바로 이런 점이 언어 서버가 메우는 격차입니다.
LSP 서버는 구조적으로 이를 해결합니다. 에이전트가 textDocument/definition 요청을 보내면, 언어 서버는 정확한 소스 위치, 완전히 해석된 타입, 시그니처를 반환합니다.
LSP Setup 스킬 작동 방식
스킬이 트리거되면 일곱 단계 워크플로우를 실행합니다.
1. 언어 선택
에이전트는 ask_user와 선택지를 이용해 사용자가 LSP 지원을 원하는 언어를 묻습니다. 이는 이후 모든 단계의 기준이 됩니다.
2. 운영 체제 감지
에이전트는 uname -s(또는 Windows에서는 $env:OS / %OS%)를 실행해 대상 플랫폼을 판단합니다. 설치 명령은 운영 체제마다 다릅니다. 예를 들어 macOS에서는 brew install jdtls를, Linux에서는 eclipse.org에서 다운로드하는 식입니다.
3. LSP 서버 조회
스킬에는 14개 언어에 대한 정제된 데이터가 담긴 참조 파일(references/lsp-servers.md)이 포함되어 있습니다. 여기에는 운영 체제별 설치 명령, 바이너리 이름, 바로 사용할 수 있는 구성 스니펫이 들어 있습니다. 에이전트는 이 파일을 읽고 일치하는 항목을 선택합니다.
4. 구성 범위
에이전트는 구성 파일이 다음 중 어느 수준이어야 하는지 묻습니다.
- 사용자 수준:
~/.copilot/lsp-config.json— 모든 저장소에 적용 - 저장소 수준: 저장소 루트에
lsp.json혹은.github/lsp.json— 특정 프로젝트에만 적용
두 파일이 모두 존재할 경우 저장소 수준 구성이 우선합니다.
5. 설치
에이전트는 해당 운영 체제에 맞는 설치 명령을 실행합니다. 예시:
# 모든 OS에서 TypeScript
npm install -g typescript typescript-language-server
# macOS에서 Java
brew install jdtls
# 모든 OS에서 Rust
rustup component add rust-analyzer
6. 구성
에이전트는 선택한 구성 파일에 항목을 작성하거나 병합합니다. 형식은 lspServers 객체이며, 각 키는 서버 식별자입니다.
{
"lspServers": {
"java": {
"command": "jdtls",
"args": [],
"fileExtensions": {
".java": "java"
}
}
}
}
스킬이 강제하는 주요 규칙:
command는$PATH에 있거나 절대 경로여야 함args는 보통"--stdio"를 포함해 표준 I/O 전송을 사용 (예:jdtls는 내부적으로 처리)fileExtensions는 각 확장자(앞에 점 포함)를 언어 식별자와 매핑- 기존 구성 항목은 보존 — 에이전트는 병합하고 절대 덮어쓰지 않음
7. 검증
에이전트는 which(Windows에서는 where.exe)를 실행해 서버가 접근 가능한지 확인하고, 구성 파일이 올바른 JSON 형식인지 검증합니다.
지원 언어
스킬은 여러 프로그래밍 언어에 대해 미리 정의된 언어 서버 집합을 제공합니다. 에이전트가 아직 매핑되지 않은 언어를 만나면 적절한 서버를 검색하고 수동 구성 과정을 안내합니다.
설정 후 변화
LSP 서버가 구성되면 CLI 에이전트는 다음을 수행할 수 있습니다.
- 의존성 전체에 걸친 타입 해석 — JAR 파일이나
node_modules를 grep할 필요 없음 - 정의로 이동 — 소스가 저장소에 없더라도 서드파티 라이브러리의 정의로 바로 이동
- 전체 참조 찾기 — 프로젝트 전체에서 심볼을 찾아냄
- 호버 문서 읽기 — 함수, 클래스, 타입에 대한 문서를 즉시 확인
즉, 에이전트가 도구 호출에 소요되는 시간을 줄이고, 첫 시도부터 더 정확한 코드를 생성합니다. 이제 에이전트가 JAR 파일을 디컴파일하거나 node_modules를 grep해 답을 찾는 데 시간을 낭비하지 않아도 되고, 잘못된 시그니처를 기반으로 한 오류도 감소합니다. 에이전트는 편집기에서 “정의로 이동”을 할 때와 동일한 구조화된 이해를 바탕으로 코드를 분석하므로, 더 크고 복잡한 작업을 맡겨도 결과를 신뢰할 수 있습니다.
시작하기
-
스킬 다운로드: Awesome Copilot LSP Setup 스킬 페이지에서 Download 버튼을 눌러 ZIP 파일을 받습니다.
-
ZIP 압축 해제: 다음 명령으로
~/.copilot/skills/에 압축을 풉니다.
unzip lsp-setup.zip -d ~/.copilot/skills/
-
GitHub Copilot CLI 재시작: 이미 실행 중이라면 먼저
/exit를 입력하고, 그 뒤copilot을 다시 실행해 새 스킬을 로드합니다. -
에이전트에게 요청: 예를 들어 “Java용 LSP 설정해줘” 혹은 “Python 코드 인텔리전스 활성화해줘” 라고 물어봅니다.
-
검증: 스킬이 LSP 서버를 설치·구성한 뒤, 다시 한 번 Copilot CLI를 재시작(
/exit후 재실행)하고/lsp명령으로 서버 상태를 확인한 뒤, 의존성 중 하나의 심볼에 대해 정의로 이동을 시도해 봅니다.
이 스킬은 Awesome Copilot 프로젝트의 일부이며, 오픈 소스이므로 기여와 피드백을 환영합니다!
작성자
Principal Product Manager
관련 포스트
- Take your local GitHub sessions anywhere
VS Code나 CLI에서 작업을 시작하고, 휴대폰으로 마무리하세요. GitHub Copilot 세션에 대한 원격 제어가 이제 github.com과 GitHub Mobile에서 일반적으로 제공됩니다.
GitHub에서 더 알아보기
Docs
GitHub를 마스터하는 데 필요한 모든 것이 한 곳에 있습니다.
[Docs 바로가기]
GitHub
누구나 어디서든 무언가를 만들 수 있는 GitHub에서 다음을 구축하세요.
[시작하기]
Customer stories
GitHub와 함께 만드는 기업과 엔지니어링 팀을 만나보세요.
[더 알아보기]
The GitHub Podcast