Ruby on Rails 가이드로 시작하기
공식 문서가 제공하는 가이드를 이용해 Ruby on Rails를 시작해보자.
1. 설치
1-1. Ruby 설치
Rails에는 Ruby 버전 3.2.0 이상이 필요하다. 아래 공식 문서에 바탕해 설치했다. homebrew를 사용 중이라서 brew install ruby 명령어 한 줄로 간단하게 설치 가능했다. stable version인 3.3.6으로 설치했다.
이때 macOS에 기본적으로 포함된 Ruby가 PATH에서 우선적으로 호출되어 버전을 확인했을 때 아래와 같이 뜨는 문제가 있었다.
> ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]
Ruby
복사
이를 해결하기 위해 PATH를 수정해주었다.
> brew --prefix ruby
/opt/homebrew/opt/ruby
> sudo vim ~/.zshrc
export PATH=“/opt/homebrew/opt/ruby/bin:$PATH” # 파일 맨 아래에 추가 후 저장
> ruby -v
ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [arm64-darwin23]
Ruby
복사
1-2. SQLite3 설치
SQLite3 데이터베이스 설치도 필요하다. brew를 이용해 간단하게 깔았다.
> brew install sqlite
> sqlite3 --version
3.43.2 2023-10-10 13:08:14 1b37c146ee9ebb7acd0160c0ab1fd11017a419fa8a3187386ed8cb32b709aapl (64-bit)
Ruby
복사
1-3. Rails 설치
RubyGems를 통해 Rails 라이브러리를 설치했다.
> sudo gem install rails
Ruby
복사
이때 아래와 같이 rails 명령어 사용이 불가한 문제가 발생했었다.
> sudo gem install rails
> rails --version
Rails is not currently installed on this system. To get the latest version, simply type:
$ sudo gem install rails
You can then rerun your "rails" command.
Ruby
복사
절대 경로를 지정한 rails 명령어는 사용이 가능했기에 Rails 설치 자체엔 문제가 없다 판단했다.
> /opt/homebrew/lib/ruby/gems/3.3.0/bin/rails --version
Rails 8.0.0
Ruby
복사
type 명령어를 쳐보면, 현재 사용 중인 rails 명령이 /usr/bin/rails로 설정되어 있었다. 아마 MacOS 기본 시스템에서 제공하는 오래된 Rails 버전 때문인 것 같다.
> type rails
rails is /usr/bin/rails
Ruby
복사
homebrew에서 설치한 Rails 경로가 /usr/bin/rails보다 먼저 탐색되게 하기 위해 환경 설정을 수정해주어 해결했다.
> sudo vim ~/.zshrc
export PATH=/opt/homebrew/lib/ruby/gems/3.3.0/bin:$PATH # 파일 맨 아래에 추가 후 저장
> source ~/.zshrc
> type rails
rails is /opt/homebrew/lib/ruby/gems/3.3.0/bin/rails
> rails --version
Rails 8.0.0
Ruby
복사
2. 라우팅
2-1. 블로그 애플리케이션 생성
원하는 경로에서 아래 명령어를 입력하면 blog 어플리케이션에 blog 디렉터리에 만들어진다.
> rails new blog
> cd blog
Ruby
복사
2-2. Rails 애플리케이션 서버 실행
blog 디렉터리에서 아래 명령어를 입력하면 웹 서버를 실행할 수 있다. 이렇게 하면 기본적으로 Rails 와 함께 배포되는 웹 서버인 Puma가 시작된다. 애플리케이션이 작동하는 모습을 보려면, http://localhost:3000 으로 이동하면 된다. control+c 를 입력해 중지할 수 있다. 참고로 서버가 동작하는 동안엔 파일에서 변경한 내용이 서버에 자동으로 들어가기에 서버를 재시작할 필요 없다.
> bin/rails server
Ruby
복사
2-3. “Hello, Rails!” 텍스트 띄우기
Rails에서 “Hello, Rails!” 텍스트를 띄우려면 최소한 route, controller action, view가 필요하다.
•
route: 요청을 controller action에 매핑한다.
◦
Ruby DSL로 작성된 규칙으로 구현된다.
•
controller action: 요청을 처리하는 데 필요한 작업을 수행하고, view에 대한 모든 데이터를 준비한다.
◦
controller는 Ruby 클래스로, action은 public method로 구현된다.
•
view: 원하는 형식으로 데이터를 표시한다.
◦
템플릿으로 일반적으로 HTML과 Ruby를 혼합해 작성된다.
route 파일(config/routes.rb)을 먼저 수정해보자. 아래와 같이 설정함으로써 GET /articles 요청이 ArticlesController의 index action에 매핑되게 하였다.
Rails.application.routes.draw do
get "/articles", to: "articles#index"
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
Ruby
복사
다음으로 controller action을 만들어 보자. 터미널에 아래 명령어를 입력해 쉽게 생성할 수 있다.
> bin/rails generate controller Articles index --skip-routes
create app/controllers/articles_controller.rb
invoke erb
create app/views/articles
create app/views/articles/index.html.erb
invoke test_unit
create test/controllers/articles_controller_test.rb
invoke helper
create app/helpers/articles_helper.rb
invoke test_unit
Ruby
복사
app/controllers/articles_controller.rb 에 들어가보면, controller 파일의 action이 비어있다. 이처럼 action이 view를 명시적으로 렌더링하지 않을 때 Rails는 controller와 action의 이름과 일치하는 뷰를 자동으로 렌더링한다. 지금같은 경우 app/views/articles/index.html.erb 와 렌더링된다.
class ArticlesController < ApplicationController
def index
end
end
Ruby
복사
마지막으로, 뷰 파일을 수정해보자. app/views/articles/index.html.erb 내용을 아래와 같이 바꿔주었다. 이제 http://localhost:3000/articles 에 접속하면 “Hello, Rails!” 텍스트가 보이는 걸 확인할 수 있다.
<h1>Hello, Rails!</h1>
Ruby
복사
만일 루트 경로인 http://localhost:3000 역시 “Hello, Rails!” 텍스트를 띄우게 하고 싶다면 config/routes.rb 에 아래와 같이 root 문을 추가하면 된다.
Rails.application.routes.draw do
root "articles#index"
get "/articles", to: "articles#index"
end
Ruby
복사
참고로, 지금까지의 과정에서 require 문이 필요 없었다. 애플리케이션 클래스와 모듈은 어디에서나 사용할 수 있기 때문이다. 따라서 아무것도 로드할 필요 없고 로드해서는 안된다. 이 기능을 자동 로딩이라고 한다. require 문은 lib 디렉터리 하위의 파일을 로드하거나 GemFile의 require:false 속성을 가진 gem dependencies를 로드할 때 딱 두 가지 케이스에만 필요하다.
3. MVC
3.1. model 생성
route, controller action, view에 대해 논했는데, 이는 MVC 패턴을 다르는 웹 애플리케이션의 전형적인 부분이다. controller와 view가 있으니 다음 요소인 model을 생성해보자.
•
model: 데이터를 표현하는 데 사용되는 Ruby 클래스다.
◦
Active Record라는 Rails 기능을 통해 데이터베이스와 상호 작용 가능하다.
◦
model의 이름은 단수형이다. 인스턴스화된 모델은 단일 데이터 레코드를 나타내기 때문이다.
model은 터미널에 아래 명령어(모델 생성기)를 입력해 쉽게 생성할 수 있다.
> bin/rails generate model Article title:string body:text
invoke active_record
create db/migrate/20241201163450_create_articles.rb
create app/models/article.rb
invoke test_unit
create test/models/article_test.rb
create test/fixtures/articles.yml
Ruby
복사
3.2. 데이터베이스 마이그레이션
마이그레이션 파일(db/migrate/<timestamp>_create_articles.rb)은 애플리케이션의 데이터베이스 구조를 변경하는 데 사용돈다. 마이그레이션 파일은 Ruby로 작성되기 때문에 데이터베이스에 구애받지 않는다.
파일 내용을 살펴보자. create_table 은 auto increment 방식을 뜻한다. articles 라는 테이블은 자동 증가하는 기본 키와, string 타입의 title 컬럼, text 타입의 body 컬럼, created_at과 updated_at 컬럼 총 5개 컬럼을 가진다.
class CreateArticles < ActiveRecord::Migration[8.0]
def change
create_table :articles do |t|
t.string :title
t.text :body
t.timestamps
end
end
end
Ruby
복사
아래 명령을 통해 마이그레이션을 실행할 수 있다. 실행하면 테이블이 생성된다.
> bin/rails db:migrate
== 20241201163450 CreateArticles: migrating ===================================
-- create_table(:articles)
-> 0.0019s
== 20241201163450 CreateArticles: migrated (0.0019s) ==========================
Ruby
복사
3.3. 모델 사용해 데이터베이스와 상호작용
Rails의 콘솔 기능을 이용해 데이터베이스에 쿼리를 날려보자.
먼저 콘솔 프롬프트에서 새 Article 객체를 초기화한다. 그리곤 객체를 데이터베이스에 저장하기 위해 save를 호출한다. save 를 호출한 후 article을 다시 살펴보면 id, created_at, updated_at 속성이 추가적으로 설정된 걸 확인할 수 있다.
> bin/rails console
Loading development environment (Rails 8.0.0)
blog(dev)> article = Article.new(title: "Hello Rails", body: "I am on Rails!")
blog(dev)> article.save
TRANSACTION (0.2ms) BEGIN immediate TRANSACTION /*application='Blog'*/
Article Create (5.5ms) INSERT INTO "articles" ("title", "body", "created_at", "updated_at") VALUES ('Hello Rails', 'I am on Rails!', '2024-12-01 16:53:00.153909', '2024-12-01 16:53:00.153909') RETURNING "id" /*application='Blog'*/
TRANSACTION (0.6ms) COMMIT TRANSACTION /*application='Blog'*/
=> true
blog(dev) > article
=>
#<Article:0x000000012f62f5e0
id: 1,
title: "Hello Rails",
body: "I am on Rails!",
created_at: "2024-12-01 16:53:00.153909000 +0000",
updated_at: "2024-12-01 16:53:00.153909000 +0000">
Ruby
복사
데이터베이스에서 article을 조회하려면 find(id) 메서드를 이용하면 된다. 모든 article을 조회하려면 all 메서드를 이용하면 된다.
blog(dev)> Article.find(1)
Article Load (0.5ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = 1 LIMIT 1 /*application='Blog'*/
=>
#<Article:0x00000001381f02a0
id: 1,
title: "Hello Rails",
body: "I am on Rails!",
created_at: "2024-12-01 16:53:00.153909000 +0000",
updated_at: "2024-12-01 16:53:00.153909000 +0000">
blog(dev)> Article.all
Article Load (0.5ms) SELECT "articles".* FROM "articles" /* loading for pp */ LIMIT 11 /*application='Blog'*/
=>
[#<Article:0x0000000138b5aa20
id: 1,
title: "Hello Rails",
body: "I am on Rails!",
created_at: "2024-12-01 16:53:00.153909000 +0000",
updated_at: "2024-12-01 16:53:00.153909000 +0000">]
Ruby
복사
3.4. article 목록 표시하기
controller(app/controllers/articles_controller.rb)에 article 목록을 가져오는 action을 만들어보자.
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
Ruby
복사
controller 인스턴스 변수는 view에서 접근할 수 있다. view(app/views/articles/index.html.erb)가 @articles를 참조하게 만들어보자.
<h1>Articles</h1>
<ul>
<% @articles.each do |article| %>
<li>
<%= article.title %>
</li>
<% end %>
</ul>
Ruby
복사