레일스 2.1로 업그레이드시 주의할 점
July 24th, 2008
기존 애플리케이션이 레일스 2.0으로 작성되었다면, 2.1로 업그레이드 하기를 추천한다. 내가 생각하는 레일스 2.1의 키워드는 다음과 같다. 특히 namd_scope와 ActiveSupport::Caching을 높게 평가하고 있다.
- named_scope
- Dirty Object / Partial Updates
- ActiveSupport::Caching
- Timezone
- Association lazy loading
- Gem dependencies
- 성능 / 보안 개선
보다 자세한 내용은 http://rails21-book.springnote.com/를 참고하기로 하고, 이 글에서는 레일스 2.1로 업그레이드하면서 주의할 점을 몇가지 정리해보기로 한다. 약간 뒷북이지만 없는 것보다는 나을 것 같기는 하다 :)
Partial Updates에 주의
좋은 기능이지만, 기존 애플리케이션을 업그레이드 하는 경우라면 일단 꺼두고 충분히 테스트를 마친 후 적용하는 것이 좋겠다. 애매한(?) 오동작이 있을 수도 있다.
- ActiveRecord::Base.partial_updates = false
Rename template files
이제 때가 되었다. 아직도 rhtml, rxml과 같은 확장자를 사용하고 있다면 모두 html.erb, xml.builder 와 같은 새로운 형식으로 바꿔주자. 그렇지 않으면 Template을 찾을 수 없다는 오류를 보게 될지도 모른다.
꺼진 플러그인도 다시 보자
레일스 플러그인은 장점? 단점?이라는 글에서 이런 말을 한 적이 있다.
애플리케이션에 플러그인을 설치한다는 것은 그 플러그인 소스를 100% 읽고 이해하겠다는 전제 조건이 필요하다.
레일스 2.1로 가는 여정에 플러그인이 발목을 잡을 수도 있기에 예전 글을 다시 한번 꺼내본 것이다. 레일스 버전이 올라가면, 레일스 코드를 재정의하는 플러그인들은 대부분 최신 버전으로 함께 업데이트하는 것이 좋다. 내 경우에는 Will Paginate, ActiveScaffold, Selenium on rails를 업데이트했다. 레일스 2.1 호환을 보장하는 최신 버전이 나오지 않아, 따로 패치를 해야하는 경우도 있었으니, 구글을 잘 활용하는 것이 좋겠다.
- Issues with Active Scaffold and Rails 2.1, Solved
- Will Paginate and Rails 2.1
- Selenium on Rails breaks on Rails 2.1
- ....
named_scope처럼 따로 설치할 필요가 없는 플러그인도 있다. tzinfo, memcache_client 등 필요없어진 gem(레일스에 포함되었으므로)도 있으니 가볍게 지워주자.
Acts_as_paranoid는 validates_uniqueness_of에 적용되지 않아 버그(유일한데 아니라고 거짓말하는 버그)를 만든다. :scope에 :deleted_at 필드를 추가해서 해결하면 된다. (via http://giantrobots.thoughtbot.com/2008/6/19/gotchas-when-upgrading-to-rails-2-1)
- validates_uniqueness_of :name, :scope => [:parent_id, :deleted_at], :if => :parent_id
사랑받는 레일스 캐싱 플러그인인 Acts_as_cached의 경우, 문제가 될 것 같아 매우 신중하게 여기저기 소스를 읽어봤지만, 크게 문제가 되는 부분은 없었다. 다만 이미 레일스에 cache_key 기능이 포함된 만큼 DRY에 위배되는 플러그인이 되버린만큼 ActiveSupport를 이용한 새 버전이 만들어지고, 이 버전을 사용해야 마음이 개운할 것 같다.
그 외에도 혹시 문제가 되는 플러그인이 있을 수 있다. 하지만, 문제가 되도 걱정 할 필요없다. 레일스 플러그인이 읽기 힘든 외계어로 개발된 것도 아니고, 대부분 친숙한 루비 코드일 뿐이기 때문이다. 안되면 직접 고쳐서 쓰면 된다!
예방이 중요해
흔해빠진 표어같은 말이지만, 사실이다. 레일스 업그레이드를 일종의 리팩토링 과정이라고 본다면, 역시나 필요한 건 테스트다. 그래야 코드 변경 전/후에 행동이 바뀌지 않았다는 사실에 안도할 수 있을테니 말이다. 스프링노트는 레일스 업데이트 후 몇가지 깨지는 테스트를 통해 생길 수 있는 문제 몇가지를 미리 감지할 수 있었다.
뭐, 레일스 2.0에서 2.1로 가는 업데이트는 1.x에서 2.0으로 이주하던 것에 비하면 정말 큰 문제없이 진행할 수 있다. 그렇지만 여기 적은 내용 외에 다른 어떤 문제를 만났다면, 댓글로 남겨주기 바란다. (이 글도 계속 갱신할 예정이다)
한줄 요약: 고고싱!




July 21st, 2008 at 10:59 PM 저도 2.1로 업그레이드를 미루고 있는데, 주의사항을 딱 찍어주시니 훨 마음이 놓여요.
July 22nd, 2008 at 02:59 PM ikspres// 레일스 2.1로 업그레이드 후, 기능은 그대로 두고 코드를 줄이는(레일스 2.1의 기능들을 활용해서) 리패토링이 꽤 재밌네요 ^^
July 28th, 2008 at 07:10 AM ActionView에서 Builder::XmlMarkup 를 사용하고 있었다면 2.1에서는 ::Builder::XmlMarkup 를 사용해야 하네요. <br/>참조 : http://www.ruby-forum.com/topic/156227
July 28th, 2008 at 02:45 PM 전 2.1로 올렸다가 http://matt.blogs.it/entries/00002858.html 이 문제 때문에 잠깐 다시 내려왔어요^^ 딥블루님의 리팩토링 꼭 보고싶네요~