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 객체를 직접 제어하기 더 쉬운 다른 객체로 대체하고 싶을 때 유용합니다. 예를 들어 테스트 환경에서 STDOUT을 StringIO 객체로 교체할 수 있습니다.
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) }
파일 시스템 관련 작업을 할 때 한번 사용해 보세요 🙂
마치며
이번 예제들이 도움이 되었기를 바랍니다! 표준 라이브러리를 더 깊이 살펴보면 어떤 기능들을 활용할 수 있는지 알게 될 것입니다.
글이 마음에 드셨다면 주변에 공유하는 것도 잊지 마세요 🙂