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

Ruby에서 데이터 검사하기: puts, inspect, p 메서드 완벽 가이드

대부분의 예외는 평소에는 잘 작동하던 메서드에 예상치 못한 데이터가 전달되면서 발생합니다. 따라서 오류의 원인을 찾으려면 해당 데이터가 애플리케이션 내에서 어떻게 흘러가는지 추적해 보는 것이 큰 도움이 됩니다. 이 글에서는 Ruby와 Rails 애플리케이션에서 데이터를 검사(inspect)하는 다양한 방법을 살펴보겠습니다.

puts, #inspectp

Ruby의 puts 메서드는 콘솔에 메시지를 출력할 때 사용합니다.

unknown = "This is a string"
puts unknown

위 스크립트를 실행하면 변수 안의 값이 그대로 출력되어 무엇이 들어 있는지 확인할 수 있습니다.

$ ruby puts.rb
This is a string

하지만 unknown 변수에 빈 문자열, nil 값 또는 빈 해시(hash)가 들어 있다면 puts는 빈 줄만 출력합니다. 이 경우 정확한 값을 확인할 수 없을 뿐만 아니라, 예를 들어 빈 해시와 빈 문자열을 구분하는 것조차 불가능합니다.

$ ruby puts_empty_string.rb

다행히도 여러분이 만나게 될 모든 객체에 구현되어 있는 inspect라는 인스턴스 메서드가 있습니다. 이 메서드는 객체를 문자열 표현으로 변환해 반환해 줍니다.

unknown = ""
puts unknown.inspect

빈 문자열에는 따옴표 한 쌍을, 배열에는 대괄호 한 쌍을 반환합니다.

$ ruby inspect_empty_string.rb
""
$ ruby inspect_empty_array.rb
[]

putsinspect의 조합이 워낙 자주 사용되다 보니, 두 작업을 한 번에 처리해 주는 단축 메서드인 p가 제공됩니다. 동작은 완전히 동일하지만 입력하기 훨씬 간편합니다.

unknown = ""
p unknown # `puts unknown.inspect`와 동일

Rails 뷰에서 데이터 검사하기

p라는 단축 메서드가 있긴 하지만, 객체의 문자열 표현이 필요하면서도 콘솔에는 출력하고 싶지 않은 경우라면 inspect 메서드를 알아두는 것이 여전히 유용합니다.

예를 들어 Rails 뷰에서는 로그 파일을 뒤져보는 대신, 결과로 생성되는 HTML 페이지에 값을 직접 출력하는 편이 더 실용적일 때가 많습니다.

<%= params.inspect %>

다만 복잡한 데이터 구조를 검사할 때는 검사 결과가 한 줄로 출력되기 때문에 원하는 데이터를 찾기 어려울 수 있습니다.

Rails는 이 문제를 해결하기 위해 debug 헬퍼를 제공합니다. 단순히 값을 검사하는 대신 객체를 사람이 읽기 쉬운 YAML 형식으로 변환하고, 서식이 유지되도록 <pre> 태그로 감싸줍니다.

<%= debug params %>

debug 헬퍼는 내부적으로 to_yaml 메서드를 사용해 YAML 표현을 얻은 뒤, 이를 <pre> 블록으로 감쌉니다. 만약 <pre> 태그로 감싸지 않고 객체를 YAML 형식으로 변환하고 싶다면 어떤 객체에든 직접 #to_yaml을 호출하면 됩니다.

irb(main):004:0* puts Product.first.to_yaml
--- !ruby/object:Product
concise_attributes:
- !ruby/object:ActiveRecord::Attribute::FromDatabase
  name: id
  value_before_type_cast: 4
- !ruby/object:ActiveRecord::Attribute::FromDatabase
  name: title
  value_before_type_cast: Title
  ....

예상하셨겠지만, 객체의 YAML 표현을 출력하는 단축 방법 역시 존재합니다. 위 예제는 y Product.first 한 줄로 실행할 수 있습니다.

irb(main):004:0* y Product.first # `puts Product.first.to_yaml`와 동일
--- !ruby/object:Product
...

"puts" 디버깅

데이터를 검사하는 방법은 이 외에도 더 있습니다. Pry 라이브러리나 Ruby 자체 디버거가 대표적인 예입니다. 물론 다른 검사 도구들도 살펴볼 가치가 충분하지만, 콘솔에 로그를 남기거나 뷰에 데이터를 출력하는 것만으로도 무슨 일이 일어나고 있는지 파악하는 가장 빠른 방법이 되곤합니다.

이 글이 도움이 되었는지, 궁금한 점이 무엇인지, 그리고 다음에 어떤 주제를 다루었으면 하는지 @AppSignal을 통해 알려주세요.