lsp

1 개의 포스트

github

언어 서버로 GitHub Copilot CLI에 진정한 코드 인텔리전스를 더하세요 (새 탭에서 열림)

GitHub Copilot CLI는 LSP(Language Server Protocol)를 연동하면 단순한 텍스트 검색이나 바이트코드 추출을 넘어, 코드의 타입·정의·참조를 의미론적으로 이해할 수 있다. 글에서는 이를 자동화하는 **LSP Setup 스킬**의 동작 방식과 설정 형식, 지원 언어 및 설치 절차를 소개하며, 결과적으로 더 정확하고 빠른 코드 분석이 가능해진다고 설명한다. ## 텍스트 검색 기반 코드 이해의 한계 - LSP가 없으면 Copilot CLI는 의존성 정보를 찾기 위해 다음과 같은 우회 작업을 수행한다. - Java JAR 파일 검색 및 임시 디렉터리 추출 - `.class` 파일에 대한 `grep` - Python의 `site-packages`나 TypeScript의 `node_modules` 파일 직접 탐색 - 이런 방식은 단순한 패턴 검색에 의존하므로 다음 정보를 정확히 처리하기 어렵다. - 제네릭 타입 - 메서드 오버로드 - 전이 의존성의 타입 - 컴파일된 바이트코드 내부의 의미 구조 - 반면 LSP의 `textDocument/definition` 요청은 심볼의 정확한 소스 위치, 해석된 타입, 메서드 시그니처를 반환한다. ## LSP Setup 스킬의 7단계 동작 ### 1. 언어 선택 - `ask_user`를 사용해 사용자가 LSP를 설정할 프로그래밍 언어를 선택한다. - 선택한 언어가 이후 설치 명령과 설정 생성을 결정한다. ### 2. 운영체제 확인 - macOS와 Linux에서는 `uname -s`를 사용한다. - Windows에서는 `$env:OS` 또는 `%OS%`를 확인한다. - 운영체제에 따라 LSP 서버 설치 방법을 다르게 적용한다. - macOS Java: `brew install jdtls` - Linux Java: Eclipse 등에서 다운로드 ### 3. LSP 서버 조회 - `references/lsp-servers.md`에 14개 언어의 정보가 미리 정리되어 있다. - 각 언어별로 다음 내용을 제공한다. - 운영체제별 설치 명령 - 실행 파일 이름 - 바로 사용할 수 있는 설정 예시 ### 4. 설정 범위 선택 - 사용자 전역 설정: - `~/.copilot/lsp-config.json` - 모든 저장소에 적용 - 저장소별 설정: - 저장소 루트의 `lsp.json` - 또는 `.github/lsp.json` - 특정 프로젝트에만 적용 - 두 설정이 모두 존재하면 저장소별 설정이 우선한다. ### 5. LSP 서버 설치 - 언어에 맞는 설치 명령을 자동으로 실행한다. - 예시는 다음과 같다. ```bash npm install -g typescript typescript-language-server brew install jdtls rustup component add rust-analyzer ``` ### 6. 설정 파일 생성 및 병합 - 설정은 `lspServers` 객체 아래에 서버별 항목을 둔다. ```json { "lspServers": { "java": { "command": "jdtls", "args": [], "fileExtensions": { ".java": "java" } } } } ``` - 주요 규칙은 다음과 같다. - `command`는 `$PATH`에 있거나 절대 경로여야 한다. - 일반적으로 표준 입출력 통신을 위해 `--stdio`를 `args`에 지정한다. - `fileExtensions`는 점으로 시작하는 확장자와 VS Code 언어 식별자를 연결한다. - 기존 설정은 삭제하지 않고 새로운 항목을 병합한다. - `jdtls`처럼 표준 입출력을 내부적으로 처리하는 서버는 별도 인자가 필요하지 않을 수 있다. ### 7. 설치 및 설정 검증 - `which <binary>` 또는 Windows의 `where.exe`로 실행 파일이 접근 가능한지 확인한다. - 설정 파일이 올바른 JSON인지 검증한다. ## 지원 언어와 확장 방식 - 스킬은 현재 14개 언어에 대한 사전 정의 서버 정보를 제공한다. - 미리 매핑되지 않은 언어를 만나면 적절한 LSP 서버를 검색하고 수동 설정 과정을 안내한다. - 따라서 지원 목록에 없는 언어도 서버만 확보하면 직접 추가할 수 있다. ## 설정 후 가능한 코드 인텔리전스 LSP 연동 후 Copilot CLI는 다음 작업을 수행할 수 있다. - 의존성 전체에서 타입을 정확히 해석 - 저장소에 소스 코드가 없는 외부 라이브러리의 정의로 이동 - 프로젝트 전반에서 심볼의 모든 참조 검색 - 함수·클래스·타입의 hover 문서 확인 - 메서드 시그니처와 타입 관계를 기반으로 코드 수정 및 분석 그 결과 불필요한 JAR 압축 해제나 `node_modules` 검색이 줄고, 잘못 해석한 API에 기반한 코드 생성도 감소한다. ## 설치 및 사용 절차 1. Awesome Copilot의 LSP Setup 스킬 페이지에서 ZIP 파일을 다운로드한다. 2. 다음 명령으로 `~/.copilot/skills/`에 압축을 푼다. ```bash unzip lsp-setup.zip -d ~/.copilot/skills/ ``` 3. 실행 중인 Copilot CLI를 `/exit`로 종료한 뒤 다시 실행한다. 4. “set up LSP for Java” 또는 “enable code intelligence for Python”처럼 요청한다. 5. 설정이 끝나면 Copilot CLI를 다시 시작한다. 6. `/lsp`로 서버 상태를 확인하고, 의존성 심볼의 정의 이동을 테스트한다. 프로젝트 규모가 크거나 외부 라이브러리 사용이 많은 경우에는 LSP Setup 스킬을 적용하는 것이 좋다. 특히 Java, TypeScript, Python처럼 타입과 의존성 관계가 복잡한 언어에서는 텍스트 검색보다 정확한 코드 분석과 안정적인 결과를 기대할 수 있다.