이 튜토리얼은 Getting Started with Rails Guide를 읽고 Rails의 기본 지식이 있다고 가정합니다.
1 Rails 앱 생성하기
먼저 rails new
명령어를 사용하여 간단한 Rails 애플리케이션을 만들어보겠습니다.
이 애플리케이션을 사용하여 이 가이드에서 설명하는 모든 명령어를 실습하고 살펴볼 것입니다.
rails gem이 아직 설치되어 있지 않다면 gem install rails
명령어를 입력하여 설치할 수 있습니다.
1.1 rails new
rails new
명령어에 전달할 첫 번째 인자는 애플리케이션 이름입니다.
$ rails new my_app
create
create README.md
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
...
create tmp/cache
...
run bundle install
Rails는 이렇게 작은 명령어에 대해 엄청난 양의 것들을 설정합니다! 이제 간단한 애플리케이션을 바로 실행하는 데 필요한 모든 코드가 포함된 전체 Rails 디렉토리 구조를 갖게 되었습니다.
파일 생성이나 일부 라이브러리를 건너뛰고 싶다면, rails new
명령어에 다음 인자들을 추가할 수 있습니다:
인자 | 설명 |
---|---|
--skip-git |
git init, .gitignore, .gitattributes 건너뛰기 |
--skip-docker |
Dockerfile, .dockerignore, bin/docker-entrypoint 건너뛰기 |
--skip-keeps |
소스 컨트롤 .keep 파일들 건너뛰기 |
--skip-action-mailer |
Action Mailer 파일들 건너뛰기 |
--skip-action-mailbox |
Action Mailbox gem 건너뛰기 |
--skip-action-text |
Action Text gem 건너뛰기 |
--skip-active-record |
Active Record 파일들 건너뛰기 |
--skip-active-job |
Active Job 건너뛰기 |
--skip-active-storage |
Active Storage 파일들 건너뛰기 |
--skip-action-cable |
Action Cable 파일들 건너뛰기 |
--skip-asset-pipeline |
Asset Pipeline 건너뛰기 |
--skip-javascript |
JavaScript 파일들 건너뛰기 |
--skip-hotwire |
Hotwire 통합 건너뛰기 |
--skip-jbuilder |
jbuilder gem 건너뛰기 |
--skip-test |
테스트 파일들 건너뛰기 |
--skip-system-test |
시스템 테스트 파일들 건너뛰기 |
--skip-bootsnap |
bootsnap gem 건너뛰기 |
--skip-dev-gems |
개발용 gem 추가 건너뛰기 |
--skip-thruster |
Thruster 설정 건너뛰기 |
--skip-rubocop |
RuboCop 설정 건너뛰기 |
--skip-brakeman |
brakeman 설정 건너뛰기 |
--skip-ci |
GitHub CI 파일들 건너뛰기 |
--skip-kamal |
Kamal 설정 건너뛰기 |
--skip-solid |
Solid Cache, Queue, Cable 설정 건너뛰기 |
이것들은 rails new
가 받아들이는 옵션들의 일부일 뿐입니다. 전체 옵션 목록을 보려면 rails new --help
를 입력하세요.
1.2 다른 Database 사전 구성하기
새로운 Rails 애플리케이션을 만들 때, 애플리케이션이 어떤 종류의 database를 사용할지 지정할 수 있습니다. 이를 통해 시간을 절약하고 많은 키 입력을 줄일 수 있습니다.
--database=postgresql
옵션이 어떤 역할을 하는지 살펴보겠습니다:
$ rails new petstore --database=postgresql
create
create app/controllers
create app/helpers
...
config/database.yml
에 어떤 내용이 들어갔는지 살펴봅시다:
# PostgreSQL. 9.3 이상 버전이 지원됩니다.
#
# pg 드라이버 설치:
# gem install pg
# macOS에서 Homebrew 사용 시:
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# Windows에서:
# gem install pg
# win32 빌드를 선택하세요.
# PostgreSQL을 설치하고 /bin 디렉터리를 path에 추가하세요.
#
# Gemfile을 사용한 설정
# gem "pg"
#
default: &default
adapter: postgresql
encoding: unicode
# 커넥션 풀링에 대한 자세한 내용은 Rails 설정 가이드를 참조하세요
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: petstore_development
...
PostgreSQL 선택에 따른 데이터베이스 설정이 생성되었습니다.
2 Command Line 기본사항
Rails를 일상적으로 사용하는데 있어 절대적으로 중요한 명령어들이 몇 가지 있습니다. 사용 빈도순으로 나열하면 다음과 같습니다:
bin/rails console
bin/rails server
bin/rails test
bin/rails generate
bin/rails db:migrate
bin/rails db:create
bin/rails routes
bin/rails dbconsole
rails new app_name
rails --help
를 입력하면 현재 디렉토리에서 사용 가능한 rails 명령어 목록을 볼 수 있습니다. 각 명령어에는 설명이 포함되어 있어 필요한 것을 찾는데 도움이 될 것입니다.
$ rails --help
사용법:
bin/rails COMMAND [options]
명령어를 지정해야 합니다. 가장 일반적인 명령어는 다음과 같습니다:
generate 새로운 코드 생성 (단축 별칭: "g")
console Rails 콘솔 시작 (단축 별칭: "c")
server Rails 서버 시작 (단축 별칭: "s")
...
모든 명령어는 -h (또는 --help)와 함께 실행하면 더 자세한 정보를 볼 수 있습니다.
추가로 사용할 수 있는 명령어들:
about 모든 Rails 버전 리스트 ...
assets:clean[keep] 오래된 컴파일된 asset 제거
assets:clobber 컴파일된 asset 제거
assets:environment asset 컴파일 환경 로드
assets:precompile 모든 asset 컴파일 ...
...
db:fixtures:load fixture를 로드 ...
db:migrate 데이터베이스 마이그레이션 ...
db:migrate:status 마이그레이션 상태 표시
db:rollback 스키마를 이전 버전으로 롤백 ...
db:schema:cache:clear db/schema_cache.yml 파일 삭제
db:schema:cache:dump db/schema_cache.yml 파일 생성
db:schema:dump 데이터베이스 스키마 파일 생성 (db/schema.rb 또는 db/structure.sql ...)
db:schema:load 데이터베이스 스키마 파일 로드 (db/schema.rb 또는 db/structure.sql ...)
db:seed 시드 데이터 로드 ...
db:version 현재 스키마 버전 조회 ...
...
restart 앱을 터치하여 재시작 ...
tmp:create tmp 디렉토리 생성 ...
2.1 bin/rails server
bin/rails server
명령어는 Rails에 번들로 포함된 Puma라는 웹 서버를 실행합니다. 웹 브라우저를 통해 애플리케이션에 접근하고 싶을 때마다 이 명령어를 사용하게 될 것입니다.
추가 작업 없이, bin/rails server
는 우리의 새로운 Rails 앱을 실행할 것입니다:
$ cd my_app
$ bin/rails server
=> Puma 부팅 중
=> Rails 8.1.0 애플리케이션이 development 환경에서 시작됩니다
=> 더 많은 시작 옵션을 보려면 `bin/rails server --help` 를 실행하세요
Puma가 단일 모드로 시작됩니다...
* Puma 버전: 6.4.0 (ruby 3.1.3-p185) ("The Eagle of Durango")
* 최소 스레드: 5
* 최대 스레드: 5
* 환경: development
* PID: 5295
* http://127.0.0.1:3000 에서 리스닝 중
* http://[::1]:3000 에서 리스닝 중
중지하려면 Ctrl-C를 누르세요
단 세 가지 명령어로 우리는 3000번 포트를 사용하는 Rails 서버를 실행했습니다. 브라우저에서 http://localhost:3000을 열면 기본적인 Rails 앱이 실행되는 것을 볼 수 있습니다.
서버를 시작하기 위해 "s" 별칭을 사용할 수도 있습니다: bin/rails s
.
-p
옵션을 사용하여 서버를 다른 포트에서 실행할 수 있습니다. 기본 development 환경은 -e
옵션으로 변경할 수 있습니다.
$ bin/rails server -e production -p 4000
-b
옵션은 Rails를 지정된 IP에 바인딩하며, 기본값은 localhost입니다. -d
옵션을 전달하여 서버를 데몬으로 실행할 수 있습니다.
2.2 bin/rails generate
bin/rails generate
명령어는 템플릿을 사용하여 많은 것들을 생성합니다. bin/rails generate
를 단독으로 실행하면 사용 가능한 generator들의 목록을 보여줍니다:
generator 명령어를 호출할 때 "g" 별칭을 사용할 수도 있습니다: bin/rails g
.
$ bin/rails generate
사용법:
bin/rails generate GENERATOR [args] [options]
...
...
아래에서 generator를 선택해주세요.
Rails:
assets
channel
controller
generator
...
...
노트: generator gem, 앱에 설치할 plugin의 일부를 통해 더 많은 generator를 설치할 수 있으며, 직접 generator를 만들 수도 있습니다!
generator를 사용하면 앱 동작에 필요한 상용구 코드(boilerplate code)를 작성하는 데 많은 시간을 절약할 수 있습니다.
controller generator를 사용해서 직접 controller를 만들어봅시다. 하지만 어떤 명령어를 사용해야 할까요? generator에게 물어봅시다:
모든 Rails 콘솔 유틸리티에는 도움말이 있습니다. 대부분의 *nix 유틸리티처럼 명령어 끝에 --help
또는 -h
를 추가하면 됩니다. 예: bin/rails server --help
$ bin/rails generate controller
사용법:
bin/rails generate controller NAME [action action] [options]
...
...
설명:
...
모듈 내에 controller를 생성하려면, controller 이름을 'parent_module/controller_name'과 같은 경로 형식으로 지정하세요.
...
예시:
`bin/rails generate controller CreditCards open debit credit close`
/credit_cards/debit 같은 URL을 가진 신용카드 controller.
Controller: app/controllers/credit_cards_controller.rb
Test: test/controllers/credit_cards_controller_test.rb
Views: app/views/credit_cards/debit.html.erb [...]
Helper: app/helpers/credit_cards_helper.rb
controller 생성기는 generate controller ControllerName action1 action2
형식의 파라미터를 기대합니다. 우리에게 좋은 말을 해줄 hello action을 가진 Greetings
controller를 만들어보겠습니다.
$ bin/rails generate controller Greetings hello
create app/controllers/greetings_controller.rb
route get 'greetings/hello'
invoke erb
create app/views/greetings
create app/views/greetings/hello.html.erb
invoke test_unit
create test/controllers/greetings_controller_test.rb
invoke helper
create app/helpers/greetings_helper.rb
invoke test_unit
이것이 전부 무엇을 생성했을까요? 이는 애플리케이션에 여러 디렉토리들이 있는지 확인했고, controller 파일, view 파일, functional test 파일, view를 위한 helper, JavaScript 파일, 그리고 stylesheet 파일을 생성했습니다.
controller를 확인하고 약간 수정해보세요 (app/controllers/greetings_controller.rb
에서):
class GreetingsController < ApplicationController
def hello
@message = "안녕하세요, 오늘 기분은 어떠신가요?"
end
end
그런 다음 메시지를 표시할 view입니다 (app/views/greetings/hello.html.erb
):
<h1>당신을 위한 인사!</h1>
<p><%= @message %></p>
서버를 bin/rails server
명령어로 실행하세요.
$ bin/rails server
=> Booting Puma...
URL은 http://localhost:3000/greetings/hello가 됩니다.
일반적인 기본 Rails 애플리케이션에서 URL은 보통 http://(host)/(controller)/(action) 패턴을 따르며, http://(host)/(controller)와 같은 URL은 해당 controller의 index action을 실행합니다.
Rails는 데이터 model을 위한 generator도 제공합니다.
$ bin/rails generate model
사용법:
bin/rails generate model 이름 [필드[:타입][:인덱스] 필드[:타입][:인덱스]] [옵션]
...
ActiveRecord 옵션:
[--migration], [--no-migration] # migration을 생성할지 여부를 지정
# 기본값: true
...
설명:
새 model을 생성합니다. model 이름은 CamelCase나
under_score 형식으로 전달하며, 선택적으로 속성 쌍의 목록을 인자로 전달할 수 있습니다.
...
type
파라미터에서 사용할 수 있는 필드 유형 목록은 SchemaStatements
모듈의 add_column 메서드에 대한 API 문서를 참조하세요. index
파라미터는 해당 컬럼에 대한 인덱스를 생성합니다.
하지만 모델을 직접 생성하는 대신(이것은 나중에 할 것입니다), scaffold를 설정해보겠습니다. Rails의 scaffold는 모델, 해당 모델의 데이터베이스 migration, 이를 조작하기 위한 controller, 데이터를 보고 조작하기 위한 view, 그리고 이 모든 것에 대한 테스트 스위트의 전체 세트입니다.
우리가 플레이하는 비디오 게임의 최고 점수를 추적하는 "HighScore"라는 간단한 resource를 설정해보겠습니다.
$ bin/rails generate scaffold HighScore game:string score:integer
invoke active_record
create db/migrate/20190416145729_create_high_scores.rb
create app/models/high_score.rb
invoke test_unit
create test/models/high_score_test.rb
create test/fixtures/high_scores.yml
invoke resource_route
route resources :high_scores
invoke scaffold_controller
create app/controllers/high_scores_controller.rb
invoke erb
create app/views/high_scores
create app/views/high_scores/index.html.erb
create app/views/high_scores/edit.html.erb
create app/views/high_scores/show.html.erb
create app/views/high_scores/new.html.erb
create app/views/high_scores/_form.html.erb
invoke test_unit
create test/controllers/high_scores_controller_test.rb
create test/system/high_scores_test.rb
invoke helper
create app/helpers/high_scores_helper.rb
invoke test_unit
invoke jbuilder
create app/views/high_scores/index.json.jbuilder
create app/views/high_scores/show.json.jbuilder
create app/views/high_scores/_high_score.json.jbuilder
제너레이터는 HighScore를 위한 모델, 뷰, 컨트롤러, resource 라우트, 데이터베이스 마이그레이션(high_scores
테이블을 생성)을 생성합니다. 그리고 이들을 위한 테스트도 추가합니다.
마이그레이션은 우리가 migrate를 해야 합니다. 즉, 데이터베이스의 스키마를 수정하기 위해 Ruby 코드(위 출력의 20190416145729_create_high_scores.rb
파일)를 실행해야 합니다. 어떤 데이터베이스일까요? bin/rails db:migrate
명령을 실행할 때 Rails가 생성할 SQLite3 데이터베이스입니다. 이 명령에 대해서는 아래에서 더 자세히 설명하겠습니다.
$ bin/rails db:migrate
== CreateHighScores: 마이그레이션 중 ===============================================
-- create_table(:high_scores)
-> 0.0017s
== CreateHighScores: 마이그레이션 완료 (0.0019s) ======================================
유닛 테스트에 대해 이야기해보겠습니다. 유닛 테스트는 코드를 테스트하고 코드에 대해 검증하는 코드입니다. 유닛 테스트에서는 코드의 작은 부분(예: 모델의 메서드)을 가져와 입력과 출력을 테스트합니다. 유닛 테스트는 여러분의 친구입니다. 코드에 유닛 테스트를 작성하면 작업 생산성이 크게 향상된다는 사실을 빨리 받아들일수록 좋습니다. 정말입니다. 유닛 테스트에 대한 자세한 내용은 테스팅 가이드를 참조하세요.
Rails가 우리를 위해 만든 인터페이스를 살펴보겠습니다.
$ bin/rails server
브라우저를 열고 http://localhost:3000/high_scores로 이동하면, 이제 새로운 high score를 생성할 수 있습니다 (Space Invaders에서 55,160점!)
2.3 bin/rails console
console
명령어를 사용하면 명령줄에서 Rails 애플리케이션과 상호작용할 수 있습니다. 내부적으로 bin/rails console
은 IRB를 사용하므로, IRB를 사용해본 적이 있다면 익숙할 것입니다. 이는 코드로 빠른 아이디어를 테스트하고 웹사이트를 건드리지 않고 서버 측 데이터를 변경하는 데 유용합니다.
console을 실행할 때 "c" 별칭을 사용할 수도 있습니다: bin/rails c
console
명령어가 작동할 환경을 지정할 수 있습니다.
$ bin/rails console -e staging
데이터를 변경하지 않고 코드를 테스트하고 싶다면, bin/rails console --sandbox
를 호출하여 실행할 수 있습니다.
$ bin/rails console --sandbox
sandbox에서 development 환경을 로딩 중 (Rails 8.1.0)
종료 시 모든 수정사항이 롤백됩니다
irb(main):001:0>
2.3.1 app
과 helper
Objects
bin/rails console
내부에서는 app
과 helper
인스턴스에 접근할 수 있습니다.
app
메서드를 사용하면 named route helper에 접근할 수 있으며, request를 수행할 수 있습니다.
irb> app.root_path
=> "/"
irb> app.get _
"/" 경로로 127.0.0.1에서 GET 요청이 2014-06-19 10:41:57 -0300에 시작되었습니다
...
helper
메서드를 사용하면 Rails와 애플리케이션의 helper들에 접근할 수 있습니다.
irb> helper.time_ago_in_words 30.days.ago
=> "약 1개월"
irb> helper.my_custom_helper
=> "나의 커스텀 helper"
2.4 bin/rails dbconsole
bin/rails dbconsole
은 사용 중인 데이터베이스를 파악하고 해당 데이터베이스의 명령줄 인터페이스로 이동시켜줍니다(명령줄 매개변수도 자동으로 설정합니다!). MySQL(MariaDB 포함), PostgreSQL, SQLite3를 지원합니다.
dbconsole을 실행하기 위해 "db" 별칭을 사용할 수도 있습니다: bin/rails db
.
여러 데이터베이스를 사용하는 경우, bin/rails dbconsole
은 기본적으로 primary 데이터베이스에 연결됩니다. --database
또는 --db
를 사용하여 연결할 데이터베이스를 지정할 수 있습니다:
$ bin/rails dbconsole --database=animals
2.5 bin/rails runner
runner
는 Rails console
을 열지 않고 비대화형으로 Rails 애플리케이션의 컨텍스트에서 Ruby 코드를 실행합니다. 예를 들면:
$ bin/rails runner "Model.long_running_method"
runner를 실행하기 위해 "r" 별칭을 사용할 수도 있습니다: bin/rails r
-e
스위치를 사용하여 runner
명령이 동작할 environment를 지정할 수 있습니다.
$ bin/rails runner -e staging "Model.long_running_method"
runner를 사용하면 파일에 작성된 ruby 코드도 실행할 수 있습니다.
$ bin/rails runner lib/code_to_be_run.rb
기본적으로 rails runner
스크립트는 Rails Executor로 자동으로 감싸지며, 이는 cron job과 같은 작업에서 잡히지 않은 예외를 보고하는 데 도움을 줍니다.
따라서 rails runner lib/long_running_scripts.rb
를 실행하는 것은 다음과 기능적으로 동일합니다:
Rails.application.executor.wrap do
# lib/long_running_scripts.rb 내부의 코드를 실행합니다
end
--skip-executor
옵션을 사용하면 이 동작을 생략할 수 있습니다.
$ bin/rails runner --skip-executor lib/long_running_script.rb
이 명령어는 executor를 건너뛰고 script를 실행합니다.
2.6 bin/rails destroy
destroy
는 generate
의 반대라고 생각하세요. generate가 무엇을 했는지 파악하고 그것을 취소합니다.
destroy 명령어를 실행할 때 별칭인 "d"를 사용할 수도 있습니다: bin/rails d
.
$ bin/rails generate model Oops
invoke active_record
create db/migrate/20120528062523_create_oops.rb
create app/models/oops.rb
invoke test_unit
create test/models/oops_test.rb
create test/fixtures/oops.yml
$ bin/rails destroy model Oops
invoke active_record
remove db/migrate/20120528062523_create_oops.rb
remove app/models/oops.rb
invoke test_unit
remove test/models/oops_test.rb
remove test/fixtures/oops.yml
2.7 bin/rails about
bin/rails about
는 Ruby, RubyGems, Rails, Rails 하위 컴포넌트, 애플리케이션 폴더, 현재 Rails 환경 이름, 앱의 database adapter, schema 버전에 대한 정보를 제공합니다. 도움이 필요하거나, 보안 패치가 영향을 미칠 수 있는지 확인하거나, 기존 Rails 설치에 대한 통계가 필요할 때 유용합니다.
$ bin/rails about
애플리케이션 환경 정보
Rails 버전 8.1.0
Ruby 버전 3.2.0 (x86_64-linux)
RubyGems 버전 3.3.7
Rack 버전 3.0.8
JavaScript Runtime Node.js (V8)
Middleware: ActionDispatch::HostAuthorization, Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActionDispatch::ServerTiming, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::ActionableExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ContentSecurityPolicy::Middleware, ActionDispatch::PermissionsPolicy::Middleware, Rack::Head, Rack::ConditionalGet, Rack::ETag, Rack::TempfileReaper
애플리케이션 루트 /home/foobar/my_app
환경 development
데이터베이스 어댑터 sqlite3
데이터베이스 스키마 버전 20180205173523
2.8 bin/rails assets:
bin/rails assets:precompile
을 사용하여 app/assets
의 asset들을 사전 컴파일할 수 있으며, bin/rails assets:clean
을 사용하여 이전에 컴파일된 asset들을 제거할 수 있습니다. assets:clean
명령어는 새로운 asset이 빌드되는 동안 이전 asset에 계속 연결될 수 있는 롤링 배포를 허용합니다.
public/assets
를 완전히 지우고 싶다면 bin/rails assets:clobber
를 사용할 수 있습니다.
2.9 bin/rails db:
db:
rails namespace의 가장 일반적인 명령어는 migrate
와 create
이며, 모든 마이그레이션 rails 명령어(up
, down
, redo
, reset
)를 사용해보는 것이 도움이 될 것입니다. bin/rails db:version
은 문제 해결 시 유용하며 데이터베이스의 현재 버전을 알려줍니다.
마이그레이션에 대한 자세한 내용은 Migrations 가이드에서 확인할 수 있습니다.
2.10 bin/rails notes
bin/rails notes
는 특정 키워드로 시작하는 주석을 코드에서 검색합니다. 사용법에 대한 정보는 bin/rails notes --help
를 참고할 수 있습니다.
기본적으로 app
, config
, db
, lib
, test
디렉토리에서 FIXME, OPTIMIZE, TODO 주석을 검색하며, 확장자가 .builder
, .rb
, .rake
, .yml
, .yaml
, .ruby
, .css
, .js
, .erb
인 파일들을 대상으로 합니다.
$ bin/rails notes
app/controllers/admin/users_controller.rb:
* [ 20] [TODO] 이걸 다른 방법으로 할 수 있나요?
* [132] [FIXME] 다음 배포 때 높은 우선순위로 처리
lib/school.rb:
* [ 13] [OPTIMIZE] 더 빠르게 하기 위해 이 코드 리팩토링 필요
* [ 17] [FIXME]
2.10.1 Annotations
--annotations
인자를 사용하여 특정 annotation을 전달할 수 있습니다. 기본적으로는 FIXME, OPTIMIZE 그리고 TODO를 검색합니다.
Annotation은 대소문자를 구분한다는 점에 유의하세요.
$ bin/rails notes --annotations FIXME RELEASE
app/controllers/admin/users_controller.rb:
* [101] [RELEASE] 다음 release 전에 이것을 확인해야 합니다
* [132] [FIXME] 다음 배포에서 높은 우선순위
lib/school.rb:
* [ 17] [FIXME]
2.10.2 Tags
config.annotations.register_tags
를 사용하여 검색할 기본 태그를 추가할 수 있습니다. 이는 태그 목록을 받습니다.
config.annotations.register_tags("DEPRECATEME", "TESTME")
register_tags
메서드를 사용하여 추가 주석 태그를 등록할 수 있습니다.
$ bin/rails notes
app/controllers/admin/users_controller.rb:
* [ 20] [TODO] 이것에 대해 A/B 테스트 수행하기
* [ 42] [TESTME] 더 많은 기능 테스트가 필요함
* [132] [DEPRECATEME] 다음 릴리스에서 이 메소드가 deprecate 되는지 확인
2.10.3 Directories
config.annotations.register_directories
를 사용하여 검색할 기본 디렉터리를 추가할 수 있습니다. 이는 디렉터리 이름의 목록을 받습니다.
config.annotations.register_directories("spec", "vendor")
추가 디렉토리들을 source annotation 추출기에 등록합니다.
$ bin/rails notes
app/controllers/admin/users_controller.rb:
* [ 20] [TODO] 이걸 처리할 다른 방법이 있을까?
* [132] [FIXME] 다음 배포에서 최우선순위로 처리 필요
lib/school.rb:
* [ 13] [OPTIMIZE] 성능 향상을 위해 이 코드 리팩토링 필요
* [ 17] [FIXME]
spec/models/user_spec.rb:
* [122] [TODO] 구독이 있는 사용자에 대해 검증 필요
vendor/tools.rb:
* [ 56] [TODO] 이 의존성 제거 필요
2.10.4 Extensions
config.annotations.register_extensions
를 사용하여 검색할 기본 파일 확장자를 더 추가할 수 있습니다. 이는 매칭할 정규식과 함께 확장자 목록을 전달받습니다.
config.annotations.register_extensions("scss", "sass") { |annotation| /\/\/\s*(#{annotation}):?\s*(.*)$/ }
"scss" 및 "sass" 파일 확장자에 대한 주석 패턴을 등록합니다. 이는 "//" 스타일의 주석을 찾습니다.
$ bin/rails notes
app/controllers/admin/users_controller.rb:
* [ 20] [TODO] 다른 방법이 있을까요?
* [132] [FIXME] 다음 배포 시 높은 우선순위로 처리
app/assets/stylesheets/application.css.sass:
* [ 34] [TODO] 이 클래스에 pseudo element 사용하기
app/assets/stylesheets/application.css.scss:
* [ 1] [TODO] 여러 component로 분리하기
lib/school.rb:
* [ 13] [OPTIMIZE] 성능 향상을 위해 이 코드 리팩토링 필요
* [ 17] [FIXME]
spec/models/user_spec.rb:
* [122] [TODO] subscription이 있는 사용자가 정상 동작하는지 확인
vendor/tools.rb:
* [ 56] [TODO] 이 dependency 제거하기
2.11 bin/rails routes
bin/rails routes
는 정의된 모든 route를 나열합니다. 이는 앱의 routing 문제를 해결하거나, 익숙해지려는 앱의 URL들을 전반적으로 파악하는 데 유용합니다.
2.12 bin/rails test
Rails에서의 unit testing에 대한 자세한 설명은 Rails 어플리케이션 테스팅 가이드에서 확인할 수 있습니다.
Rails는 minitest라는 test framework와 함께 제공됩니다. Rails는 테스트 사용을 통해 안정성을 유지합니다. test:
namespace에서 사용할 수 있는 명령어들은 여러분이 작성할 다양한 테스트를 실행하는 데 도움이 됩니다.
2.13 bin/rails tmp:
Rails.root/tmp
디렉토리는 *nix의 /tmp 디렉토리와 같이 프로세스 id 파일과 캐시된 액션과 같은 임시 파일들을 보관하는 장소입니다.
tmp:
네임스페이스 명령어들은 Rails.root/tmp
디렉토리를 정리하고 생성하는데 도움을 줍니다:
bin/rails tmp:cache:clear
는tmp/cache
를 정리합니다.bin/rails tmp:sockets:clear
는tmp/sockets
를 정리합니다.bin/rails tmp:screenshots:clear
는tmp/screenshots
를 정리합니다.bin/rails tmp:clear
는 모든 cache, sockets, screenshot 파일들을 정리합니다.bin/rails tmp:create
는 cache, sockets, pids를 위한 tmp 디렉토리들을 생성합니다.
2.14 기타
bin/rails initializers
는 Rails가 호출하는 순서대로 모든 정의된 initializer들을 출력합니다.bin/rails middleware
는 앱에서 활성화된 Rack middleware 스택을 나열합니다.bin/rails stats
는 코드의 통계를 확인하는데 유용하며, KLOCs(코드 라인 수 천 단위)와 코드 대비 테스트 비율과 같은 정보를 표시합니다.bin/rails secret
은 세션 secret으로 사용할 수 있는 의사 난수 키를 제공합니다.bin/rails time:zones:all
은 Rails가 알고 있는 모든 timezone을 나열합니다.bin/rails boot
는 애플리케이션을 부팅하고 종료합니다.
2.15 Custom Rake Tasks
Custom rake task는 .rake
확장자를 가지며 Rails.root/lib/tasks
에 위치합니다. 이러한 custom rake task는 bin/rails generate task
명령어를 통해 생성할 수 있습니다.
desc "제 멋진 태스크에 대한 짧지만 포괄적인 설명입니다"
task task_name: [:prerequisite_task, :another_task_we_depend_on] do
# 여기에 모든 매직을 작성하세요
# 유효한 Ruby 코드는 모두 허용됩니다
end
커스텀 rake task에 인자를 전달하려면:
task :task_name, [:arg_1] => [:prerequisite_1, :prerequisite_2] do |task, args|
argument_1 = args.arg_1
end
namespace로 묶어서 task들을 그룹화할 수 있습니다:
namespace :db do
desc "이 태스크는 아무것도 하지 않습니다"
task :nothing do
# 진짜로 아무것도 안 함
end
end
task들의 실행은 다음과 같이 보일 것입니다:
$ bin/rails task_name
$ bin/rails "task_name[value 1]" # 전체 인수 문자열은 따옴표로 묶어야 합니다
$ bin/rails "task_name[value 1,value2,value3]" # 여러 인수는 쉼표로 구분합니다
$ bin/rails db:nothing
애플리케이션 모델과 상호작용하거나 database 쿼리를 수행하는 등의 작업이 필요한 경우, 애플리케이션 코드를 로드하는 environment
task에 의존해야 합니다.
task task_that_requires_app_code: [:environment] do
User.create!
end
application 코드를 필요로 하는 task가 있다면 위처럼 작성하면 됩니다.