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

Ruby 표준 라이브러리 활용법: 개발자를 위한 5가지 유용한 클래스 예제

Ruby 표준 라이브러리(Standard Library)는 Ruby에 기본으로 포함되어 있지만 언어 자체의 일부는 아닌 모듈과 클래스들의 모음입니다.

이 라이브러리에는 다양한 편리한 기능들이 담겨 있습니다.

  • Base64 인코딩
  • 소수 생성
  • DNS 조회

이 글에서는 그중 실무에서 바로 활용할 수 있는 5가지 클래스를 예제와 함께 소개합니다.

Ruby Logger 클래스로 로그 남기기

에러나 디버깅 메시지를 기록해야 할 때는 Ruby의 Logger 클래스를 사용하면 됩니다.

이 클래스 하나만 있으면 로깅에 필요한 모든 기능을 바로 사용할 수 있습니다.

Logger 객체를 생성할 때 출력 스트림이나 파일 이름을 인자로 넘겨주고, 로그 수준에 맞는 메서드를 호출해 메시지를 기록하면 됩니다.

사용할 수 있는 로그 수준은 다음과 같습니다.

  • debug
  • info
  • warn
  • error
  • fatal

예제:

require 'logger'

logger = Logger.new(STDOUT)

logger.info 'testing...'
logger.warn 'fun with Ruby :)'

실행 결과:

I, [2016-05-14T15:50:21.367590 #12148]  INFO -- : testing...
W, [2016-05-14T15:50:21.846651 #12148]  WARN -- : fun with Ruby 🙂

맨 앞 문자는 로그 수준의 약자(I는 Info, W는 Warn)이며, 그다음에 타임스탬프와 현재 프로세스 ID(Ruby에서 Process.pid로 확인 가능)가 출력됩니다.

마지막에는 전체 로그 수준과 실제 메시지가 함께 표시됩니다.

이 출력 형식은 새로운 포매터(formatter)를 지정해 원하는 대로 변경할 수도 있습니다.

Prime 클래스로 소수 다루기

소수를 매일 다룰 일은 많지 않지만, 코딩 테스트나 프로그래밍 챌린지를 즐긴다면 Ruby가 Prime 클래스를 통해 소수를 아주 잘 지원한다는 사실을 알아두면 큰 도움이 됩니다.

prime을 require하면 정수 객체에 prime? 메서드가 추가됩니다. 구버전 문서에서는 Fixnum으로 표기되어 있지만, 최신 Ruby에서는 Integer를 의미합니다.

예제:

require 'prime'

5.prime?  # true
11.prime? # true
20.prime? # false

또한 이 클래스에는 소수 생성기(generator)도 포함되어 있습니다.

예제:

Prime.take(10)
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

StringIO 클래스 활용법

StringIO 클래스를 사용하면 IO 객체처럼 동작하는 문자열을 만들 수 있습니다.

즉, 파일이나 STDIN(표준 입력)에서 데이터를 읽듯이 문자열을 다룰 수 있다는 뜻입니다.

예제:

require 'stringio'

io = StringIO.new

io << 'test'
io << 'code'

puts io.string
# "testcode"

주의할 점:

StringIO 객체에 데이터를 추가할 때 공백이나 줄바꿈이 자동으로 붙지 않으며, 실제 문자열을 얻으려면 string 메서드를 호출해야 합니다.

또한 일반 문자열과 달리 배열 인덱싱 방식으로 개별 문자에 접근할 수 없습니다.

그렇다면 언제 유용할까요?

파일이나 IO 객체를 직접 제어하기 더 쉬운 다른 객체로 대체하고 싶을 때 유용합니다. 예를 들어 테스트 환경에서 STDOUTStringIO 객체로 교체할 수 있습니다.

Rails의 실제 사용 예시는 여기서 확인할 수 있습니다: https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/test/logger_test.rb

Base64 인코딩 & 디코딩

Base64는 인터넷에서 널리 사용되는 인코딩 방식입니다.

형태는 다음과 같습니다:

"cnVieQ=="

왜 유용할까요?

URL에는 허용되는 문자 집합이 제한적이기 때문에, 특수 문자를 포함하고 싶을 때 Base64로 인코딩하면 이를 손쉽게 해결할 수 있습니다.

인코딩 방법:

require 'base64'

Base64.encode64("ruby")
# "cnVieQ=="

디코딩 방법:

require 'base64'

Base64.decode64("cnVieQ==")
# "ruby"

Pathname 클래스로 경로 다루기

Pathname 클래스는 Dir, File 같은 파일 시스템 관련 유틸리티들을 하나의 더 강력한 클래스로 감싼 것입니다.

메서드 이름은 동일하지만 반환값이 문자열이나 배열이 아닌 Pathname 객체라는 점이 다릅니다. 덕분에 결과물을 계속 파일 관련 메서드로 체이닝하며 다룰 수 있습니다.

좋은 예시:

require 'pathname'

Pathname.glob("*").count(&:directory?)

만약 Dir로 같은 작업을 하려면 다음과 같이 작성해야 하는데, 훨씬 번거롭습니다.

Dir.glob("*").count { |d| File.directory?(d) }

파일 시스템 관련 작업을 할 때 한번 사용해 보세요 🙂

마치며

이번 예제들이 도움이 되었기를 바랍니다! 표준 라이브러리를 더 깊이 살펴보면 어떤 기능들을 활용할 수 있는지 알게 될 것입니다.

글이 마음에 드셨다면 주변에 공유하는 것도 잊지 마세요 🙂