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

Ruby에서 환경 변수 다루기: ENV 객체 사용법부터 Rails Credentials까지

환경 변수(environment variable)는 KEY=VALUE 형태의 키/값 쌍으로 이루어진 설정 정보입니다.

KEY=VALUE

환경 변수는 컴퓨터에서 실행되는 모든 프로그램 사이에서 설정 옵션을 공유하기 위해 사용됩니다. 그렇기 때문에 환경 변수가 어떻게 동작하는지, 그리고 Ruby 프로그램에서 특수 객체인 ENV를 통해 어떻게 접근할 수 있는지 이해하는 것이 중요합니다.

환경 변수의 대표적인 활용 예시

  • 기본 에디터(default editor) 설정하기
  • Ruby에게 gem을 찾을 위치 알려주기 (GEM_PATH / GEM_HOME)
  • API 키를 소스 코드 저장소(git)에 커밋하지 않고 애플리케이션에 전달하기
  • 운영체제가 실행 파일(Windows의 .exe 등)을 찾을 경로 지정하기
  • Rails를 test / development / production 모드로 시작하도록 지정하기

Linux나 Mac에서는 env 명령어, Windows에서는 set 명령어를 입력하면 현재 시스템의 모든 환경 변수 목록을 확인할 수 있습니다.

예시:

PWD=/home/jesus
SHELL=/usr/bin/zsh
RUBY_ENGINE=ruby
RUBY_VERSION=2.6.0
GEM_ROOT=/opt/rubies/ruby-2.6.0/lib/ruby/gems/2.6.0

# ...

목록이 꽤 길 수 있지만, 전부 외울 필요는 없습니다. 또한 gem env 명령어를 사용하면 gem 관련 변수와 설정만 따로 출력할 수도 있습니다.

자, 그럼 Ruby 코드 안에서 이러한 환경 변수에 접근하려면 어떻게 해야 할까요? 바로 여기서 특별한 객체가 등장합니다. 지금부터 하나씩 살펴보겠습니다!

Ruby에서 환경 변수 사용하기

Ruby에는 ENV라는 객체가 있으며, 이 객체는 해시(hash)처럼 동작하면서 프로그램에서 접근 가능한 모든 환경 변수를 제공합니다.

몇 가지 예시를 보겠습니다.

키 개수 확인하기

ENV.size
# 48

키 목록 가져오기

ENV.keys

특정 키에 접근하기

ENV["GEM_HOME"]
# "/home/jesus/.gem/ruby/2.6.0"

심지어 map, select 같은 Enumerable 메서드도 그대로 사용할 수 있습니다.

ENV.select { |k,v| k.size < 4 }

그렇다면 반대로, Ruby 밖에서 환경 변수를 설정하려면 어떻게 해야 할까요?

환경 변수 설정 방법

환경 변수는 일회성(one-time use)으로 설정할 수도 있습니다.

다음과 같이 말이죠:

API_KEY=1 ruby -e 'p ENV["API_KEY"]'

irb가 아닌 터미널에서 위 명령어를 실행하면, 해당 Ruby 프로세스는 API_KEY 값에 접근할 수 있습니다. API 키를 전달할 때 유용할 뿐만 아니라, Rails 실행 모드를 지정할 때도 자주 사용됩니다.

예시:

RAILS_ENV=production rails console

기억해 두세요: 이 방식은 지금 실행하는 프로세스에 한해서만 해당 환경 변수를 설정합니다. 즉, API_KEY=1 <명령어> 형태로 작성하면 그 변수는 오직 그 명령어에만 적용됩니다!

현재 터미널 세션에서 실행하는 모든 명령어가 이 변수를 사용하게 하려면 export를 사용하세요.

export API_KEY=1

이제 다음 명령어를 실행하면:

ruby -e 'p ENV["API_KEY"]'

변수를 접두사로 붙이지 않아도 결과로 1이 출력됩니다.

주의: Ruby 애플리케이션 내부의 설정을 관리하기 위해 ENV를 사용하지 마세요. 그것은 ENV의 용도가 아닙니다. ENV는 오직 Ruby 외부에서 들어오는 외부 설정을 읽기 위한 것입니다. 애플리케이션 내부 설정이 필요하다면 dry-configurable 같은 gem을 사용해 보세요.

환경 변수의 중요한 특성

다음 특성들을 알아두면 예상치 못한 동작을 이해하는 데 큰 도움이 됩니다.

  • 스냅샷(Snapshotting): 환경 변수는 프로그램을 실행하는 시점에 설정되며, 이후 외부에서 발생한 변경 사항의 영향을 받지 않습니다.
  • 닫힌 환경(Closed environment): 프로세스 내부(Ruby 프로그램도 하나의 프로세스입니다)에서 변수를 변경해도, 프로세스 외부의 환경 변수는 변하지 않습니다.
  • 비영속성: 컴퓨터를 재부팅하거나 터미널을 닫으면 환경 변수 변경 사항은 사라집니다. Linux/Mac의 export나 Windows의 set을 사용했더라도 마찬가지입니다.

이 세 가지는 꼭 기억해 두세요!

Rails Credentials 활용하기

Rails 5.2부터는 API 키를 더 안전하게 관리할 수 있는 새로운 시스템이 도입되었습니다.

이 시스템은 자격 증명(credentials)을 config/credentials.yml.enc 파일에 직접 저장하는 방식으로 동작합니다. 이 파일은 암호화되어 있으며, master.key 파일이 있어야만 내용을 읽을 수 있습니다.

핵심 아이디어는 credentials.yml.enc 파일만 git에 커밋하고, 키 파일은 비공개로 보관하는 것입니다.

그럼 새로운 자격 증명은 어떻게 추가할까요? .enc 파일은 직접 수정할 수 없으므로, 대신 다음 명령어를 사용하세요.

bin/rails credentials:edit

이 파일은 YAML 형식이므로 올바르게 작성해야 합니다.

이제 Rails 앱에서 자격 증명을 다음과 같이 읽어올 수 있습니다.

Rails.application.credentials.github_api_key

정리

이번 글에서는 운영체제 설정을 관리하고 API 키를 안전하게 비공개로 유지할 수 있는 강력한 도구인 환경 변수에 대해 배웠습니다. ENV 객체로 값을 읽고, export로 세션 단위 변수를 설정하고, Rails에서는 Credentials 시스템을 활용하는 것까지 기억해 두시면 실무에서 큰 도움이 될 것입니다.

Ruby에서 환경 변수 다루기: ENV 객체 사용법부터 Rails Credentials까지

이 글이 도움이 되었다면 주변 친구들에게 공유해서 더 많은 사람들이 볼 수 있게 해주세요 🙂

읽어주셔서 감사합니다!