본 문서에서는 Visual Studio Code에서 Ruby 디버깅 환경을 구축하는 세 가지 핵심 요소를 자세히 설명합니다.
1. Shopify 언어 서버 프로토콜 (LSP) 설정
Shopify 테마 또는 앱 개발 시 Shopify LSP는 구문 강조, 자동 완성, 오류 감지, 정의 이동, 호버 문서와 같은 기능을 제공하여 개발 경험을 크게 향상시킵니다.
-
설치: Shopify CLI(
npm install -g @shopify/cli @shopify/theme)를 설치하고, VS Code 확장 마켓플레이스에서 “Shopify Liquid” 및 “Ruby LSP” 확장을 설치합니다. -
워크스페이스 설정: 프로젝트 루트에
.vscode/settings.json파일을 생성하여 Ruby LSP 포매터, 린팅, Ruby 버전 관리자 등을 설정합니다. Liquid 템플릿에 대한 지능형 코드 완성 및 오류 검사 기능을 활용할 수 있습니다.
2. debug gem의 rdbg 사용
Ruby 3.1+부터는 debug gem이 기본 디버거로 제공되어 기존 byebug보다 강력한 디버깅 경험을 제공합니다.
-
설치: Gemfile의
:development,:test그룹에gem 'debug'를 추가하고bundle install을 실행합니다. -
기본 사용법: 코드 내부에
debugger키워드를 삽입하거나,rdbg my_script.rb,rdbg rails server,rdbg rails console명령어로 애플리케이션을 시작하여 디버깅 세션을 시작할 수 있습니다. -
VS Code 통합: 프로젝트 루트에
.vscode/launch.json파일을 생성하여 Rails 서버, 콘솔, RSpec 디버깅을 위한 실행 구성을 정의합니다. 이를 통해 VS Code의 디버깅 인터페이스를 활용할 수 있습니다. -
디버깅 명령:
help,next,step,continue,break,list,print,pp,exit등 다양한 명령어를 사용하여 디버깅 세션을 제어할 수 있습니다.
3. RSpec 및 테스트 프레임워크 디버거 설정
테스트 주도 개발(TDD) 및 실패하는 테스트 문제 해결에 있어 테스트 스위트 디버깅은 매우 중요합니다.
-
RSpec 구성: Gemfile에
rspec-rails와debuggem이 포함되어 있는지 확인합니다. -
개별 테스트 디버깅: 테스트 파일 내부에
debugger를 삽입하고bundle exec rspec명령어로 특정 테스트를 실행하여 디버깅합니다. -
VS Code 활용:
launch.json에 정의된 “Debug RSpec” 구성을 사용하여 VS Code에서 직접 RSpec 테스트에 중단점을 설정하고 디버깅할 수 있습니다. -
고급 RSpec 디버깅: 전체 RSpec 스위트 또는 특정 태그를 가진 테스트 그룹을 디버깅하기 위한 추가
launch.json구성 예시가 제공됩니다. -
다른 테스트 프레임워크: Minitest 및 Cucumber와 같은 다른 테스트 프레임워크도 유사하게
debugger삽입과launch.json구성을 통해 VS Code에서 디버깅할 수 있습니다.
원격 디버깅
debug gem은 컨테이너나 원격 서버에서 실행되는 애플리케이션을 디버깅할 때 유용한 원격 디버깅을 지원합니다. rdbg --open --port=12345 --host=0.0.0.0 rails server로 애플리케이션을 시작하고, rdbg --attach=localhost:12345로 연결합니다.
팁 및 모범 사례
조건부 중단점, 로그 포인트, 예외 중단점 등 VS Code의 고급 디버깅 기능을 활용하여 효율성을 높일 수 있습니다. 디버거는 오버헤드를 발생시키므로 프로덕션 환경에서는 중단점을 제거하거나 비활성화하고, 로깅 기반 접근 방식이나 rbtrace와 같은 도구를 고려해야 합니다.
일반적인 문제 해결
-
디버거 미시작:
debuggem 설치 여부, Ruby 3.1+ 버전 사용 여부, VS Code Ruby 확장 최신 버전 여부를 확인합니다. -
중단점 미적중: 디버그 모드에서 실행 중인지, 해당 파일이 실제로 실행되는지,
launch구성이 올바른지 확인합니다. -
느린 디버깅 성능: 활성 중단점 수를 줄이고, 관심 없는 코드 섹션은
continue명령으로 건너뛰어 성능을 개선합니다.