Ruby on Rails 8 완벽 가이드 2026: 신규 기능과 마이그레이션 방법
Rails 8의 Solid Trifecta, 내장 인증, Kamal 2, Propshaft를 코드 예제와 함께 분석합니다. Rails 7에서 8로의 단계별 마이그레이션 가이드를 제공합니다.

Ruby on Rails 8은 Rails 7 이후 가장 중요한 릴리스로, Redis를 대체하는 데이터베이스 기반 인프라, 내장 인증 시스템, 간소화된 배포 파이프라인을 도입하였습니다. 2024년 11월에 출시되었으며 2025년 10월 Rails 8.1 후속 릴리스를 통해 성숙 단계에 접어든 Rails 8은 기존에 별도의 인프라를 요구하던 외부 의존성을 제거합니다. 한국의 개발팀에게 이 변화는 운영 복잡도 감소, 인프라 비용 절감, 중소 규모 프로젝트의 진입 장벽 완화를 의미합니다.
Rails 8은 Redis를 Solid Trifecta(Solid Queue, Solid Cache, Solid Cable)로 대체하고, 내장 인증 생성기를 추가하며, 기본 에셋 파이프라인을 Propshaft로 전환하고, 무중단 배포를 위한 Kamal 2를 탑재합니다. Ruby 3.2 이상이 필요합니다.
Solid Trifecta: 데이터베이스 기반 인프라
Rails 8 이전에는 대부분의 프로덕션 애플리케이션이 백그라운드 잡, 캐싱, WebSocket pub/sub의 세 가지 핵심 기능에 Redis를 의존하였습니다. Solid Trifecta는 이 세 가지를 PostgreSQL, MySQL, SQLite와 호환되는 데이터베이스 기반 어댑터로 대체합니다.
이 아키텍처 전환은 운영 복잡도를 크게 줄여 줍니다. Redis 인스턴스를 별도로 모니터링하고 확장하고 유지 관리할 필요가 없어집니다. 성능 면에서의 트레이드오프는 존재합니다. 대용량 처리 시나리오에서는 Redis가 여전히 더 빠르지만, 대다수의 애플리케이션에서는 데이터베이스 기반 어댑터로 충분한 성능을 확보할 수 있습니다. Basecamp는 10TB 규모의 Solid Cache를 60일 보존 기간으로 프로덕션에서 운영하고 있습니다.
Solid Queue: 백그라운드 잡 처리
Solid Queue는 Sidekiq, Resque, Delayed Job을 대체하는 데이터베이스 기반 Active Job 백엔드입니다. PostgreSQL 9.5+와 MySQL 8.0+에서 FOR UPDATE SKIP LOCKED를 활용하며, SQLite에서는 안정적으로 폴백(fallback) 처리됩니다.
# config/environments/production.rb
config.active_job.queue_adapter = :solid_queue
# config/solid_queue.yml
production:
dispatchers:
- polling_interval: 1
batch_size: 500
workers:
- queues: "*"
threads: 5
processes: 2
polling_interval: 0.1Puma 플러그인은 개발 환경에서 웹 서버와 함께 Solid Queue를 시작하므로, 별도의 프로세스를 실행할 필요가 없습니다.
# config/puma.rb
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] || Rails.env.development?Solid Queue는 반복 잡(recurring jobs), 동시성 제어, 큐별 일시 중지 및 재개와 같은 고급 기능을 지원합니다. 분당 10,000건 미만의 잡을 처리하는 애플리케이션에서는 별다른 부하 없이 안정적으로 동작합니다.
Solid Cache와 Solid Cable
Solid Cache는 HTML 프래그먼트 캐시를 Memcached나 Redis 대신 데이터베이스에 저장합니다. 디스크 스토리지(SSD/NVMe)는 RAM에 비해 비용이 크게 낮으므로, 더 큰 캐시 풀과 더 긴 보존 기간을 확보할 수 있습니다.
# config/environments/production.rb
config.cache_store = :solid_cache_storeSolid Cable은 Action Cable의 Redis pub/sub 어댑터를 대체합니다. WebSocket 메시지가 데이터베이스 테이블에 기록되고 기본적으로 100ms 간격으로 폴링됩니다. 대부분의 사용 사례에서 거의 실시간에 가까운 통신이 가능하며, 메시지는 24시간 후 자동으로 정리됩니다.
# config/cable.yml
production:
adapter: solid_cable
polling_interval: 0.1
keep_messages_around_for: 1.day내장 인증 생성기
Rails 8은 세션 기반 로그인, 로그아웃, 비밀번호 재설정 스캐폴딩을 생성하는 네이티브 인증 생성기를 탑재합니다. 기본 인증에 외부 젬(gem)이 필요하지 않습니다.
# Generate the authentication scaffolding
bin/rails generate authentication이 명령은 User 모델, Session 모델, SessionsController, PasswordsController, Authentication concern을 생성합니다. 생성된 코드는 bcrypt와 함께 has_secure_password를 사용하며, IP당 3분에 10회의 로그인 시도 제한(rate limiting)이 포함되어 있습니다.
# app/controllers/concerns/authentication.rb
module Authentication
extend ActiveSupport::Concern
included do
before_action :require_authentication
helper_method :authenticated?
end
private
def require_authentication
resume_session || request_authentication
end
def resume_session
Current.session = find_session_by_cookie
end
def find_session_by_cookie
Session.find_by(id: cookies.signed[:session_id]) if cookies.signed[:session_id]
end
def request_authentication
session[:return_to_after_authenticating] = request.url
redirect_to new_session_path
end
def authenticated?
Current.session.present?
end
end비밀번호 재설정은 데이터베이스에 저장된 토큰이 아닌, has_secure_password가 생성하는 서명되고 유효 기간이 제한된 토큰을 사용합니다. 이 생성기는 의도적으로 회원가입, 이메일 인증, 소셜 로그인을 포함하지 않습니다. 생성된 코드는 확장 가능한 기반을 제공하는 것이지, Devise를 완전히 대체하는 것이 아닙니다.
내장 생성기는 로그인, 로그아웃, 비밀번호 재설정을 처리합니다. 회원가입, 이메일 인증, OAuth, 다단계 인증(MFA)은 직접 구현하거나 Authentication Zero 같은 젬을 통해 추가해야 합니다.
params.expect를 통한 안전한 파라미터 처리
Rails 8은 기존의 params.require.permit 패턴을 대체하는 더 안전한 대안인 params.expect를 도입합니다. 새로운 메서드는 키가 누락되었을 때 nil을 조용히 반환하는 대신 예외를 발생시킵니다.
# Before (Rails 7)
def user_params
params.require(:user).permit(:name, :email, :role)
end
# After (Rails 8)
def user_params
params.expect(user: [:name, :email, :role])
endexpect 메서드는 :user 키가 존재하고 허용된 속성만 포함하고 있는지 검증합니다. 키가 누락된 경우 즉시 ActionController::ParameterMissing이 발생하여, 이후 처리 흐름에서 발생할 수 있는 무음(silent) 버그를 방지합니다.
Propshaft: 새로운 기본 에셋 파이프라인
Propshaft는 기본 에셋 파이프라인으로 Sprockets를 대체합니다. Sprockets가 컴파일, 압축, 핑거프린팅을 하나의 모놀리식 시스템에서 처리했다면, Propshaft는 정적 에셋의 제공과 핑거프린팅에만 집중합니다.
JavaScript 번들링은 esbuild, Vite, Bun 같은 최신 도구에 위임합니다. CSS 처리는 Tailwind CLI 또는 dart-sass를 통해 이루어집니다. 그 결과, 더 빠르고 예측 가능하며 현재의 프론트엔드 도구 생태계와 잘 맞는 에셋 파이프라인을 구축할 수 있습니다.
# Gemfile (Rails 8 default)
gem "propshaft"
# No configuration needed for basic usage
# Assets in app/assets are served and fingerprinted automatically기존에 Sprockets를 사용하는 애플리케이션은 계속 사용할 수 있습니다. 마이그레이션 경로는 Sprockets 전용 디렉티브(//= require)를 제거하고 import maps 또는 JavaScript 번들러를 채택하는 방식입니다.
Ruby on Rails 면접 준비가 되셨나요?
인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.
Kamal 2와 Thruster: 무중단 배포
Rails 8은 Kamal 2가 사전 구성되어 제공됩니다. Kamal 2는 새 Linux 서버를 단일 명령으로 프로덕션 서버로 프로비저닝하는 배포 도구입니다. Kamal 2는 Traefik을 목적에 맞게 설계된 리버스 프록시인 Kamal Proxy로 대체합니다.
# Deploy to a fresh server
kamal setup
# Subsequent deployments
kamal deployThruster는 Kamal Proxy와 Puma 사이에 위치하여 파일 다운로드를 위한 X-Sendfile 가속, 자동 에셋 압축(gzip/brotli), HTTP/2 지원을 제공합니다. Rails 8이 생성하는 Dockerfile에는 기본적으로 Thruster가 포함됩니다.
# Excerpt from Rails 8 generated Dockerfile
RUN gem install thruster
CMD ["thrust", "./bin/rails", "server"]이 스택(Kamal 2 + Kamal Proxy + Thruster + Puma)은 SSL 종료, 무중단 배포, 롤링 재시작을 Nginx나 HAProxy 같은 외부 서비스 없이 처리합니다.
프로덕션을 위한 SQLite 강화
Rails 8은 프로덕션 환경에서의 SQLite 지원을 크게 개선하였습니다. 커넥션 풀링, WAL 모드, 향상된 동시성 처리로 중소 규모 애플리케이션에서 SQLite를 프로덕션에 적용할 수 있게 되었습니다. Solid Trifecta와 결합하면 단일 서버에서 외부 데이터베이스 서버 없이 Rails 8 애플리케이션 전체를 SQLite로 운영할 수 있습니다.
# config/database.yml (SQLite production setup)
production:
primary:
adapter: sqlite3
database: storage/production.sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
cache:
adapter: sqlite3
database: storage/production_cache.sqlite3
queue:
adapter: sqlite3
database: storage/production_queue.sqlite3
cable:
adapter: sqlite3
database: storage/production_cable.sqlite3이 구성은 네 개의 SQLite 파일로 전체 애플리케이션 스택을 운영합니다. Kamal은 스토리지 디렉터리를 영구 볼륨으로 마운트하여 컨테이너 재시작 시에도 데이터가 보존됩니다.
Rails 7에서 Rails 8로 업그레이드하기
Rails 7.2에서 Rails 8.0으로의 마이그레이션은 애플리케이션이 이미 디프리케이션 경고를 해결한 상태라면 원활하게 진행됩니다. Rails 7.0 또는 7.1을 사용하는 애플리케이션은 단계적으로 업그레이드해야 합니다. 7.0에서 7.1로, 7.1에서 7.2로, 그리고 7.2에서 8.0으로 순차적으로 진행하는 것이 안전합니다.
Rails 8은 Ruby 3.2 이상을 요구합니다. Ruby 버전을 확인하고, Rails 7.2에서 테스트 스위트가 통과하는지 검증하며, 업그레이드를 시작하기 전에 RailsBump를 통해 젬 호환성을 점검해야 합니다.
1단계: 의존성 업데이트
# Gemfile
gem "rails", "~> 8.0"bundle update rails2단계: 업데이트 태스크 실행
bin/rails app:update이 명령은 구성 파일을 Rails 8 기본값으로 업데이트합니다. git diff를 사용하여 각 변경 사항을 주의 깊게 검토해야 합니다. 주요 변경 사항에는 새로운 Regexp.timeout 기본값(1초), 변경된 db:migrate 동작(새 데이터베이스에 스키마 자동 로드), Propshaft 구성이 포함됩니다.
3단계: 스키마 재정렬 처리
Rails 8은 schema.rb의 컬럼 순서를 실제 데이터베이스 컬럼 순서와 일치하도록 재정렬합니다. 스키마 덤프를 즉시 실행하여 이 외형적 변경을 실제 마이그레이션 변경과 분리하는 것이 좋습니다.
bin/rails db:schema:dump
git add db/schema.rb
git commit -m "Reorder schema columns for Rails 8"4단계: 새 기능 점진적 도입
Solid Trifecta, Propshaft, 인증 생성기는 기존 애플리케이션에서 선택적으로 도입할 수 있습니다. 코어 업그레이드가 안정화된 후 개별적으로 채택하는 것이 권장됩니다.
- 잡 어댑터를 Solid Queue로 교체
- 캐시 스토어를 Solid Cache로 전환
- Action Cable을 Solid Cable로 마이그레이션(해당되는 경우)
- 에셋 파이프라인의 Propshaft 마이그레이션 평가
5단계: 파라미터 처리 방식 업데이트
컨트롤러 전체에서 params.require.permit 호출을 params.expect로 교체합니다. 이 변경은 선택 사항이지만, 더 강력한 파라미터 검증을 위해 권장됩니다.
Rails 8.1: Continuable Jobs와 내장 CI
2025년 10월에 출시된 Rails 8.1은 Rails 8의 기반 위에 두 가지 주요 기능을 추가합니다. Continuable Jobs(ActiveJob::Continuable)는 장시간 실행되는 잡을 재개 가능한 단계로 분할합니다. 서버가 임포트 도중 재시작되더라도 잡은 처음부터 다시 시작하지 않고 중단된 지점에서 정확히 재개됩니다.
# app/jobs/import_records_job.rb
class ImportRecordsJob < ApplicationJob
include ActiveJob::Continuable
def perform(cursor:)
records = Record.where("id > ?", cursor.value || 0).limit(1000)
records.each do |record|
process(record)
cursor.advance(record.id)
end
end
endRails 8.1은 내장 CI 구성과 네이티브 Markdown 렌더링도 도입하여 외부 의존성을 더욱 줄입니다.
결론
Rails 8은 프레임워크 철학의 중요한 전환점으로, 기능을 희생하지 않으면서 운영 단순성을 극대화하였습니다. 핵심 사항을 정리하면 다음과 같습니다.
- Solid Trifecta(Queue, Cache, Cable)는 잡, 캐싱, WebSocket에서 Redis를 필수 의존성에서 제외합니다
- 내장 인증 생성기는 서드파티 젬 없이 세션 기반 인증의 기반을 제공합니다
params.expect는params.require.permit을 더 엄격하고 안전한 파라미터 처리로 대체합니다- Propshaft는 Sprockets를 대체하는 기본 에셋 파이프라인으로, 번들링은 최신 도구에 위임합니다
- Kamal 2와 Thruster는 Nginx나 Capistrano 없이 무중단 배포를 구현합니다
- Rails 7.2에서의 업그레이드는 점진적으로 진행됩니다. 의존성 업데이트,
app:update실행, 새 기능의 단계적 도입 순서를 따릅니다 - Rails 8.1은 Continuable Jobs와 내장 CI를 추가하여 외부 도구 의존성을 더욱 줄입니다
연습을 시작하세요!
면접 시뮬레이터와 기술 테스트로 지식을 테스트하세요.
태그
공유
