rubyonrails.org에서 더 보기:

GitHub에서 이 파일을 읽지 마세요. 가이드는 https://guides.rubyonrails.org 에서 제공됩니다.

Ruby on Rails 4.0 릴리스 노트

Rails 4.0의 주요 내용:

  • Ruby 2.0 선호; 1.9.3+ 필수
  • Strong Parameters
  • Turbolinks
  • Russian Doll Caching

이 릴리스 노트는 주요 변경사항만을 다룹니다. 다양한 버그 수정과 변경사항에 대해 알아보려면 변경 로그를 참조하거나 GitHub의 메인 Rails 저장소에 있는 커밋 목록을 확인하세요.

1 Rails 4.0으로 업그레이드하기

기존 애플리케이션을 업그레이드하는 경우, 진행하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 아직 하지 않으셨다면 먼저 Rails 3.2로 업그레이드하고, Rails 4.0으로 업데이트를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 업그레이드 시 주의해야 할 사항 목록은 Ruby on Rails 업그레이드하기 가이드에서 확인할 수 있습니다.

2 Rails 4.0 애플리케이션 만들기

# 'rails' RubyGem이 설치되어 있어야 합니다
$ rails new myapp
$ cd myapp

2.1 Gem Vendor화

Rails는 이제 애플리케이션을 시작하는 데 필요한 gem을 결정하기 위해 애플리케이션 루트에 있는 Gemfile을 사용합니다. 이 GemfileBundler gem에 의해 처리되며, Bundler는 모든 의존성을 설치합니다. 시스템 gem에 의존하지 않도록 모든 의존성을 애플리케이션에 로컬로 설치할 수도 있습니다.

추가 정보: Bundler 홈페이지

2.2 Edge 버전 사용하기

BundlerGemfile은 새로운 전용 bundle 명령어를 통해 Rails 애플리케이션을 프리징하는 것을 매우 쉽게 만들어줍니다. Git 저장소에서 직접 번들링하고 싶다면 --edge 플래그를 전달할 수 있습니다:

$ rails new myapp --edge

로컬에 Rails repository를 체크아웃해두고 이를 사용하여 애플리케이션을 생성하고 싶다면, --dev 플래그를 전달하면 됩니다:

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

3 Major Features

Rails 4.0

주요 기능

3.1 업그레이드

  • Ruby 1.9.3 (commit) - Ruby 2.0이 권장됨; 1.9.3 이상 필수
  • 새로운 deprecation 정책 - Deprecated된 기능들은 Rails 4.0에서는 경고로 표시되며 Rails 4.1에서 제거될 예정입니다.
  • ActionPack page와 action caching (commit) - Page와 action caching이 별도의 gem으로 분리되었습니다. Page와 action caching은 너무 많은 수동 개입이 필요합니다(기본 모델 객체가 업데이트될 때 수동으로 캐시를 만료시켜야 함). 대신 Russian doll caching을 사용하세요.
  • ActiveRecord observers (commit) - Observers가 별도의 gem으로 분리되었습니다. Observers는 page와 action caching에만 필요하며, spaghetti code를 유발할 수 있습니다.
  • ActiveRecord session store (commit) - ActiveRecord session store가 별도의 gem으로 분리되었습니다. SQL에 세션을 저장하는 것은 비용이 많이 듭니다. 대신 cookie sessions, memcache sessions, 또는 커스텀 session store를 사용하세요.
  • ActiveModel mass assignment protection (commit) - Rails 3의 mass assignment protection이 deprecated되었습니다. 대신 strong parameters를 사용하세요.
  • ActiveResource (commit) - ActiveResource가 별도의 gem으로 분리되었습니다. ActiveResource는 널리 사용되지 않았습니다.
  • vendor/plugins 제거됨 (commit) - 설치된 gem들을 관리하기 위해 Gemfile을 사용하세요.

3.2 ActionPack

  • Strong parameters (commit) - 모델 객체를 업데이트할 때 허용된 파라미터만 사용하도록 합니다 (params.permit(:title, :text)).
  • Routing concerns (commit) - 라우팅 DSL에서 공통 서브라우트를 추출합니다 (/posts/1/comments/videos/1/comments에서 comments).
  • ActionController::Live (commit) - response.stream으로 JSON을 스트리밍합니다.
  • Declarative ETags (commit) - 액션 ETag 계산의 일부가 될 컨트롤러 수준의 ETag 추가를 지원합니다.
  • Russian doll caching (commit) - 중첩된 뷰 프래그먼트를 캐싱합니다. 각 프래그먼트는 의존성 집합(캐시 키)에 따라 만료됩니다. 캐시 키는 일반적으로 템플릿 버전 번호와 모델 객체입니다.
  • Turbolinks (commit) - 초기 HTML 페이지를 한 번만 제공합니다. 사용자가 다른 페이지로 이동할 때 pushState를 사용하여 URL을 업데이트하고 AJAX를 사용하여 제목과 본문을 업데이트합니다.
  • Decouple ActionView from ActionController (commit) - ActionView가 ActionPack에서 분리되어 Rails 4.1에서는 별도의 gem으로 이동될 예정입니다.
  • Do not depend on ActiveModel (commit) - ActionPack이 더 이상 ActiveModel에 의존하지 않습니다.

3.3 General

  • ActiveModel::Model (commit) - ActiveModel::Model은 일반 Ruby 객체가 ActionPack과 바로 동작하도록 만드는 mixin입니다 (예: form_for에서 사용)
  • 새로운 scope API (commit) - Scope는 항상 callable을 사용해야 합니다.
  • Schema cache dump (commit) - Rails 부팅 시간을 개선하기 위해, 데이터베이스에서 직접 스키마를 로드하는 대신 dump 파일에서 스키마를 로드합니다.
  • 트랜잭션 격리 수준 지정 지원 (commit) - 반복 가능한 읽기와 향상된 성능(적은 잠금) 중 무엇이 더 중요한지 선택할 수 있습니다.
  • Dalli (commit) - memcache store를 위해 Dalli memcache 클라이언트를 사용합니다.
  • Notifications start & finish (commit) - Active Support 계측이 구독자에게 시작과 종료 알림을 보고합니다.
  • 기본적으로 스레드 세이프 (commit) - Rails는 추가 구성 없이 스레드 앱 서버에서 실행될 수 있습니다.

주의: 사용 중인 gem들이 스레드 세이프한지 확인하세요.

  • PATCH 동사 (commit) - Rails에서 PATCH가 PUT을 대체합니다. PATCH는 리소스의 부분 업데이트에 사용됩니다.

3.4 보안

  • match는 모든 것을 catch하지 않음 (commit) - 라우팅 DSL에서 match는 HTTP 메서드를 명시적으로 지정해야 합니다.
  • html 엔티티가 기본적으로 이스케이프됨 (commit) - erb에서 렌더링되는 문자열은 raw로 감싸거나 html_safe가 호출되지 않는 한 이스케이프됩니다.
  • 새로운 보안 헤더 (commit) - Rails는 모든 HTTP 요청에 다음 헤더를 전송합니다: X-Frame-Options (브라우저가 페이지를 프레임에 임베딩하는 것을 금지하여 클릭재킹 방지), X-XSS-Protection (브라우저에 스크립트 주입 중단 요청) 및 X-Content-Type-Options (브라우저가 jpeg를 exe로 여는 것을 방지).

4 기능의 gem 추출

Rails 4.0에서는 여러 기능들이 gem으로 추출되었습니다. 해당 기능을 다시 사용하려면 Gemfile에 추출된 gem들을 추가하면 됩니다.

5 문서

  • 가이드가 GitHub Flavored Markdown으로 다시 작성되었습니다.

  • 가이드가 반응형 디자인을 적용했습니다.

6 Railties

자세한 변경사항은 Changelog를 참조하세요.

6.1 주목할 만한 변경사항

  • 새로운 테스트 위치 test/models, test/helpers, test/controllers, test/mailers. 이에 해당하는 rake task도 추가되었습니다. (Pull Request)

  • 앱의 실행 파일들이 이제 bin/ 디렉토리에 위치합니다. rake rails:update:bin을 실행하여 bin/bundle, bin/rails, bin/rake를 얻을 수 있습니다.

  • Threadsafe가 기본적으로 활성화됨

  • rails new--builder (또는 -b)를 전달하여 custom builder를 사용하는 기능이 제거되었습니다. 대신 application templates 사용을 고려해보세요. (Pull Request)

6.2 Deprecations

  • config.threadsafe!는 더 세밀한 eager load 제어를 제공하는 config.eager_load를 선호하여 deprecated 되었습니다.

  • Rails::Plugin은 제거되었습니다. vendor/plugins에 플러그인을 추가하는 대신 gems나 path 또는 git dependencies를 사용하는 bundler를 사용하세요.

7 Action Mailer

자세한 변경 사항은 Changelog를 참조하세요.

7.1 주목할 만한 변경사항

7.2 Deprecations

8 Active Model

상세한 변경사항은 Changelog를 참고하세요.

8.1 주목할 만한 변경사항

  • mass assignment에서 허용되지 않은 속성이 전달될 때 속성을 보호하기 위한 간단한 모듈인 ActiveModel::ForbiddenAttributesProtection을 추가했습니다.

  • Ruby 객체가 Action Pack과 즉시 동작할 수 있도록 하는 mixin인 ActiveModel::Model을 추가했습니다.

8.2 사용 중단(Deprecation)

9 Active Support

자세한 변경사항은 Changelog를 참조하세요.

9.1 주목할 만한 변경사항

  • ActiveSupport::Cache::MemCacheStore에서 deprecated된 memcache-client gem을 dalli로 교체했습니다.

  • 메모리와 처리 오버헤드를 줄이기 위해 ActiveSupport::Cache::Entry를 최적화했습니다.

  • Inflection을 이제 locale별로 정의할 수 있습니다. singularizepluralize는 추가 인자로 locale을 받습니다.

  • Object#try는 이제 receiving object가 메서드를 구현하지 않은 경우 NoMethodError를 발생시키는 대신 nil을 반환합니다. 하지만 새로운 Object#try!를 사용하여 이전 동작을 그대로 유지할 수 있습니다.

  • String#to_date는 이제 유효하지 않은 날짜가 주어졌을 때 NoMethodError: undefined method 'div' for nil:NilClass 대신 ArgumentError: invalid date를 발생시킵니다. 이제 Date.parse와 동일하며, 3.x보다 더 많은 유효하지 않은 날짜를 허용합니다. 예를 들면:

    # ActiveSupport 3.x
    "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass
    
    # ActiveSupport 4
    "asdf".to_date # => ArgumentError: invalid date
    "333".to_date # => Fri, 29 Nov 2013
    

9.2 지원 중단

  • ActiveSupport::TestCase#pending 메소드는 지원 중단되었으며, 대신 minitest의 skip을 사용하세요.

  • ActiveSupport::Benchmarkable#silence는 스레드 안전성 부족으로 인해 지원 중단되었습니다. Rails 4.1에서는 대체 없이 제거될 예정입니다.

  • ActiveSupport::JSON::Variable이 지원 중단되었습니다. 커스텀 JSON 문자열 리터럴을 위해 직접 #as_json#encode_json 메소드를 정의하세요.

  • 호환성 메소드 Module#local_constant_names가 지원 중단되었습니다. 대신 Module#local_constants를 사용하세요 (심볼을 반환합니다).

  • ActiveSupport::BufferedLogger가 지원 중단되었습니다. ActiveSupport::Logger나 Ruby 표준 라이브러리의 logger를 사용하세요.

  • assert_presentassert_blank가 지원 중단되었습니다. 대신 assert object.blank?assert object.present?를 사용하세요.

10 Action Pack

자세한 변경사항은 Changelog를 참조하세요.

10.1 주목할 만한 변경사항

  • Development mode의 exception 페이지의 stylesheet를 변경했습니다. 또한 모든 exception 페이지에서 exception이 발생한 코드의 라인과 해당 부분을 함께 표시하도록 했습니다.

10.2 지원 중단 사항

11 Active Record

자세한 변경 사항은 Changelog를 참조하세요.

11.1 주목할 만한 변경사항

  • change migration 작성 방법이 개선되어, 기존의 up & down 메서드가 더 이상 필요하지 않게 되었습니다.

    • drop_tableremove_column 메서드는 필요한 정보가 제공되는 한 이제 되돌릴 수 있습니다. remove_column 메서드는 이전에 여러 컬럼 이름을 허용했습니다. 대신 remove_columns를 사용하세요 (되돌릴 수 없음). change_table 또한 블록 내에서 remove, change 또는 change_default를 호출하지 않는 한 되돌릴 수 있습니다.
    • 새로운 reversible 메서드를 사용하면 마이그레이션 업 또는 다운 시 실행할 코드를 지정할 수 있습니다. 마이그레이션 가이드를 참조하세요.
    • 새로운 revert 메서드는 전체 마이그레이션이나 주어진 블록을 되돌립니다. 다운 마이그레이션 시, 주어진 마이그레이션/블록이 정상적으로 실행됩니다. 마이그레이션 가이드를 참조하세요.
  • PostgreSQL array 타입 지원이 추가되었습니다. 모든 데이터타입을 사용하여 array 컬럼을 생성할 수 있으며, 마이그레이션과 schema dumper를 완벽하게 지원합니다.

  • 명시적으로 레코드를 로드하고 self를 반환하는 Relation#load가 추가되었습니다.

  • Model.all은 이제 레코드 배열 대신 ActiveRecord::Relation을 반환합니다. 배열이 정말 필요한 경우 Relation#to_a를 사용하세요. 특정 경우에는 업그레이드 시 이로 인해 문제가 발생할 수 있습니다.

  • 마이그레이션이 대기 중일 때 에러를 발생시키는 ActiveRecord::Migration.check_pending!이 추가되었습니다.

  • ActiveRecord::Store에 커스텀 coder 지원이 추가되었습니다. 이제 다음과 같이 커스텀 coder를 설정할 수 있습니다:

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • mysqlmysql2 연결은 묵시적인 데이터 손실을 방지하기 위해 기본적으로 SQL_MODE=STRICT_ALL_TABLES를 설정합니다. database.yml에서 strict: false를 지정하여 이를 비활성화할 수 있습니다.

  • IdentityMap이 제거되었습니다.

  • EXPLAIN 쿼리의 자동 실행이 제거되었습니다. active_record.auto_explain_threshold_in_seconds 옵션은 더 이상 사용되지 않으며 제거되어야 합니다.

  • Relation 클래스를 위한 null 객체 패턴을 구현하는 ActiveRecord::NullRelationActiveRecord::Relation#none이 추가되었습니다.

  • HABTM join 테이블을 생성하는 create_join_table 마이그레이션 헬퍼가 추가되었습니다.

  • PostgreSQL hstore 레코드 생성이 가능해졌습니다.

11.2 Deprecations

  • 이전 방식의 해시 기반 finder API는 deprecated 되었습니다. 이는 이전에 "finder options"를 허용했던 메서드들이 더 이상 허용되지 않는다는 의미입니다.

  • find_by_...find_by_...!를 제외한 모든 동적 메서드는 deprecated 되었습니다. 다음과 같이 코드를 다시 작성할 수 있습니다:

    • find_all_by_...where(...)를 사용하여 다시 작성할 수 있습니다.
    • find_last_by_...where(...).last를 사용하여 다시 작성할 수 있습니다.
    • scoped_by_...where(...)를 사용하여 다시 작성할 수 있습니다.
    • find_or_initialize_by_...find_or_initialize_by(...)를 사용하여 다시 작성할 수 있습니다.
    • find_or_create_by_...find_or_create_by(...)를 사용하여 다시 작성할 수 있습니다.
    • find_or_create_by_...!find_or_create_by!(...)를 사용하여 다시 작성할 수 있습니다.

12 Credits

Rails를 안정적이고 강력한 프레임워크로 만들기 위해 많은 시간을 투자한 수많은 사람들을 보려면 Rails 기여자 전체 목록을 참조하세요. 이 모든 분들께 감사드립니다.



맨 위로