Seongsiks

Being A DevOpser. Powered by
Obtvse, highlight.js, theme toc Creative Commons License
Seongsiks Twitter Github Email
DevOps Ruby On Rails Chef Projects Misc Movies & Drama ME

Rails4 업글

Overview

Rails4의 Streaming을 너무 써보고 싶어서 이 블로그를 3.2.12에서 4.0.0.beta1로 업그레이드 하는 과정을 정리해보력고 합니다.

Ruby 2.0.0설치

원래 이 블로그는 1.9.3p392버전을 사용하고 있어서 굳이 2.0을 설치할 필요는 없지만.. 그래도 새로운 기분으로 설치했습니다. 저는 카페24에서 가상서버를 하나 받아서 사용하고 있습니다.

blog@kssminus:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04 LTS
Release:        12.04
Codename:       precise

Missing libyaml-0.so.2

blog@kssminus:~$ rvm install 2.0.0
Searching for binary rubies, this might take some time.
ruby-2.0.0-p0 - #configure
ruby-2.0.0-p0 - #download
ruby-2.0.0-p0 - #validate archive
ruby-2.0.0-p0 - #extract
ruby-2.0.0-p0 - #validate binary
Libraries missing for ruby-2.0.0-p0: libyaml-0.so.2. Refer to your system manual for installing libraries
Mounting remote ruby failed, trying to compile.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.0.0-p0, this may take a while depending on your cpu(s)...
....

신나서 ruby 2.0을 설치하는데, 일단 설치는 완료되었지만 Library Missing Message가 나왔습니다. 뭐 잘 모르는것이면 그냥 넘어갔을텐데 ruby에서 정말 많이 쓰는 libyaml이어서. 이를 해결하고 지나가려고 합니다.

blog@kssminus:~$ sudo apt-get update
blog@kssminus:~$ sudo apt-get install sudo apt-get install libyaml-0-2
blog@kssminus:~$ rvm reinstall 2.0.0

여기까지 하면 ruby 2.0이 설치됩니다.

gemset 관리하기

하나의 서버에서 여러 어플을 돌리고 있는 저로써는 서로 gemset을 격리시켜 관리하고 있습니다.

blog@kssminus:~$ rvm use 2.0.0
Using /usr/local/rvm/gems/ruby-2.0.0-p0
blog@kssminus:~$ rvm gemset create rails4
gemset created rails4   => /usr/local/rvm/gems/ruby-2.0.0-p0@rails4
blog@kssminus:~$ rvm gemset use rails4
Using ruby-2.0.0-p0 with gemset rails4

Rails4설치

고백할것이 있습니다. 처음에 저는 바보같이 Gemfile에 rails 에 버전을 4.0.0으로 맞추고 bundle install을 실행시켰드랬습니다... 아직 rubygem.org에 정식 버전으로 4.0이 올라와 있지 않아, 이런 방식으로 설치가 불가능합니다. 이렇게 하면됩니다.

blog@kssminus:~$ gem install rails -v=4.0.0.beta1 --no-document
Fetching: i18n-0.6.4.gem (100%)
Successfully installed i18n-0.6.4
Fetching: multi_json-1.7.2.gem (100%)
Successfully installed multi_json-1.7.2
Fetching: tzinfo-0.3.37.gem (100%)
Successfully installed tzinfo-0.3.37
Fetching: atomic-1.0.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed atomic-1.0.2
Fetching: thread_safe-0.1.0.gem (100%)
Successfully installed thread_safe-0.1.0
Fetching: activesupport-4.0.0.beta1.gem (100%)
Successfully installed activesupport-4.0.0.beta1
Fetching: builder-3.1.4.gem (100%)
Successfully installed builder-3.1.4
Fetching: rack-1.5.2.gem (100%)
Successfully installed rack-1.5.2
Fetching: rack-test-0.6.2.gem (100%)
Successfully installed rack-test-0.6.2
Fetching: erubis-2.7.0.gem (100%)
Successfully installed erubis-2.7.0
Fetching: actionpack-4.0.0.beta1.gem (100%)
Successfully installed actionpack-4.0.0.beta1
Fetching: activemodel-4.0.0.beta1.gem (100%)
Successfully installed activemodel-4.0.0.beta1
Fetching: arel-4.0.0.beta2.gem (100%)
Successfully installed arel-4.0.0.beta2
Fetching: activerecord-deprecated_finders-0.0.3.gem (100%)
Successfully installed activerecord-deprecated_finders-0.0.3
Fetching: activerecord-4.0.0.beta1.gem (100%)
Successfully installed activerecord-4.0.0.beta1
Fetching: mime-types-1.22.gem (100%)
Successfully installed mime-types-1.22
Fetching: polyglot-0.3.3.gem (100%)
Successfully installed polyglot-0.3.3
Fetching: treetop-1.4.12.gem (100%)
Successfully installed treetop-1.4.12
Fetching: mail-2.5.3.gem (100%)
Successfully installed mail-2.5.3
Fetching: actionmailer-4.0.0.beta1.gem (100%)
Successfully installed actionmailer-4.0.0.beta1
Fetching: thor-0.18.1.gem (100%)
Successfully installed thor-0.18.1
Fetching: rdoc-3.12.2.gem (100%)
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
Successfully installed rdoc-3.12.2
Fetching: railties-4.0.0.beta1.gem (100%)
Successfully installed railties-4.0.0.beta1
Fetching: hike-1.2.1.gem (100%)
Successfully installed hike-1.2.1
Fetching: tilt-1.3.6.gem (100%)
Successfully installed tilt-1.3.6
Fetching: sprockets-2.9.0.gem (100%)
Successfully installed sprockets-2.9.0
Fetching: sprockets-rails-2.0.0.rc3.gem (100%)
Successfully installed sprockets-rails-2.0.0.rc3
Fetching: rails-4.0.0.beta1.gem (100%)
Successfully installed rails-4.0.0.beta1
28 gems installed

이제 2.0부터 gem install할때 습관적으로 붙이던 옵션 "--no-ri --no-rdoc"을 짧게 "--no-document"로 줘도 됩니다. 이런 세심한 곳까지 신경쓴 흔적이!!

Gemfile

여기까지 하고 이제 Rails앱으로 들어가서 Gemfile을 약간 수정합니다.

제일 상단에 Rails의 버전을 4.0으로 변경합니다.

# File name : Gemfile
gem 'rails', '= 4.0.0.beta1'

우선 Rails4부터는 assets group을 더이상 지원하지 않습니다. 그래서 다음과 같이 assets group을 삭제하고 그냥 써줍니다.

# File name : Gemfile
#group :assets do 
gem 'sass-rails', '~> 3'
gem 'coffee-rails', '~> 3'
gem 'uglifier', '~> 1'
gem 'therubyracer', '~> 0.11'
#end

그리고 turbolink를 기존 소스 변경없이 사용하기 위해서 jquery-turbolinks 젬을 추가했습니다.

# File name : Gemfile
gem 'jquery-turbolinks'

railties dependancy resolving

여기까지 하고 bundle install을 실행시켰더니 에러를 밷어냅니다.

Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    coffee-rails (~> 3) ruby depends on
      railties (~> 3.1.0.rc1) ruby

    rails (= 4.0.0.beta1) ruby depends on
      railties (4.0.0.beta1)

이 에러는 coffee-rails 뿐만 아니라 sass-rails에서도 발생합니다. rails 4.0.0.beta1는 railties 4.0.0.beta1에 의존성을 가지고 있는데 3.0이상 버전의 coffee-rails와 sass-rails는 3.1.0.rc1 버전의 railsties에 의존성이 있다는 의미입니다.
Rails 4도 베타버전의 gem을 제공하듯이 이 두개의 gem도 베타버전의 gem을 제공하고 있습니다. 저는 수동으로 이 두개의 gem을 설치한 후 Gemfile을 수정했습니다.

blog@kssminus:~/dev/obtvse$ gem install saas-rails -v=4.0.0.beta1 --no-document
blog@kssminus:~/dev/obtvse$ gem install coffee-rails -v=4.0.0.beta1 --no-document

Gemfile은 rails의 버전을 적어준것 처럼 하면 됩니다.

# File name : Gemfile
gem 'sass-rails', '= 4.0.0.beta1'
gem 'coffee-rails', '= 4.0.0.beta1'

Adjusting Application

bundle install을 완료하고 신나서 rails server을 때렸죠.. 그랬더니 에러와 경고를 왕창 밷는군요.

config.whiny_nils option is deprecated and no longer works.

관련 포스트: [Rails4-1 New Routes]

환경파일에서 한줄을 주석처리 해주는것으로 이 경고는 간단히 제거 가능합니다.

# File name : config/environments/development.rb, test.rb
# config.whiny_nils = true

config.eager_load is set to nil.

관련 포스트: [Rails4-1 New Routes]

이 설정 값은 반드시 Rails4에서 추가된 설정값으로 true나 false로 정해져야합니다.

# File name : config/environments/development.rb, test.rb
config.eager_load = false
# File name : config/environments/production.rb
config.eager_load = true

The Active Record auto explain feature has been removed.

ActiveRecord auto explain Removed

잘 사용되지 않고, 디비 커넥션 약간 부작용도 있어서 없애겠다랍니다.

# File name : config/environments/development.rb
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
# config.active_record.auto_explain_threshold_in_seconds = 0.5

`ActiveRecord::SessionStore` is extracted out of Rails into a gem

Rails는 그 동안 세션을 관리하기 위해서 memcached를 이용하거나 디비를 사용해 왔습니다. memcached는 별 문제 없었지만 디비를 세션을 저장하는 장소로 사용하는데는 약간의 이슈가 있습니다.

  • session store장소 자체가 scalable하지 않다.
  • 디비에 불필요한 부하를 준다.

트래픽이 튀게 되면 세션을 저장하기 위해서 디비에 엄청난 양의 read/write 가 발생하게 되는겁니다.

그런데 제 블로그는 하루에 방문자가 20명을 못넘어가니^^; 그냥 디비를 세션 저장소로 쓸랍니다.

#Gemfile
gem 'activerecord-session_store'

Model based mass assignment security has been extracted out of Rails into a gem.

관련 포스트: [Rails4-4 Strong Parameters, Authenticity Token, Filters, Sessions, Flash]

그냥 간단하게 protected_attributes을 사용해도 되지만 그러면 너무 날로 먹는것 같아서 한번 rails 4 의 새로운 기능을 써보려고 했는데.. 실제 해보니 별로 할게 없네요..

기타

이후에 #find_or_create_byname같은 메소드를 #find\or_create_by로 바꾸고 파라미터를 해시로 바꿔준것, 그리고 routes.rb에 있는 match 키워드를 https method로 명시적으로 get으로 바꿔주는 정도 하니 4.0으로 업글이 완료되었습니다. 그래서 오늘(2013/04/05) 식목일 부터 이 블로그는 Rails 4.0입니다^^

comments powered by Disqus
Back to Ruby On Rails