포스트

Neovim DAP — LSP의 형제, 디버깅용 프로토콜

DAP(Debug Adapter Protocol)는 LSP와 같은 뿌리(VS Code)에서 나온 디버깅용 표준이다. nvim-dap 플러그인 스택, 언어별 어댑터(debugpy·delve·codelldb), 그리고 LSP와 결정적으로 다른 '세션 중에만 뜨는' 생명주기를 정리한다.

Neovim DAP — LSP의 형제, 디버깅용 프로토콜

Neovim에서 디버깅을 붙이려면 DAP를 만난다. LSP를 이해했다면 DAP는 그 형제라 금방 잡힌다 — 둘 다 VS Code가 만든 표준이고, 구조가 판박이다.

DAP는 LSP의 디버깅 버전

  • LSP(Language Server Protocol) — 코드 편집·분석용 표준. 자동완성, 정의 이동, 에러 표시.
  • DAP(Debug Adapter Protocol)디버깅용 표준. 브레이크포인트, 스텝 실행, 변수·콜스택 확인.

둘 다 Microsoft가 VS Code를 만들며 설계한 프로토콜이고, 에디터와 언어별 도구(분석기/디버거)를 표준 규약으로 잇는다는 아이디어가 같다. 그래서 서버·어댑터는 에디터 중립이라 VS Code와 Neovim이 같은 걸 공유한다. Go를 예로 들면 편집엔 gopls(LSP), 디버깅엔 delve(DAP)가 붙고, 이건 VS Code에서도 똑같다.

nvim-dap 플러그인 스택

Neovim에서 DAP 클라이언트 역할은 nvim-dap이 한다. 주변 플러그인이 UI·편의를 얹는다.

플러그인역할
nvim-dap핵심 DAP 클라이언트
nvim-dap-ui변수·콜스택·스코프·watch 패널 UI
nvim-dap-virtual-text코드 옆에 변수 값 인라인 표시
mason-nvim-dap디버그 어댑터 설치 관리(mason 연동)

언어별로 어댑터를 따로 설정한다 — Python은 debugpy, Go는 delve, C/C++/Rust는 codelldb. 이 어댑터 설치를 mason-nvim-dapmason에 위임하는 구조는 LSP에서 mason-lspconfig가 하던 것과 정확히 같다.

설치(mason) / 설정(lspconfig·nvim-dap) / 엔진(vim.lsp)으로 나뉘는 3계층 구조는 Neovim LSP 3계층 — mason·lspconfig·vim.lsp에서 다뤘다. DAP도 같은 골격에 nvim-dap이 클라이언트로 들어간다.

LSP와 결정적으로 다른 점 — 생명주기

LSP 서버와 DAP 어댑터 둘 다 언어별 별도 프로세스지만, 뜨는 시점이 다르다.

 뜨는 시점상주 여부
LSP (gopls 등)파일을 열면 자동편집 내내 상시 상주(프로젝트 단위)
DAP (delve 등)디버그 세션 시작 시세션 중에만 일시적

Go 프로젝트를 편집만 하는 중이면 gopls만 떠 있고, 디버깅을 걸면(dap.continue()/F5) 그제야 delve가 추가로 뜬다. 세션이 끝나면 어댑터는 종료된다. LSP는 “켜두고 계속 분석”, DAP는 “필요할 때만 켰다 끈다”인 셈이다.

정리

  • DAP는 LSP의 디버깅용 형제 — 둘 다 VS Code 표준, 서버·어댑터는 에디터 중립.
  • Neovim 스택: nvim-dap(클라이언트) + -ui/-virtual-text(UI) + mason-nvim-dap(설치). LSP의 mason 3계층과 같은 골격.
  • 언어별 어댑터: debugpy·delve·codelldb.
  • LSP는 편집 중 상시, DAP는 디버그 세션 중에만 뜬다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.