웹 프레임워크 루비 온 레일즈 단계별 이해
웹 프레임워크 Rails를 MVC·라우트·마이그레이션 등 단계별로 설명. 최지혜 님 환율 모니터를 '웹앱으로 만든다면'으로 매핑해 데스크톱 앱과 비교하고, Claude Code로 만드는 요청 흐름까지.
개념 설명용 요약
정해진 자리(MVC)에 내용만 채우면 웹앱이 굴러가는 프레임워크.
Model(데이터)·View(화면)·Controller(교통정리)+주소 안내판.
최지혜 님 데스크톱 앱을 웹앱으로 바꾸면 어떻게 되는지.
이 문서는 웹 프레임워크 "Ruby on Rails(레일즈)"가 무엇이고, 어떤 순서로 웹앱을 만드는지를 비개발자도 따라올 수 있게 단계별로 설명합니다. 예제는 오늘 다 함께 본 최지혜 님의 실시간 환율 모니터를 사용합니다. 단, 최지혜 님이 받은 실습 키트는 *Electron 데스크톱 앱*이고, 이 문서는 "같은 환율 모니터를 웹사이트(웹앱)로 만든다면 Rails로 어떻게 되는가"를 보여주는 것입니다. 개념을 잇기 위한 대응이지, 키트를 Rails로 바꾸는 것은 아닙니다.
0. 한 줄 정의 — 레일즈가 뭔가
Ruby on Rails = "Ruby라는 언어로 웹사이트(웹앱)를 빠르게 만들게 해주는 도구 세트(프레임워크)".
- Ruby(루비) = 프로그래밍 언어. 사람이 읽기 쉬운 문법이 특징.
- Rails(레일즈) = 그 Ruby로 웹앱을 만들 때 반복되는 일들(주소 연결·DB 저장·화면 그리기)을 미리 깔아둔 레일(기찻길). 우리는 레일 위에 내용만 얹으면 됩니다.
왜 "프레임워크"인가? 집을 지을 때 기둥·배관·전기 배선을 매번 새로 설계하지 않고 골조가 미리 있는 것과 같습니다. Rails는 웹앱의 골조를 제공하고, 우리는 방 배치(우리 기능)만 정합니다. 그래서 "레일 위를 달린다"는 이름이 붙었습니다.
언제 쓰나? 로그인·데이터 저장·여러 사람이 접속하는 웹 서비스를 만들 때. (예: 게시판, 쇼핑몰, 관리자 대시보드, 그리고 오늘 예로 드는 "웹으로 접속하는 환율 모니터")
1. 오늘의 예제 — 최지혜 님 환율 모니터를 웹앱으로
최지혜 님 프로그램이 하는 일을 웹앱 관점에서 다시 적으면:
- 외부에서 현재 환율을 가져온다 (USD·EUR·JPY·CNY → 원화)
- 그 값을 화면에 보기 좋게 보여준다
- 값을 기록(저장) 해두고, 시간이 지나면 자동으로 새로 갱신한다
- 특정 값(임계값)을 넘으면 알람을 준다
| 최지혜 님 데스크톱 앱(Electron) | 같은 걸 웹앱(Rails)으로 하면 |
|---|---|
| 내 PC에 설치해서 실행 | 브라우저 주소(URL)로 누구나 접속 |
| 창(Window)에 화면을 그림 | View(HTML 화면)를 서버가 그려서 보냄 |
| JS로 환율 API 호출 | 서버가 환율 API 호출 후 저장 |
| 로컬 파일에 기록 | DB(데이터베이스)에 기록 |
| 앱을 켜둬야 갱신 | 서버가 항상 떠서 자동 갱신 |
핵심 차이: 데스크톱 앱은 "각자 PC에서 돈다", 웹앱(Rails)은 "서버 한 곳에서 돌고 여러 명이 접속한다". 어느 게 옳고 그름이 아니라 용도가 다릅니다(6장 비교표 참고).
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%는 이해한 것입니다. 나머지는 "각 담당을 어떻게 채우느냐"입니다.
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,
whenevergem)로 등록. - 임계값 알람 = 데스크톱 앱의 알람과 같은 개념을, 서버에서 이메일/슬랙 등으로.
7단계 — 배포: 세상에 공개
로컬(내 PC)에서만 되던 걸 URL로 누구나 접속하게 올립니다.
- 대표 방법: Render, Railway, Fly.io, Heroku 등에 배포(요즘은 명령 몇 줄).
- 배포 시 함께 챙길 것: DB 연결, 환경변수(API키 등)를
.env가 아닌 서버 비밀값으로, HTTPS.
여기서 개발환경·API·배포·상태코드 개념은 공통 문서 [개발환경 설치 가이드]·[API 연동 안내]·[웹 구성 기초]와 그대로 이어집니다.
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 패키지와 같은 개념입니다.
5. Rails의 철학 — 왜 빠른가
Rails가 유명해진 두 원칙:
- CoC (Convention over Configuration, 설정보다 관습) — 정해진 규칙(파일 이름·위치)을 따르면 설정을 거의 안 해도 자동으로 연결됩니다.
Rate모델 →rates테이블 →RatesController→rates/뷰가 이름만으로 이어집니다. - DRY (Don't Repeat Yourself, 반복하지 마라) — 같은 코드를 여러 번 쓰지 않도록 구조가 유도합니다.
Rails는 "정해진 자리에 정해진 이름으로 넣으면 알아서 굴러가는" 프레임워크입니다. 그래서 웹 서비스를 놀랄 만큼 빨리 만들 수 있습니다.
6. 언제 Rails? 언제 데스크톱 앱? (최지혜 님 키트와 비교)
| 상황 | 알맞은 선택 | 이유 |
|---|---|---|
| 나 혼자 내 PC에서 상시 띄워두고 알람 | 데스크톱 앱(Electron) — 최지혜 님 키트 | 설치형·오프라인·OS 알림에 강함 |
| 여러 사람이 접속, 로그인·기록 공유 | 웹앱(Rails 등) | URL 하나로 공유, 서버에 데이터 축적 |
| 빠른 개인 도구·자동화 스크립트 | Python 스크립트 (김성범 님 트랙) | 계산·수집·문서화에 최적 |
| 문서 여러 형식 자동 생성 | 문서 파이프라인(FaveCast 사례) | 원본 하나 → 다형식 파생 |
오늘 Rails를 배우는 목적은 "앞으로 웹 서비스로 키우고 싶을 때 어떤 그림인지"를 갖는 것입니다. 최지혜 님 환율 모니터는 지금은 데스크톱으로 충분하고, "여러 명이 웹으로 보게 하고 싶다"가 되는 순간 Rails 같은 웹 프레임워크가 답이 됩니다.
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키 같은 비밀값은 코드에 넣지 말고 서버 환경변수로 두게 해줘.
매 단계 끝에 "방금 만든 걸 브라우저에서 확인"을 요청하세요. 눈으로 동작을 본 뒤 다음 단계로 넘어가는 게 안전합니다.
8. 오늘 챙길 용어 (최소한)
| 용어 | 뜻 (한 줄) |
|---|---|
| Ruby | 사람이 읽기 쉬운 프로그래밍 언어 |
| Rails | Ruby로 웹앱을 빠르게 만드는 프레임워크(레일) |
| MVC | Model(데이터)·View(화면)·Controller(교통정리) 3역할 |
| Route | 주소(URL)와 컨트롤러를 잇는 안내판 |
| Active Record | SQL 대신 Ruby 문장으로 DB를 다루는 방식 |
| Migration | DB 테이블 설계도(변경 이력) |
| ERB | HTML 안에 Ruby 값을 끼워 넣는 화면 표기법 |
| Gem / Gemfile | Ruby 라이브러리(부품) / 그 목록 |
| scaffold | 모델·뷰·컨트롤러를 한 번에 만드는 발판 |
| CoC / DRY | 관습을 따르면 설정 최소 / 반복하지 말기 |
9. 한 줄 정리
Rails는 "정해진 자리(MVC)에 내용만 채우면 웹 서비스가 굴러가게" 해주는 프레임워크입니다. 오늘 본 환율 모니터를 "웹으로 여러 명이 보게" 만들고 싶다면, 데스크톱 앱의 로직은 그대로 두고 그릇만 Rails로 바꾸면 됩니다. 계산·API·배포·상태코드 같은 뿌리 개념은 우리가 이미 배운 공통 문서와 그대로 이어집니다.