본문으로 건너뛰기
김신건의 로그

Ruby on Rails

· 수정 · 📖 약 2분 · 877자/단어 #web #framework #ruby #mvc
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
ViewHTML, 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 이벤트 처리

에코시스템

도구역할
Bundlergem 의존성 관리
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로 성장, 이후 일부 서비스 분리

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기