Ruby on Rails
Rails, 레일즈, 루비온레일즈, rails, ror
정의
Ruby on Rails (또는 Rails)는 Ruby 언어 기반의 풀스택 웹 프레임워크다. David Heinemeier Hansson (DHH)이 2004년 Basecamp 개발 중 추출했으며, “Convention over Configuration”을 핵심 철학으로 빠른 개발과 생산성을 강조한다.
Django와 함께 대표적인 “batteries-included” 철학의 웹 프레임워크로, ORM, 라우팅, 템플릿, 마이그레이션, 테스트 등 웹 개발에 필요한 모든 요소를 제공한다.
핵심 철학
- Convention over Configuration (CoC): 설정보다 관습. 디렉토리 구조, 파일명 규칙을 따르면 설정 파일 작성을 최소화할 수 있다.
- DRY (Don’t Repeat Yourself): 중복 제거. 같은 로직을 여러 곳에 반복하지 않는다.
- Omakase (お任せ): “주방장에게 맡기기”. DHH가 선택한 도구와 패턴을 그대로 받아들이는 것을 권장한다.
MVC 구조
Rails는 Model-View-Controller 패턴을 따른다.
Browser Request
↓
Router (config/routes.rb)
↓
Controller (app/controllers/)
↓
Model (app/models/) ↔ Database (ActiveRecord)
↓
View (app/views/) ← ERB, ViewComponent
↓
Response (HTML, JSON, etc.)
| 계층 | 역할 | 주요 클래스 |
|---|---|---|
| Model | 비즈니스 로직, 데이터베이스 접근 | ActiveRecord::Base |
| View | HTML, JSON 렌더링 | ERB, Slim, Haml, ViewComponent |
| Controller | 요청 처리, 흐름 제어 | ActionController::Base |
주요 구성 요소
ActiveRecord (ORM)
데이터베이스 테이블과 Ruby 클래스를 1:1 매핑. users 테이블은 User 모델로, created_at은 자동 timestamp.
class User < ApplicationRecord
has_many :posts
validates :email, presence: true, uniqueness: true
end
User.where(active: true).order(:created_at).limit(10)
ActionPack (라우팅, 컨트롤러)
RESTful 라우팅을 기본 제공.
# config/routes.rb
resources :posts # 7개 RESTful route 자동 생성 (index, show, new, create, edit, update, destroy)
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
def index
@posts = Post.all
end
end
ActionView (템플릿)
ERB (Embedded Ruby) 또는 ViewComponent를 사용. 레이아웃, 파셜, 헬퍼로 중복 제거.
ActiveJob (백그라운드 작업)
비동기 작업 처리. Sidekiq, Resque, DelayedJob 등 백엔드와 연동.
ActionCable (WebSocket)
실시간 양방향 통신. 채팅, 알림 등에 사용.
ActionMailer (이메일)
이메일 발송. 템플릿과 컨트롤러처럼 작성.
마이그레이션
데이터베이스 스키마를 버전 관리한다. db/migrate/ 아래 타임스탬프 파일로 순차 실행.
# db/migrate/20260615123456_create_users.rb
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :email, null: false
t.timestamps
end
add_index :users, :email, unique: true
end
end
rails db:migrate 실행 시 schema_migrations 테이블에 기록, 롤백은 rails db:rollback.
Hotwire (Turbo + Stimulus)
SPA (Single Page Application) 없이 반응성을 확보하는 Rails 7 기본 스택.
- Turbo: 페이지 전환 시
<body>만 교체 (Turbo Drive), 부분 렌더링 (Turbo Frames), WebSocket 스트리밍 (Turbo Streams) - Stimulus: 최소한의 JavaScript 컨트롤러로 DOM 이벤트 처리
에코시스템
| 도구 | 역할 |
|---|---|
| Bundler | gem 의존성 관리 |
| RSpec | 테스트 프레임워크 (minitest는 기본 포함) |
| FactoryBot | 테스트 fixture 생성 |
| Devise | 인증 (로그인, 회원가입) |
| Sidekiq | 백그라운드 작업 (Redis 기반) |
| Puma | 웹 서버 (Rails 기본) |
| Capistrano | 배포 자동화 |
약점과 주의점
- 메모리 사용량: Ruby 프로세스당 50~200MB 이상. 멀티 프로세스 (Puma worker) 사용 시 메모리 부담 큼.
- CPU 집약 작업: GIL (Global Interpreter Lock)로 인해 멀티코어 활용 제한. CPU 집약 작업은 별도 서비스 (Go, Rust)로 분리 권장.
- N+1 쿼리: ActiveRecord의 편리함 뒤에 숨은 성능 문제.
includes,joins로 eager loading 필수. - Scaling: Monolith 구조로 시작하기 쉽지만, 트래픽 증가 시 수평 확장 (horizontal scaling) 전략 필요. 세션 관리는 Redis 등 외부 저장소 권장 (Sticky Session 회피).
- Monolith vs Microservice: Rails는 monolith에 강점. 마이크로서비스로 전환 시 API 모드 (rails new —api) 사용 가능하지만, Rails의 장점 (CoC, 생산성)이 반감될 수 있음.
사용 사례
- GitHub: 초기 Rails로 구축, 현재도 일부 코어 로직 유지
- Shopify: Rails monolith + modular monolith 전략
- Basecamp: DHH의 회사, Rails 탄생지
- Airbnb: 초기 Rails로 성장, 이후 일부 서비스 분리
💬 댓글