Rails Insights

VCR Gem으로 시작하기

Ruby 개발자라면 테스트를 작성하는 것이 얼마나 중요한지 잘 알고 계실 것입니다. 테스트는 코드의 품질을 보장하고, 버그를 조기에 발견하는 데 도움을 줍니다. 그러나 외부 API와의 상호작용을 테스트하는 것은 종종 복잡하고 시간이 많이 소요될 수 있습니다. 이럴 때 유용한 도구가 바로 VCR Gem입니다. VCR은 HTTP 요청과 응답을 기록하고 재생할 수 있게 해주는 라이브러리로, 외부 API와의 상호작용을 보다 쉽게 테스트할 수 있도록 도와줍니다. 이번 글에서는 VCR Gem을 설치하고 사용하는 방법에 대해 알아보겠습니다.

VCR Gem 설치하기

VCR Gem을 사용하기 위해서는 먼저 Gem을 설치해야 합니다. Gemfile에 VCR을 추가하고, Bundler를 사용하여 설치할 수 있습니다.

# Gemfile
gem 'vcr'

이제 터미널에서 다음 명령어를 실행하여 Gem을 설치합니다.

$ bundle install

VCR 설정하기

VCR을 사용하기 위해서는 설정 파일을 만들어야 합니다. 일반적으로 `spec_helper.rb` 또는 `rails_helper.rb` 파일에 설정을 추가합니다. 다음은 기본적인 VCR 설정 예시입니다.

# spec/spec_helper.rb
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = 'spec/cassettes' # 캐시 저장 디렉토리
  config.hook_into :webmock # HTTP 요청을 가로채기 위한 설정
  config.configure_rspec_metadata! # RSpec 메타데이터를 사용하여 VCR을 자동으로 설정
end

위 설정에서 `cassette_library_dir`은 VCR이 HTTP 요청과 응답을 저장할 디렉토리입니다. `hook_into`는 VCR이 어떤 라이브러리를 사용할지를 설정합니다. 일반적으로 `webmock`을 사용합니다.

VCR 사용하기

VCR을 사용하여 API 요청을 테스트하는 방법은 매우 간단합니다. VCR은 "캐시"라는 개념을 사용하여 HTTP 요청과 응답을 저장합니다. 캐시는 특정 테스트가 실행될 때마다 생성되며, 이후 동일한 요청이 발생하면 저장된 응답을 재사용합니다.

캐시 사용 예시

다음은 VCR을 사용하여 외부 API에 요청을 보내고 응답을 캐시하는 간단한 예시입니다.

# spec/my_api_spec.rb
require 'spec_helper'
require 'net/http'

RSpec.describe 'My API' do
  it 'fetches data from the API', :vcr do
    uri = URI('https://api.example.com/data')
    response = Net::HTTP.get(uri)
    
    expect(response).to include('expected data')
  end
end

위의 예시에서 `:vcr` 태그를 사용하여 이 테스트가 VCR에 의해 기록되도록 지정합니다. 테스트가 처음 실행될 때, VCR은 API 요청을 기록하고 응답을 저장합니다. 이후 동일한 요청이 발생하면 VCR은 저장된 응답을 반환합니다.

VCR의 고급 기능

VCR은 기본적인 캐시 기능 외에도 여러 가지 유용한 기능을 제공합니다. 여기서는 몇 가지 고급 기능을 소개하겠습니다.

캐시 재사용 설정

VCR은 기본적으로 요청이 동일할 경우 캐시된 응답을 재사용합니다. 그러나 특정 상황에서는 캐시를 무시하고 새로운 요청을 보내고 싶을 수 있습니다. 이럴 때는 `:record` 옵션을 사용할 수 있습니다.

it 'fetches data from the API', :vcr do
  VCR.use_cassette('my_api', record: :new_episodes) do
    uri = URI('https://api.example.com/data')
    response = Net::HTTP.get(uri)
    
    expect(response).to include('expected data')
  end
end

위의 예시에서 `record: :new_episodes` 옵션을 사용하면, 기존 캐시가 있더라도 새로운 요청을 보내고 응답을 업데이트합니다.

캐시 삭제하기

테스트가 진행됨에 따라 캐시가 쌓이게 되는데, 때때로 캐시를 삭제하고 싶을 수 있습니다. VCR은 캐시를 삭제하는 기능도 제공합니다.

VCR.eject_cassette

위의 코드를 사용하면 현재 사용 중인 캐시를 삭제할 수 있습니다. 이 기능은 테스트가 실패했거나, API 응답이 변경되었을 때 유용합니다.

VCR과 함께 사용하는 라이브러리

VCR은 다양한 HTTP 클라이언트와 함께 사용할 수 있습니다. 여기서는 몇 가지 인기 있는 라이브러리와의 통합 방법을 소개합니다.

Faraday와 함께 사용하기

Faraday는 Ruby에서 HTTP 요청을 쉽게 만들 수 있도록 도와주는 라이브러리입니다. VCR과 함께 사용하면 다음과 같이 설정할 수 있습니다.

# Gemfile
gem 'faraday'
# spec/my_api_spec.rb
require 'spec_helper'
require 'faraday'

RSpec.describe 'My API' do
  it 'fetches data from the API', :vcr do
    conn = Faraday.new(url: 'https://api.example.com')
    response = conn.get('/data')
    
    expect(response.body).to include('expected data')
  end
end

HTTParty와 함께 사용하기

HTTParty는 또 다른 인기 있는 HTTP 클라이언트입니다. VCR과 함께 사용할 때는 다음과 같이 설정할 수 있습니다.

# Gemfile
gem 'httparty'
# spec/my_api_spec.rb
require 'spec_helper'
require 'httparty'

RSpec.describe 'My API' do
  it 'fetches data from the API', :vcr do
    response = HTTParty.get('https://api.example.com/data')
    
    expect(response.body).to include('expected data')
  end
end

결론

VCR Gem은 외부 API와의 상호작용을 테스트하는 데 매우 유용한 도구입니다. HTTP 요청과 응답을 기록하고 재생함으로써, 테스트의 신뢰성을 높이고 개발 속도를 향상시킬 수 있습니다. 이번 글에서 소개한 기본적인 사용법과 고급 기능을 통해 VCR을 효과적으로 활용해 보시기 바랍니다. VCR을 사용하여 더 나은 테스트 환경을 구축하고, 코드의 품질을 높여보세요!

Published: August 12, 2024

© 2024 RailsInsights. All rights reserved.