Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Byebug, Rails, Pow를 활용한 원격 디버깅 완벽 가이드

아직 Byebug를 사용해 보지 않으셨다면 지금 바로 확인해 보시길 권합니다. Ruby 2.x 환경에서 사용할 수 있는 훌륭한 디버거입니다. 개발자들의 설명을 인용하면 다음과 같습니다.

Byebug는 Ruby 2를 위한 사용하기 쉽고 기능이 풍부한 디버거입니다. 실행 제어에는 새로운 TracePoint API를, 호출 스택 탐색에는 Debug Inspector API를 사용하기 때문에 내부 코어 소스에 의존하지 않습니다. C 확장으로 개발되어 속도가 빠르고, 전체 테스트 스위트를 갖추고 있어 신뢰할 수 있습니다.

기본 설정은 매우 간단합니다. gem을 설치하기만 하면 됩니다. 코드 어디에서든 byebug 메서드를 호출하면 해당 지점에서 실행이 멈추고 디버그 콘솔로 진입하게 됩니다. 원한다면 pry와 함께 사용하도록 설정할 수도 있습니다.

예를 들어 다음과 같이 디버거를 호출할 수 있습니다.

require 'byebug'

def my_method
  a = 1
  byebug
end

my_method()

이 파일을 실행하면 디버거로 진입하게 됩니다.

Byebug, Rails, Pow를 활용한 원격 디버깅 완벽 가이드 디버거가 작동하면 대화형 셸(interactive shell)로 진입합니다.

Pow의 문제점

앱을 명령줄에서 직접 실행할 수 있다면 위 방식으로 충분합니다. 하지만 Rails 앱을 로컬에서 Pow로 서빙하며 개발하고 있다면 어떨까요?

Pow는 대부분의 앱 서버처럼 백그라운드에서 실행됩니다. 따라서 실행을 멈추고 디버거를 띄우더라도 그것과 상호작용할 방법이 없습니다!

다행히도 Byebug는 원격 디버깅을 위한 메커니즘을 제공합니다.

원격 디버깅이 익숙하지 않은 분들을 위해 간단히 설명하면, byebug 메서드가 호출되었을 때 대화형 셸로 진입하는 대신, 디버거가 자체적인 전용 서버를 구동하는 방식입니다. 이후 명령줄 클라이언트로 이 디버그 서버에 접속하면 됩니다.

원격 디버깅은 어떻게 동작할까?

먼저 컨트롤러 액션에 byebug 메서드를 호출하는 코드를 추가합니다.

class PagesController < ApplicationController
  def index
    if user_has_never_signed_in? && request.subdomain == "www"
      @hero_bg = ab_test("hero_bg", "control", "variable")
    else
      @hero_bg = "control"
    end

    byebug

  end
end

다음으로 해당 액션에 요청을 보냅니다. 그러면 연결이 응답 없이 대기 상태로 머무는 것처럼 보입니다.

Byebug, Rails, Pow를 활용한 원격 디버깅 완벽 가이드 디버거를 트리거한 웹 요청은 페이지가 로드되지 않습니다.

마지막으로 byebug 클라이언트로 전환하면, 지정한 정확한 지점에서 디버거 콘솔이 열려 있는 것을 확인할 수 있습니다.

Byebug, Rails, Pow를 활용한 원격 디버깅 완벽 가이드 실제로 작동 중인 byebug 원격 디버거

Byebug로 원격 디버깅 환경 구성하기

아직 gem을 설치하지 않았다면 먼저 설치를 진행하세요.

# Gemfile

gem "byebug", group: "development"

다음으로, Pow가 Rails 앱을 시작할 때마다 byebug 서버가 함께 구동되도록 이니셜라이저(initializer)를 추가해야 합니다. 필수 옵션은 포트 번호 하나뿐입니다. 아래 코드는 환경 변수를 통해 포트를 설정할 수 있게 해 줍니다.

이니셜라이저를 추가한 후에는 앱이 정상적으로 로드되었는지 확인하기 위해 앱을 재시작하는 것이 좋습니다.

# config/initializers/byebug.rb

if Rails.env.development?
  Byebug.start_server 'localhost', ENV.fetch("BYEBUG_SERVER_PORT", 1048).to_i
end

마지막으로 byebug 클라이언트를 실행하고 서버 위치를 알려주면 됩니다. 클라이언트는 디버그 트리거가 발생하기를 기다리며 대기 상태에 머무릅니다.

다른 포트를 사용했다면 여기서도 해당 포트 번호로 변경해야 합니다.

bundle exec byebug -R localhost:1048

이것으로 설정이 끝났습니다! 이제 본격적으로 디버깅을 시작해 보세요.