Backend/RubyOnRails

RubyOnRails Getting Start(Blog ๋งŒ๋“ค๊ธฐ) 1ํŽธ

Seyun(Marco) 2021. 2. 16. 19:51
728x90

RubyOnRails Getting Start(Blog ๋งŒ๋“ค๊ธฐ) 1ํŽธ

๐Ÿ’ผ ์„œ๋ก 

  • RubyOnRails Getting Started ์— ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ CURD ๋ฐ ๋Œ“๊ธ€ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ฐœ๋ฐœํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค
  • Ruby version์€ 2.6.3์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Ruby On Rails version์€ 5.2.1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ„ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

  • RubyMine์„ ์ด์šฉํ•ด File -> new -> Project... -> Application ๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ CLI์„ ์ด์šฉํ•ด rails new ํ”„๋กœ์ ํŠธ๋ช… ์„ ํ†ตํ•ด ์ƒ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €๋Š” ํ”„๋กœ์ ํŠธ ๋ช…์„ blog๋ผ๊ณ  ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽ default Fild & Folder ๊ตฌ์กฐ

[RubyOnRails] rails new File & Folder

๐ŸŽฌ webServer Start

  • binํด๋”์— rails๊ฐ€ ์žˆ๊ณ  rails์—๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •์ด ์ด๋ฏธ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ webServer๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
bin/rails server
  • dafult port๋Š” 3000์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
http://localhost:3000

ruby_on_rails_getting_start_blog_1-1

  • ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ์‹ฌ์ง€์–ด ๊ณ ์–‘์ด๊นŒ์ง€ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋ ˆ์ผ์ฆˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๋ฐ˜๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Ž
  • ctrl + c๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„œ๋ฒ„๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™ ์ค‘์—๋„ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ์‹œ์—๋Š” ์ค‘์ง€ํ•  ํ•„์š”๊ฐ€ ๋งŽ์ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‹ Hello, Rails

  • ์ƒˆ๋กœ์šด ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Hello, World๋ฅผ ๋จผ์ € ๋„์–ด ๋ด์•ผ ๊ฒ ์ฃ !?
  • rails์˜ ๋˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” generate(g) ๋กœ controller์™€ view๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Welcome์ด๋ผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ index์˜ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉฐ, ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.
bin/rails generate controller Welcome index
  • welcome_controller.rb
class WelcomeController < ApplicationController
  def index
  end
end
  • view(index.html.erb)์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
<h1>Hello, Rails!</h1>

โˆš Root ์„ค์ •

  • Root(/) ์— ์ ‘์†ํ•˜๋ฉด ๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ Hello, Rails๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ์„ค์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
  • ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์€ config/routes.rb ์ž…๋‹ˆ๋‹ค.
Rails.application.routes.draw do
  get 'welcome/index'

  root 'welcome/index'
end
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Hello, Rails! ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค.

๐Ÿ“ฐ resource ์„ค์ •

  • Rails๋Š” resources๋ฅผ ์„ค์ •ํ•ด ํ‘œ์ค€ REST API๋ฅผ ๊ตฌ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
  • config/routes.rb ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•œ ํ›„ routes ๋ชฉ๋ก์„ ๋ณด๋ฉด REST API๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Rails.application.routes.draw do
  get 'welcome/index'

  resources :articles

  root 'welcome#index'
end
  • bin/rails routes ์‹คํ–‰
Prefix Verb   URI Pattern                                                                              Controller#Action
            welcome_index GET    /welcome/index(.:format)                                                                 welcome#index
                 articles GET    /articles(.:format)                                                                      articles#index
                          POST   /articles(.:format)                                                                      articles#create
                  article GET    /articles/:id(.:format)                                                                  articles#show
                          PATCH  /articles/:id(.:format)                                                                  articles#update
                          PUT    /articles/:id(.:format)                                                                  articles#update
                          DELETE /articles/:id(.:format)                                                                  articles#destroy
                     root GET    /                                                                                        welcome#index

๐Ÿ“ฐ Article Create ๋งŒ๋“ค๊ธฐ

  • ์ผ๋‹จ Article Contoller๋ฅผ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
bin/rails g controller Articles
  • articles_controller.rb
class ArticlesController < ApplicationController
end
  • ์•„๋ž˜์™€ ๊ฐ™์ด new๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  /articles/new ๋กœ ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
class ArticlesController < ApplicationController
  def new

  end
end

ruby_on_rails_getting_start_blog_1-2

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด new ๋ผ๋Š” view๋ฅผ ๊ฐ€์งˆ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ, new ๋ผ๋Š” view๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹น์—ฐํžˆ view๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด์ฃ 
  • views/articles/new.html.erb
<h1>New Article</h1>

Form

  • form์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. views/articles/new.html.erb ์— ์•„๋ž˜์™€ ๊ฐ™์ด form์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
<%= form_with scope: :article, local: true do |form| %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>

  <p>
    <%= form.label :text %><br>
    <%= form.text_area :text %>
  </p>

  <p>
    <%= form.submit %>
  </p>
<% end %>

ruby_on_rails_getting_start_blog_1-3

  • rails๋Š” form_with์œผ๋กœ ํผ์„ ๋งŒ๋“ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ scope๋กœ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š” form์ธ์ง€ ์•Œ๋ ค์ฃผ๋ฉฐ text_filed, text_area์—๊ฒŒ ์–ด๋–ค ํ•„๋“œ๋ฅผ ์ €์žฅํ• ์ง€ ์•Œ๋ ค์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ url๋กœ ์„ค์ •ํ•˜๋ ค๊ณ  ํ• ๋•Œ url ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
<%= form_with scope: :article, url: articles_path, local: true do |form| %>
  • ๊ธฐ๋ณธ์ ์œผ๋กœ rails๋Š” form action์— REST API์˜ POST๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด create๊ฐ€ ์—†๋‹ค๊ณ  ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์€ ์œ„์—์„œ๋„ ๋ดค๋˜ routes์—์„œ๋„ ๋ณด๋ฉด create๋ฅผ ์˜๋ฏธํ•˜๋Š” POST๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋–„ ์šฐ๋ฆฌ๋Š” ์•„์ง create๋ฅผ ์ •์˜ํ•ด์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
Prefix Verb   URI Pattern             Controller#Action
articles GET    /articles(.:format)   articles#index
                 POST   /articles(.:format)   articles#create

๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ create ํ•จ์ˆ˜

  • articles_controller.rb ์—๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด create ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์ค€๋‹ค.
class ArticlesController < ApplicationController
  def new

  end

  def create
    render plain: params[:article].inspect
  end
end
  • ํผ์„ ์ œ์ถœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
<ActionController::Parameters {"title"=>"1234", "text"=>"1234"} permitted: false>
  • ํผ์—์„œ ์ž…๋ ฅํ•œ article์˜ ์ „์ฒด param์„ ๋งŒ์•„ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, inspect๋Š” ๋””๋ฒ„๊น…์šฉ์œผ๋กœ ํด๋ž˜์Šค ์ด๋ฆ„, ์ธ์Šคํ„ด์Šค์˜ object id ๋“ฑ์„ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐ŸŽจ ๋ชจ๋ธ ์ƒ์„ฑ

  • Rails์˜ ๋ชจ๋ธ์€ ๋‹จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ DB ํ…Œ์ด๋ธ”์€ ๋ณต์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ์‰ฝ๊ฒŒ model์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ bin/rails generate model Article title:string text:text
  • ์•„๋ž˜์™€ ๊ฐ™์ด model์™€ db migrate๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • migrate ํŒŒ์ผ๋ช…์€ YYYYMMDDHHMMSS_create_๋ชจ๋ธ๋ช….rb ์ž…๋‹ˆ๋‹ค.
class Article < ApplicationRecord
end
class CreateArticles < ActiveRecord::Migration[5.2]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :text

      t.timestamps
    end
  end
end
  • ๋ฃจ๋น„๋Š” ์œ„์˜ migrate ํŒŒ์ผ๋กœ ์‰ฝ๊ฒŒ DB ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค.
$ bin/rails db:migrate
==  CreateArticles: migrating ==================================================
-- create_table(:articles)
   -> 0.0019s
==  CreateArticles: migrated (0.0020s) =========================================

๐Ÿ  article create DB ์ €์žฅ

  • articles_controller.rb
class ArticlesController < ApplicationController
  def create
    @article = Article.new(params[:article])

    @article.save

    redirect_to @article
  end
end
  • :article param์„ ์ด์šฉํ•ด์„œ Article ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  save ํ•จ์ˆ˜๋กœ DB๋กœ ์ €์žฅ
  • ๊ทธ๋Ÿฌ๋‚˜ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ruby_on_rails_getting_start_blog_1-4

  • Rails๋Š” ๋ช‡๊ฐ€์ง€ ๋ณด์•ˆ์‚ฌํ•ญ์„ ์ ์šฉํ•ด๋†จ๋Š”๋ฐ, ์ง€๊ธˆ ๋ฌธ์ œ๋Š” strong paramters๋ผ๋Š” ๋ฌธ์ œ๋กœ ์ •ํ™•ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋ชจ๋‘ ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@article = Article.new(params.require(:article).permit(:title, :text))
  • ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ณด์•ˆ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋  ์ˆ˜ ์—†๋„๋ก private์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
class ArticlesController < ApplicationController
  def create
    @article = Article.new(article_params)

    @article.save

    redirect_to @article
  end

  private
  def article_params
    params.require(:article).permit(:title, :text)
  end
end
  • ์ดํ›„์— ์–‘์‹์„ ์ œ์ถœํ•˜๋ฉด show Action์„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ show Action์„ ์ •์˜ํ•ด๋ณด์ž.

๐ŸŽซ Article Show

  • articles_controller.rb
class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id])
  end
end
  • find๋ฅผ ์ด์šฉํ•ด id๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์‰ฝ๊ฒŒ ๋ชจ๋ธ์„ ์ฐพ์„์ˆ˜ ์žˆ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • show view๋ฅผ ์ •์˜ํ•ด๋ด…์‹œ๋‹ค.

  • show.html.erb

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
  • ํผ์„ ์ œ์ถœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ruby_on_rails_getting_start_blog_1-5

๊ฒฐ๋ก 

  • RubyOnRails๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ REST API๋“ค์„ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๋ฉด ์ƒ์„ฑํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ํ›จ์”ฌ ๋” ์ง‘์ค‘ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ORM ๊ธฐ๋Šฅ์œผ๋กœ DB ์ฟผ๋ฆฌ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์ธ์ ์œผ๋กœ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜จ๋‹ค๋Š” ์ ๊ณผ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋ผ ๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋ฒ„๋ฅผ ๋‚ด๋ ธ๋‹ค ์˜ฌ๋ฆฌ์ง€ ์•Š์•„๋„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋Š” ์ ๋„ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ controller Action๊ณผ view์˜ ๋งคํ•‘์ด ํด๋” ๋ฐ ํŒŒ์ผ๋ช…์œผ๋กœ ๋˜๋‹ˆ, ๊ธฐ๋ณธ ๋ผ์šฐํŒ… ์„ค์ •๋“ค์ด ๊ฐ„๋‹จํ•˜๋Š” ๊ฑธ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • 2ํŽธ์—์„œ๋Š” ๋ชจ๋“  Article์„ ์กฐํšŒํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜

Getting Started with Rails - Ruby on Rails Guides

728x90
728x90