Ruby on Rails 아키텍처 가이드

비개발자도 이해할 수 있는 웹 애플리케이션의 구조와 동작 원리

1 전체 구조: 사용자 요청부터 응답까지

사용자 브라우저/앱
인터넷 DNS/IP
서버 Docker/Kamal
Rails 웹 애플리케이션

요청 흐름 설명

  1. 1 사용자가 브라우저에서 heyjames.ai 주소를 입력합니다
  2. 2 DNS가 도메인을 서버 IP 주소(예: 123.45.67.89)로 변환합니다
  3. 3 서버가 요청을 받아 Docker 컨테이너 안의 Rails 앱으로 전달합니다
  4. 4 Rails가 요청을 처리하고 HTML 페이지를 만들어 사용자에게 돌려줍니다

2 Ruby와 Rails의 관계

Ruby

프로그래밍 언어

Ruby는 프로그래밍 언어입니다. 사람이 읽기 쉽고 직관적인 문법을 가지고 있어 "개발자의 행복"을 추구합니다.

Ruby 코드 예시:

puts "안녕하세요!"

Rails

웹 프레임워크

Rails는 Ruby로 만들어진 웹 프레임워크입니다. 웹사이트를 빠르게 만들 수 있도록 미리 준비된 도구와 규칙을 제공합니다.

Rails가 제공하는 것:

MVC 구조, 라우팅, 보안, DB 연결 등

쉬운 비유

🔤

Ruby = 한국어

의사소통을 위한 언어 그 자체

📝

Rails = 계약서 양식

한국어로 계약서를 빠르게 작성할 수 있도록 미리 만들어진 템플릿

3 Gem: 레고 블록처럼 조립하는 라이브러리

Gem이란?

Ruby 라이브러리 패키지

Gem은 다른 개발자들이 만들어 놓은 코드 묶음입니다. 필요한 기능을 직접 만들지 않고, Gem을 설치해서 바로 사용할 수 있습니다.

Gemfile에 추가:

gem "bcrypt" # 비밀번호 암호화

자주 사용하는 Gem 예시

bcrypt

비밀번호 암호화

image_processing

이미지 크기 조절, 변환

resend

이메일 발송

kaminari

페이지네이션 (1, 2, 3 페이지)

Gemfile = 쇼핑 목록

프로젝트에서 사용할 모든 Gem을 Gemfile에 적어둡니다. bundle install 명령어로 한 번에 설치합니다.

# Gemfile

gem "rails", "~> 8.0"

gem "bcrypt"

gem "tailwindcss-rails"

4 Routes: URL 교통 정리

Routes란?

URL과 Controller 연결

사용자가 특정 URL에 접속했을 때, 어떤 Controller의 어떤 동작을 실행할지 정의합니다. 웹사이트의 교통 안내판 역할을 합니다.

Routes 예시

# config/routes.rb

get "/courses" , to: "courses#index"
get "/courses/:id" , to: "courses#show"
post "/login" , to: "sessions#create"

URL 요청 처리 흐름

사용자

/courses 접속

Routes

경로 확인

Controller

courses#index

View

HTML 응답

5 Rails MVC 아키텍처

Model

데이터 & 비즈니스 로직

데이터베이스와 소통하는 역할을 합니다. 사용자 정보, 강의 정보 등 모든 데이터를 저장하고 불러옵니다.

# app/models/user.rb

사용자의 이름, 이메일, 비밀번호 등을 관리

app/models/

View

화면 & 사용자 인터페이스

사용자에게 보여지는 화면을 만듭니다. HTML, CSS로 구성된 웹페이지를 생성합니다.

# app/views/home/index.html.erb

홈페이지의 레이아웃과 디자인을 담당

app/views/

Controller

요청 처리 & 중재자

사용자 요청을 받아 적절한 Model에서 데이터를 가져오고, View에 전달해 화면을 만듭니다.

# app/controllers/courses_controller.rb

강의 목록 보기, 수강 신청 등 처리

app/controllers/

MVC 동작 흐름

사용자 요청

/courses 접속

Controller

요청 분석

Model

데이터 조회

View

HTML 생성

응답

화면 표시

6 Migration과 Model: 데이터 구조 관리

Migration

데이터베이스 설계도

Migration은 데이터베이스의 테이블 구조를 정의합니다. 어떤 테이블에 어떤 컬럼(필드)이 있는지 설계도처럼 작성합니다.

# db/migrate/create_users.rb

create_table :users do |t|

t.string :name

t.string :email

t.timestamps

end

Model

데이터 조작 담당

Model은 데이터베이스와 실제로 소통합니다. 데이터 저장, 조회, 수정, 삭제와 유효성 검사를 담당합니다.

# app/models/user.rb

class User < ApplicationRecord

validates :email, presence: true

has_many :enrollments

end

왜 Migration과 Model을 분리했나?

버전 관리

Migration은 데이터베이스 변경 이력을 기록합니다. 언제 어떤 컬럼이 추가되었는지 추적할 수 있습니다.

팀 협업

여러 개발자가 동시에 작업해도, Migration 파일로 데이터베이스 구조를 동기화할 수 있습니다.

Migration → Database → Model 흐름

Migration

구조 정의

rails db:migrate

Database

테이블 생성

데이터 조작

Model

CRUD 작업

7 프론트엔드: 사용자가 보는 화면

ERB Views

HTML + Ruby 템플릿

HTML 안에 Ruby 코드를 넣을 수 있는 템플릿입니다. <%= user.name %>처럼 동적인 데이터를 화면에 표시합니다.

예시: 사용자 이름 표시

안녕하세요, <%= @user.name %>님!

Hotwire

빠른 페이지 업데이트

페이지 전체를 다시 불러오지 않고 필요한 부분만 빠르게 업데이트합니다. 앱처럼 부드러운 사용자 경험을 제공합니다.

Turbo: 페이지 이동 가속화
Stimulus: 간단한 JavaScript 동작

Tailwind CSS

유틸리티 기반 스타일링

미리 정의된 클래스를 조합해 디자인합니다. bg-blue-500처럼 직관적인 이름으로 스타일을 적용합니다.

예시:

class="bg-red-500 text-white p-4 rounded-lg"

8 데이터베이스: 정보 저장소

SQLite

파일 기반 데이터베이스

모든 데이터가 하나의 파일에 저장됩니다. 별도 서버가 필요 없어 간편하고, 소규모~중규모 서비스에 적합합니다.

저장 위치:

storage/production.sqlite3

데이터 구조 예시

users 테이블

id, name, email, password, created_at

courses 테이블

id, title, description, price, instructor_id

enrollments 테이블

id, user_id, course_id, progress, completed_at

9 Solid 시리즈: Rails 8의 통합 인프라

Solid Queue

백그라운드 작업 처리
이메일 발송, 이미지 처리 등 시간이 오래 걸리는 작업을 뒤에서 처리합니다.

예시 작업:

  • • 회원가입 환영 이메일 발송
  • • 동영상 인코딩
  • • 결제 완료 알림

Solid Cache

데이터 캐싱
자주 조회되는 데이터를 저장해두고 빠르게 제공합니다. 서버 부하를 줄여줍니다.

캐싱 대상:

  • • 강의 목록 페이지
  • • 사용자 세션 정보
  • • API 응답 데이터

Solid Cable

실시간 통신
서버와 브라우저 간 실시간 양방향 통신을 지원합니다. WebSocket 기반입니다.

활용 예시:

  • • 실시간 채팅
  • • 알림 푸시
  • • 라이브 업데이트

Solid 시리즈 연결 구조

Queue
Cache

SQLite

Cable

모든 Solid 시리즈는 SQLite 데이터베이스를 저장소로 사용합니다. 별도의 Redis나 외부 서비스 없이 하나의 데이터베이스로 모든 기능을 처리합니다.

10 배포: 코드를 서버에 올리기

Docker

컨테이너 기술

애플리케이션을 "컨테이너"라는 격리된 환경에 담아 실행합니다. 어떤 서버에서든 동일하게 동작하도록 보장합니다.

컨테이너에 포함된 것:

Ruby Rails 라이브러리 앱 코드

Kamal

배포 자동화 도구

Docker 컨테이너를 서버에 배포하는 과정을 자동화합니다. 한 줄 명령어로 새 버전을 서버에 올릴 수 있습니다.

배포 명령어:

kamal deploy

배포 과정

코드 작성

Docker

배포

11 도메인, IP, 서버의 관계

쉬운 비유로 이해하기

🏠

도메인 = 집 주소

"서울시 강남구 123번지"

heyjames.ai

📍

IP = GPS 좌표

"37.5665, 126.9780"

123.45.67.89

🏢

서버 = 실제 건물

"데이터센터의 컴퓨터"

AWS / Vultr

DNS: 도메인을 IP로 변환

사용자가 입력

heyjames.ai
DNS 조회

서버 IP 주소

123.45.67.89
연결

Rails 앱 응답

12 클라이언트-서버 통신 구조

HTTP 요청 (Request)

GET /courses

강의 목록 페이지 요청

POST /login

로그인 정보 전송

PUT /profile

프로필 정보 수정

DELETE /comments/1

댓글 삭제

HTTP 응답 (Response)

200 OK

요청 성공, HTML 페이지 반환

302 Redirect

다른 페이지로 이동

404 Not Found

페이지를 찾을 수 없음

500 Server Error

서버 내부 오류

전체 통신 흐름

클라이언트

브라우저 / 앱

Request
Response

Rails 서버

heyjames.ai

Query
Result

Database

SQLite

13 Hotwire Native: 웹에서 앱스토어까지

하나의 코드로 웹 + 앱

Hotwire Native (iOS/Android)

Rails로 개발한 웹 서비스를 네이티브 앱으로 감싸 App Store와 Google Play에 출시할 수 있습니다. 별도의 앱 개발 없이 웹 코드를 그대로 활용합니다.

App Store Google Play

네이티브 기능 연동

푸시 알림

FCM/APNs 연동

블루투스

IoT 기기 연결

카메라 / 갤러리

사진/동영상 촬영 및 업로드

위치 정보

GPS 기반 서비스

웹 → 앱 변환 구조

Rails 웹앱

HTML/CSS/JS

Hotwire Native

웹뷰 + 브릿지

iOS

Android

네이티브 기능이 필요한 부분만 Swift/Kotlin으로 작성하고, 나머지는 웹 코드를 그대로 사용

14 Rails 프로젝트 폴더 구조

app/ ← 핵심 코드
controllers/ 요청 처리
models/ 데이터 모델
views/ 화면 템플릿
javascript/ JS 코드
helpers/ 도우미 함수
config/ ← 설정 파일
routes.rb URL 경로 설정
database.yml DB 연결 설정
db/ ← 데이터베이스
migrate/ DB 스키마 변경
public/ ← 정적 파일
이미지, 에러 페이지 등
storage/ ← 저장소
SQLite DB, 업로드 파일
Gemfile ← 라이브러리 목록
Dockerfile ← Docker 설정
.kamal/ ← 배포 설정

Rails로 직접 만들어보고 싶다면?

헤이제임스에서 AI 코딩과 Rails를 활용한 실전 프로젝트를 함께 만들어보세요.

강의 둘러보기