Rails 시작하기 — 첫 애플리케이션과 MVC 흐름

Rails 시작하기 — 첫 애플리케이션과 MVC 흐름

Rails를 처음 만지는 순간 "어디서부터 시작하지?"라는 질문이 먼저 떠오를 거예요. Getting Started 가이드는 설치부터 첫 애플리케이션의 골격을 잡고, 게시판 하나를 완성해 보기까지의 전체 흐름을 한 번에 보여줘요. 이 글을 따라가면 블로그 같은 간단한 CRUD 앱이 만들어지는 과정에서 Rails가 요청을 다루는 방식(Model·View·Controller)을 자연스럽게 익히게 돼요.

출처: Getting Started with Rails

본문

Rails 설치와 프로젝트 생성

Rails는 gem으로 설치하고, new 명령으로 프로젝트를 만들 수 있어요.

gem install rails
rails new blog
cd blog

rails new blog는 루비 버전, 데이터베이스 설정, 기본 디렉터리 구조까지 갖춘 완전한 애플리케이션 골격을 만들어줘요. 개발 서버는 아래 명령으로 띄워요.

bin/rails server

브라우저에서 http://localhost:3000에 접속하면 기본 환영 페이지를 볼 수 있어요.

MVC 구조

Rails 애플리케이션은 세 층으로 나뉘어요. 이 구조가 요청이 실제 코드를 거쳐 응답이 되는 경로를 결정해요.

  • Model — 데이터와 그 규칙을 담당해요. Active Record가 데이터베이스와 연결해요.
  • View — 응답으로 보여줄 HTML을 만들어요. ERB 템플릿을 써요.
  • Controller — 요청을 받아 모델과 뷰를 이어주는 중간 역할이에요.

브라우저가 URL을 요청하면 라우터가 해당 콘트롤러 액션으로 보내고, 액션은 모델을 다룬 뒤 뷰를 렌더링하고, 그 결과가 브라우저에 돌아가요. 이 한 바퀴가 Rails의 요청 사이클이에요.

첫 페이지 만들기

rails g controller로 콘트롤러와 함께 뷰의 뼈대를 만들 수 있어요.

bin/rails generate controller articles index

이 명령은 ArticlesControllerindex 액션, 그리고 app/views/articles/index.html.erb 뷰를 만들어요. 콘트롤러 쪽을 살펴보면 이렇게 생겼어요.

class ArticlesController < ApplicationController
  def index
  end
end

뷰는 app/views/articles/index.html.erb에 두고, 템플릿 안에서 루비 코드를 <% %> 안에 섞어 써요.

<h1>Hello, Rails!</h1>

이제 http://localhost:3000/articles/index에 접속하면 이 화면을 볼 수 있어요.

라우트 연결하기

콘트롤러와 URL을 연결하는 것은 라우터의 몫이에요. config/routes.rb에서 루트와 리소스를 정의해요.

Rails.application.routes.draw do
  root "articles#index"
  resources :articles
end

root "articles#index"는 홈 주소(/)를 ArticlesController#index로 연결해요. resources :articles는 게시글 리소스의 표준 CRUD 라우트 일곱 개를 한 번에 만들어줘요.

루트 확정하기

루트 라우트를 정의했다면 bin/rails routes로 라우트가 올바르게 잡혔는지 확인할 수 있어요. rails new가 만든 기본 config/routes.rb에는 주석으로 원하는 루트를 적으라는 안내가 들어 있어요. 루트를 적지 않으면 /에 접속했을 때 기본 환영 페이지가 뜨죠.

모델을 만들고 연결하기

게시글을 다루려면 모델이 필요해요. 모델과 마이그레이션을 함께 생성해요.

bin/rails generate model Article title:string body:text

이 명령은 Article 모델과 create_articles 마이그레이션을 만들어요. 마이그레이션을 적용하면 articles 테이블이 생겨요.

bin/rails db:migrate

데이터를 화면에 보여주는 콘트롤러

게시글 목록을 보여주도록 콘트롤러를 채워요. 액션 안에서 모델을 조회하고 인스턴스 변수에 담으면 뷰에서 그대로 쓸 수 있어요.

class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end
end

뷰에서는 @articles를 순회하며 각 글을 표시해요.

<% @articles.each do |article| %>
  <h2><%= article.title %></h2>
  <p><%= article.body %></p>
<% end %>

폼을 만들고 저장하기

새 글을 만들려면 newcreate 액션을 넣고, 폼 헬퍼로 입력 화면을 만들어요. form_with는 모델을 알면 자동으로 알맞은 경로와 필드를 만들어줘요.

<%= form_with model: @article do |form| %>
  <%= form.text_field :title %>
  <%= form.text_area :body %>
  <%= form.submit %>
<% end %>

콘트롤러의 create 액션에서 받은 파라미터로 레코드를 만들고, 저장이 끝나면 목록으로 되돌아가게 해요.

def create
  @article = Article.new(article_params)
  if @article.save
    redirect_to articles_path
  else
    render :new
  end
end

private

def article_params
  params.require(:article).permit(:title, :body)
end

어디서 흐름이 끊겼는지 궁금할 땐 서버 로그를 보면 돼요. 요청이 어떤 라우트를 거쳐 어떤 렌더로 이어졌는지가 그대로 남아 있어요.

더 알아보기 (Learn more)