← 목차
Framework · Ruby on Rails

웹 프레임워크 루비 온 레일즈 단계별 이해

웹 프레임워크 Rails를 MVC·라우트·마이그레이션 등 단계별로 설명. 최지혜 님 환율 모니터를 '웹앱으로 만든다면'으로 매핑해 데스크톱 앱과 비교하고, Claude Code로 만드는 요청 흐름까지.

  • 오늘 공통 주제
  • 예제: 환율 모니터(웹앱판)
Doc.09

개념 설명용 요약

정의
레일 위에

정해진 자리(MVC)에 내용만 채우면 웹앱이 굴러가는 프레임워크.

구조
MVC+Route

Model(데이터)·View(화면)·Controller(교통정리)+주소 안내판.

예제 연결
환율 모니터

최지혜 님 데스크톱 앱을 웹앱으로 바꾸면 어떻게 되는지.

이 문서는 웹 프레임워크 "Ruby on Rails(레일즈)"가 무엇이고, 어떤 순서로 웹앱을 만드는지를 비개발자도 따라올 수 있게 단계별로 설명합니다. 예제는 오늘 다 함께 본 최지혜 님의 실시간 환율 모니터를 사용합니다. 단, 최지혜 님이 받은 실습 키트는 *Electron 데스크톱 앱*이고, 이 문서는 "같은 환율 모니터를 웹사이트(웹앱)로 만든다면 Rails로 어떻게 되는가"를 보여주는 것입니다. 개념을 잇기 위한 대응이지, 키트를 Rails로 바꾸는 것은 아닙니다.
Section 01

0. 한 줄 정의 — 레일즈가 뭔가

Ruby on Rails = "Ruby라는 언어로 웹사이트(웹앱)를 빠르게 만들게 해주는 도구 세트(프레임워크)".

  • Ruby(루비) = 프로그래밍 언어. 사람이 읽기 쉬운 문법이 특징.
  • Rails(레일즈) = 그 Ruby로 웹앱을 만들 때 반복되는 일들(주소 연결·DB 저장·화면 그리기)을 미리 깔아둔 레일(기찻길). 우리는 레일 위에 내용만 얹으면 됩니다.
왜 "프레임워크"인가? 집을 지을 때 기둥·배관·전기 배선을 매번 새로 설계하지 않고 골조가 미리 있는 것과 같습니다. Rails는 웹앱의 골조를 제공하고, 우리는 방 배치(우리 기능)만 정합니다. 그래서 "레일 위를 달린다"는 이름이 붙었습니다.

언제 쓰나? 로그인·데이터 저장·여러 사람이 접속하는 웹 서비스를 만들 때. (예: 게시판, 쇼핑몰, 관리자 대시보드, 그리고 오늘 예로 드는 "웹으로 접속하는 환율 모니터")


Section 02

1. 오늘의 예제 — 최지혜 님 환율 모니터를 웹앱으로

최지혜 님 프로그램이 하는 일을 웹앱 관점에서 다시 적으면:

  1. 외부에서 현재 환율을 가져온다 (USD·EUR·JPY·CNY → 원화)
  2. 그 값을 화면에 보기 좋게 보여준다
  3. 값을 기록(저장) 해두고, 시간이 지나면 자동으로 새로 갱신한다
  4. 특정 값(임계값)을 넘으면 알람을 준다
최지혜 님 데스크톱 앱(Electron)같은 걸 웹앱(Rails)으로 하면
내 PC에 설치해서 실행브라우저 주소(URL)로 누구나 접속
창(Window)에 화면을 그림View(HTML 화면)를 서버가 그려서 보냄
JS로 환율 API 호출서버가 환율 API 호출 후 저장
로컬 파일에 기록DB(데이터베이스)에 기록
앱을 켜둬야 갱신서버가 항상 떠서 자동 갱신
핵심 차이: 데스크톱 앱은 "각자 PC에서 돈다", 웹앱(Rails)은 "서버 한 곳에서 돌고 여러 명이 접속한다". 어느 게 옳고 그름이 아니라 용도가 다릅니다(6장 비교표 참고).

Section 03

2. Rails의 큰 그림 — MVC 3역할

Rails 웹앱은 요청 하나를 세 담당(MVC)이 나눠 처리합니다. 환율 모니터로 비유하면:

역할이름하는 일환율 모니터에서
Model모델데이터·규칙 담당 (DB와 대화)"환율(Rate)" 데이터를 저장·조회
View화면(HTML) 담당환율 카드 화면을 그림
Controller컨트롤러교통정리 담당 (요청→모델/뷰 연결)"/rates 열어줘" 요청을 받아 모델에서 값 꺼내 뷰로 넘김

여기에 하나 더:

  • Route(라우트) = 주소(URL)와 컨트롤러를 연결하는 안내판. "/rates로 들어오면 RatesController의 index로 보내라".

요청이 흐르는 순서 (한 번 클릭 시):

브라우저(주소 입력)
   → Route(어디로 보낼지 결정)
   → Controller(교통정리)
   → Model(DB에서 환율 데이터 꺼내기)
   → View(화면 HTML 만들기)
   → 브라우저로 응답(화면 표시)
이 흐름 하나만 머리에 담으면 Rails의 90%는 이해한 것입니다. 나머지는 "각 담당을 어떻게 채우느냐"입니다.

Section 04

3. 단계별 만들기 (step-by-step)

아래는 실제로 Rails 웹 환율 모니터를 만드는 순서입니다. 명령어는 "이런 게 있다"만 보시면 되고, 실제로는 Claude Code에게 시키면 됩니다(7장).

0단계 — 준비: Ruby·Rails 설치하고 앱 뼈대 만들기

# Ruby 설치 여부 확인
ruby -v          # 예: ruby 3.3.x

# Rails 설치 (gem = Ruby의 라이브러리 설치 도구)
gem install rails
rails -v         # 예: Rails 7.x

# 새 웹앱 뼈대 생성 (폴더·기본 파일이 한 번에 만들어짐)
rails new fx-monitor
cd fx-monitor
rails server     # 로컬 서버 실행 → 브라우저 http://localhost:3000
rails new 한 줄이면 웹앱의 모든 골조(폴더 구조·DB 설정·서버)가 자동 생성됩니다. 이게 프레임워크의 힘입니다.

1단계 — 리소스 만들기: 환율(Rate)

"환율"이라는 데이터 묶음(모델+화면+컨트롤러)을 한 번에 생성합니다.

# 통화코드(문자), 원화값(소수), 기준시각(시간)을 가진 Rate 리소스 생성
rails generate scaffold Rate currency:string krw:decimal as_of:datetime
rails db:migrate     # 실제 DB에 'rates' 테이블을 만든다
  • scaffold(스캐폴드) = 모델·뷰·컨트롤러·라우트를 한 번에 만들어주는 발판. 초보에게 전체 그림을 빨리 보여줍니다.
  • db:migrate = 설계도(마이그레이션)를 실제 DB 테이블로 반영.

이 시점에 이미 http://localhost:3000/rates 로 들어가면 목록/추가/수정 화면이 동작합니다.

2단계 — Model: 데이터와 규칙

app/models/rate.rb — 환율 데이터의 규칙을 정합니다.

class Rate < ApplicationRecord
  # 통화코드와 원화값은 반드시 있어야 한다(검증)
  validates :currency, presence: true
  validates :krw, presence: true, numericality: { greater_than: 0 }

  # 가장 최근 환율만 통화별로 가져오는 도우미
  def self.latest_by_currency
    order(as_of: :desc).group_by(&:currency)
  end
end
Active Record: Rails에서는 Rate.create(...), Rate.all, Rate.where(...)처럼 SQL을 직접 안 쓰고 Ruby 문장으로 DB를 다룹니다. 이게 Rails가 편한 큰 이유입니다.

3단계 — Route & Controller: 요청 처리

config/routes.rb — 주소 연결(안내판).

Rails.application.routes.draw do
  root "rates#index"        # 첫 화면(/)을 환율 목록으로
  resources :rates          # /rates 관련 주소들을 자동 생성
end

app/controllers/rates_controller.rb — 교통정리.

class RatesController < ApplicationController
  def index
    # 모델에서 통화별 최신 환율을 꺼내 뷰로 넘긴다
    @rates = Rate.latest_by_currency
  end
end

4단계 — View: 화면 그리기

app/views/rates/index.html.erb — 실제 화면. <%= %> 안에 Ruby 값을 끼워 넣습니다.

<h1>실시간 원화 환율</h1>
<div class="grid">
  <% @rates.each do |currency, list| %>
    <div class="card">
      <b><%= currency %></b>
      <span><%= number_with_delimiter(list.first.krw) %> 원</span>
      <small>기준 <%= list.first.as_of.strftime("%H:%M") %></small>
    </div>
  <% end %>
</div>
ERB = HTML 안에 Ruby를 섞는 표기법. <%= 값 %>은 "이 자리에 값을 출력". 데스크톱 앱에서 JS로 DOM을 그리던 걸, 여기선 서버가 HTML을 완성해서 보냅니다.

5단계 — 외부 환율 API 가져오기 (서비스)

환율 데이터를 실제로 채웁니다. 로직은 서비스 객체로 분리(모델·컨트롤러를 깔끔하게).

# app/services/rate_fetcher.rb
require "net/http"
require "json"

class RateFetcher
  API = "https://open.er-api.com/v6/latest/USD"  # 키 없이 무료

  def self.call
    data = JSON.parse(Net::HTTP.get(URI(API)))
    rates = data["rates"]
    now = Time.current
    { "USD" => 1, "EUR" => rates["EUR"], "JPY" => rates["JPY"], "CNY" => rates["CNY"] }
      .each do |cur, per_usd|
        krw = rates["KRW"] / per_usd          # 1 외화 = 원화 ÷ 그 통화 환율
        Rate.create!(currency: cur, krw: krw.round(2), as_of: now)
      end
  end
end
계산 규칙(원화 환산)은 최지혜 님 위젯과 완전히 동일합니다. 담는 그릇(데스크톱 vs 웹 서버)만 다릅니다.

6단계 — 자동 갱신 & 임계값 알람 (백그라운드 작업)

사람이 새로고침 안 해도 서버가 주기적으로 갱신하게 합니다.

# app/jobs/refresh_rates_job.rb
class RefreshRatesJob < ApplicationJob
  def perform
    RateFetcher.call
    check_threshold        # 예: USD가 1,400원 넘으면 알림
  end
end
  • Job(잡) = 화면 요청과 별개로 뒤에서 도는 작업. "10분마다 환율 갱신"을 스케줄러(예: cron, whenever gem)로 등록.
  • 임계값 알람 = 데스크톱 앱의 알람과 같은 개념을, 서버에서 이메일/슬랙 등으로.

7단계 — 배포: 세상에 공개

로컬(내 PC)에서만 되던 걸 URL로 누구나 접속하게 올립니다.

  • 대표 방법: Render, Railway, Fly.io, Heroku 등에 배포(요즘은 명령 몇 줄).
  • 배포 시 함께 챙길 것: DB 연결, 환경변수(API키 등)를 .env가 아닌 서버 비밀값으로, HTTPS.
여기서 개발환경·API·배포·상태코드 개념은 공통 문서 [개발환경 설치 가이드]·[API 연동 안내]·[웹 구성 기초]와 그대로 이어집니다.

Section 05

4. Rails 폴더 구조 한눈에

rails new가 만들어주는 핵심 폴더만:

fx-monitor/
  app/
    models/        # M — 데이터·규칙 (rate.rb)
    views/         # V — 화면 (rates/index.html.erb)
    controllers/   # C — 교통정리 (rates_controller.rb)
    services/      # 우리가 추가한 로직 (rate_fetcher.rb)
    jobs/          # 백그라운드 작업 (refresh_rates_job.rb)
  config/
    routes.rb      # 주소 ↔ 컨트롤러 연결
  db/
    migrate/       # DB 설계도(마이그레이션)
  Gemfile          # 사용하는 라이브러리(gem) 목록
Gem(젬) = Ruby 세계의 라이브러리(부품). Gemfile에 적고 bundle install하면 설치됩니다. Python의 pip 패키지, Node의 npm 패키지와 같은 개념입니다.

Section 06

5. Rails의 철학 — 왜 빠른가

Rails가 유명해진 두 원칙:

  • CoC (Convention over Configuration, 설정보다 관습) — 정해진 규칙(파일 이름·위치)을 따르면 설정을 거의 안 해도 자동으로 연결됩니다. Rate 모델 → rates 테이블 → RatesControllerrates/ 뷰가 이름만으로 이어집니다.
  • DRY (Don't Repeat Yourself, 반복하지 마라) — 같은 코드를 여러 번 쓰지 않도록 구조가 유도합니다.
Rails는 "정해진 자리에 정해진 이름으로 넣으면 알아서 굴러가는" 프레임워크입니다. 그래서 웹 서비스를 놀랄 만큼 빨리 만들 수 있습니다.

Section 07

6. 언제 Rails? 언제 데스크톱 앱? (최지혜 님 키트와 비교)

상황알맞은 선택이유
나 혼자 내 PC에서 상시 띄워두고 알람데스크톱 앱(Electron) — 최지혜 님 키트설치형·오프라인·OS 알림에 강함
여러 사람이 접속, 로그인·기록 공유웹앱(Rails 등)URL 하나로 공유, 서버에 데이터 축적
빠른 개인 도구·자동화 스크립트Python 스크립트 (김성범 님 트랙)계산·수집·문서화에 최적
문서 여러 형식 자동 생성문서 파이프라인(FaveCast 사례)원본 하나 → 다형식 파생
오늘 Rails를 배우는 목적은 "앞으로 웹 서비스로 키우고 싶을 때 어떤 그림인지"를 갖는 것입니다. 최지혜 님 환율 모니터는 지금은 데스크톱으로 충분하고, "여러 명이 웹으로 보게 하고 싶다"가 되는 순간 Rails 같은 웹 프레임워크가 답이 됩니다.

Section 08

7. Claude Code로 Rails 웹앱 만들기 — 단계별 요청

실제로는 명령어를 외우지 말고 Claude Code에게 순서대로 시키면 됩니다. 각 단계에 한 가지씩만 요청하는 것이 핵심입니다(공통 문서 「인스턴트 앱 만들기 총론」과 같은 원칙).

1) 계획부터

Ruby on Rails로 "웹 환율 모니터"를 만들 거야. 아직 코드는 짜지 말고,
- 무엇을 보여줄지(USD·EUR·JPY·CNY 원화 환산)
- 어떤 모델/화면/갱신 주기가 필요할지
plan.md로 먼저 정리해줘. 초보가 이해할 수 있게 MVC 역할도 표로 적어줘.

2) 앱 뼈대 + 리소스

plan.md대로 rails 새 앱을 만들고, Rate(currency:string, krw:decimal, as_of:datetime)
리소스를 scaffold로 생성한 뒤 db:migrate까지 해줘.
각 명령이 무엇을 하는지 한 줄씩 주석으로 설명도 붙여줘.

3) 환율 가져오기 로직

open.er-api.com/v6/latest/USD (키 없이 무료)에서 환율을 받아
USD·EUR·JPY·CNY를 원화로 환산해 Rate에 저장하는 서비스 객체를 만들어줘.
계산은 '1 외화 = 원화 ÷ 그 통화 환율'로. 실패 시 로그만 남기고 넘어가게.

4) 화면 다듬기

첫 화면(/)에 통화별 최신 환율을 카드로 보여주는 View를 만들어줘.
숫자는 천단위 콤마, 기준시각도 함께. 모바일에서도 보기 좋게.

5) 자동 갱신 + 배포

10분마다 환율을 갱신하는 백그라운드 Job을 만들고,
Render(또는 Railway)에 배포하는 방법을 단계별로 알려줘.
API키 같은 비밀값은 코드에 넣지 말고 서버 환경변수로 두게 해줘.
매 단계 끝에 "방금 만든 걸 브라우저에서 확인"을 요청하세요. 눈으로 동작을 본 뒤 다음 단계로 넘어가는 게 안전합니다.

Section 09

8. 오늘 챙길 용어 (최소한)

용어뜻 (한 줄)
Ruby사람이 읽기 쉬운 프로그래밍 언어
RailsRuby로 웹앱을 빠르게 만드는 프레임워크(레일)
MVCModel(데이터)·View(화면)·Controller(교통정리) 3역할
Route주소(URL)와 컨트롤러를 잇는 안내판
Active RecordSQL 대신 Ruby 문장으로 DB를 다루는 방식
MigrationDB 테이블 설계도(변경 이력)
ERBHTML 안에 Ruby 값을 끼워 넣는 화면 표기법
Gem / GemfileRuby 라이브러리(부품) / 그 목록
scaffold모델·뷰·컨트롤러를 한 번에 만드는 발판
CoC / DRY관습을 따르면 설정 최소 / 반복하지 말기

Section 10

9. 한 줄 정리

Rails는 "정해진 자리(MVC)에 내용만 채우면 웹 서비스가 굴러가게" 해주는 프레임워크입니다. 오늘 본 환율 모니터를 "웹으로 여러 명이 보게" 만들고 싶다면, 데스크톱 앱의 로직은 그대로 두고 그릇만 Rails로 바꾸면 됩니다. 계산·API·배포·상태코드 같은 뿌리 개념은 우리가 이미 배운 공통 문서와 그대로 이어집니다.