혼돈에서 명확함으로: Rails에서 의존성 감소

발행: (2025년 12월 21일 오전 01:51 GMT+9)
9 min read
원문: Dev.to

Source: Dev.to

적게가 더 많다: Rails에서 필수 Gem 선택하기

Ruby on Rails 21년이 지난 지금, 우리는 수천 개의 솔루션이 gem 형태로 포장된 매우 풍부한 생태계를 가지고 있습니다. 이렇게 많은 옵션이 존재하다 보니, 모든 문제를 해결하기 위해 gem을 추가하고 싶어지는 경우가 종종 있는데, 저는 이것을 흔한 실수라고 봅니다.

왜 필요 없는 수백 개의 gem을 설치하는 것이 문제일까요?

  • 각 gem은 시간이 지남에 따라 의존성잠재적인 취약점을 추가합니다.
  • 불필요한 gem은 애플리케이션을 더 느리게 만들고 장기적으로 유지보수가 어렵게 합니다.

적게가 더 많다’라는 철학은 진정으로 필수적인 gem만 설치하는 것으로, 즉 Gemfile에 포함될 만큼 ‘임대료를 지불하는’ gem만을 의미합니다.

어떻게 해야 할까요?

Gem을 추가하기 전에 다음과 같은 질문을 해보세요:

  • 정말 필요한가요? Rails가 이미 문제를 해결하고 있나요?
  • 이 gem은 활발히 유지되고 있나요? 마지막 업데이트는 언제였나요? 유지보수가 이루어지고 있나요?
  • 간단한 코드로 해결할 수 있나요? 때때로 30 줄 정도의 코딩이 알려지지 않은 테스트 없는 gem보다 낫습니다.
  • 이점이 비용을 초과하나요? 복잡성, 의존성, 유지보수를 고려하세요.

이러한 고민은 bundle add hello_world를 무분별하게 사용하는 것을 방지합니다.

제가 확고히 여기는 Gem들

절대적인 진리는 아닙니다; 다른 유효한 옵션도 있습니다. 프로젝트에 가장 맞는 것을 사용하세요.

1. RuboCop

# Gemfile
gem 'rubocop',      require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false

RuboCop은 Ruby 코드 표준화의 핵심입니다. 나쁜 관행, 불일치 및 스타일 위반을 검사하며, .rubocop.yml을 통해 매우 유연하게 설정할 수 있습니다.

팀에 미치는 영향

  • 스타일에 대한 논의를 없애고, code review가 로직에 집중할 수 있게 합니다.
  • 새로운 개발자들의 온보딩을 용이하게 합니다.

기본 설정 (.rubocop.yml)

inherit_from: .rubocop_todo.yml

AllCops:
  TargetRubyVersion: 3.1
  NewCops: enable

Style/Documentation:
  Enabled: false

Metrics/LineLength:
  Max: 120

2. RSpec

RSpec는 Rails 세계에서 가장 인기 있는 테스트 프레임워크입니다. 읽기 쉬운 문법과 강력한 기능을 제공해 클래스와 메서드를 테스트할 수 있습니다. 함께 사용할 수 있는 보조 gem들은 다음과 같습니다:

  • FactoryBot – 테스트 데이터 생성.
  • Faker – 가짜 데이터 생성.
  • SimpleCov – 테스트 커버리지 분석.

2.1. FactoryBot

# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name    { Faker::Name.name }
    email   { Faker::Internet.email }
    phone   { Faker::PhoneNumber.phone_number }
    address { Faker::Address.full_address }

    trait :admin do
      role { 'admin' }
    end

    trait :with_posts do
      after(:create) do |user|
        create_list(:post, 3, user: user)
      end
    end
  end
end

# Uso nos testes:
let(:user)           { create(:user) }
let(:admin)          { create(:user, :admin) }
let(:user_with_posts){ create(:user, :with_posts) }

FactoryBot은 테스트 데이터를 생성하고 표준화하는 과정을 단순화하여 유연성, 가독성 및 일관성을 제공합니다.

2.2. Faker

Faker는 테스트와 QA 환경의 시드 데이터를 위해 가짜이면서 무작위인 데이터를 생성합니다. FactoryBot과 잘 어울리며 실제 및 민감한 데이터를 사용하는 것을 피할 수 있습니다.

2.3. SimpleCov

SimpleCov는 애플리케이션의 테스트 커버리지를 분석하여 아직 테스트되지 않은 코드 부분을 표시합니다.

# spec/spec_helper.rb ou test/test_helper.rb
require 'simplecov'
SimpleCov.start 'rails' do
  add_filter '/spec/'
  add_filter '/config/'
  add_filter '/vendor/'

  minimum_coverage 90
  refuse_coverage_drop
end

3. Bullet

Bullet은 개발 환경에서 사용되는 gem으로, N+1 쿼리 및 사용되지 않은 연관 로딩과 같은 데이터베이스 성능 문제를 식별합니다. 이러한 문제를 프로덕션에 도달하기 전에 개발자에게 경고합니다.

4. Brakeman

Brakeman은 Rails 애플리케이션의 보안 정적 분석 도구로, 다음과 같은 취약점을 찾아냅니다:

  • SQL Injection
  • Cross‑Site Scripting (XSS)
  • Command Injection
  • Unsafe redirects
  • Insecure Session Handling

스캐너를 실행하면, 코드를 프로덕션에 배포하기 전에 취약점을 수정할 수 있도록 도와주는 보고서를 받게 됩니다.

결론

gem을 선택할 때 신중한 접근 방식을 채택하면 공격 표면을 줄이고, 성능을 향상시키며, 유지 보수를 간소화합니다. gem이 의존성 비용을 정당화할 만큼 실제 이점을 제공하는지 항상 스스로에게 물어보세요. 답이 “예”라면 포함시키고, 그렇지 않다면 Rails의 간단하고 기본적인 솔루션을 선호하세요.

5. Pry

Ruby용 인터랙티브 디버깅 도구로, 기본 콘솔을 대체합니다. binding.pry를 사용하여 코드 실행을 어느 시점에서든 일시 중지할 수 있으며, 변수들을 검사하고 실시간으로 코드를 실행하며 stack trace를 탐색할 수 있는 기능을 제공합니다.

보너스 옵션

흥미로운 몇 가지 보너스 옵션:

  • Better Errors & Binding of Caller – Rails 기본 오류 페이지를 대화형이고 상세한 인터페이스로 교체하여 stack trace를 확인하고, 변수를 검사하며, 이전 호출 컨텍스트를 브라우저에서 직접 탐색할 수 있습니다.
  • Sidekiq – 백그라운드에서 비동기 작업을 처리(이메일 전송, 파일 처리, 외부 요청) 애플리케이션 메인 흐름 외부에서 수행되며, 매우 효율적이고 확장 가능합니다.
  • Devise – 이 기능이 필요한 프로젝트를 위한 완전한 인증 솔루션입니다.

결론

Rails는 이미 많은 것을 해결해 주므로, gem을 추가하기 전에 스스로에게 물어보세요: Rails가 이미 이 문제를 해결하지 않나요? 대부분의 경우 답은 입니다.

바퀴를 다시 만들려는 것이 아니라, gem 추가가 정말 정당한지 평가하는 것입니다. 간결한 Gemfile은 애플리케이션을 더 빠르게 만들고, 의존성을 줄이며, 업데이트를 쉽게 하고, 보안 문제 위험을 감소시킵니다.

  • 간단한 것부터 시작하세요.
  • 가능한 한 간단함을 유지하세요.
  • 필요하고 지속적인 경우에만 새로운 gem을 추가하세요.
Back to Blog

관련 글

더 보기 »

슬롭웨어 중지

당신의 프로젝트는 형편없다 댓글 URL: https://news.ycombinator.com/item?id=46366285 포인트: 55 댓글: 77