Ruby on Rails 4.0 릴리스 노트

Rails 4.0의 주요 기능:

  • Ruby 2.0 선호, 1.9.3+ 필수
  • 강력한 매개변수
  • 터보링크
  • 러시안 돌 캐싱

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


Rails 4.0으로 업그레이드하기

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

Rails 4.0 애플리케이션 생성하기

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

젬 포함하기

Rails는 이제 애플리케이션 루트에 있는 Gemfile을 사용하여 애플리케이션에 필요한 젬을 결정합니다. 이 GemfileBundler 젬에 의해 처리되며, Bundler는 모든 종속성을 설치합니다. 심지어 모든 종속성을 애플리케이션 로컬에 설치할 수 있어 시스템 젬에 의존하지 않습니다.

더 자세한 정보: Bundler 홈페이지

최신 버전 사용하기

BundlerGemfile을 사용하면 새로운 전용 bundle 명령으로 Rails 애플리케이션을 쉽게 동결할 수 있습니다. Git 저장소에서 직접 번들링하려면 --edge 플래그를 전달하면 됩니다:

$ rails new myapp --edge

로컬에 Rails 저장소가 있고 그것을 사용하여 애플리케이션을 생성하려면 --dev 플래그를 전달하면 됩니다:

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

주요 기능

Rails 4.0

업그레이드

  • Ruby 1.9.3 (commit) - Ruby 2.0 선호, 1.9.3+ 필수
  • 새로운 사용 중단 정책 - Rails 4.0에서는 사용 중단된 기능이 경고로 표시되며, Rails 4.1에서 제거됩니다.
  • ActionPack 페이지 및 액션 캐싱 (commit) - 페이지 및 액션 캐싱이 별도의 젬으로 추출되었습니다. 페이지 및 액션 캐싱에는 수동 개입(기본 모델 객체가 업데이트될 때 캐시 만료)이 너무 많이 필요합니다. 대신 러시안 돌 캐싱을 사용하세요.
  • ActiveRecord 옵저버 (commit) - 옵저버가 별도의 젬으로 추출되었습니다. 옵저버는 페이지 및 액션 캐싱에만 필요하며 스파게티 코드를 유발할 수 있습니다.
  • ActiveRecord 세션 저장소 (commit) - ActiveRecord 세션 저장소가 별도의 젬으로 추출되었습니다. SQL에 세션을 저장하는 것은 비용이 많이 듭니다. 대신 쿠키 세션, memcache 세션 또는 사용자 정의 세션 저장소를 사용하세요.
  • ActiveModel 대량 할당 보호 (commit) - Rails 3의 대량 할당 보호가 사용 중단되었습니다. 대신 강력한 매개변수를 사용하세요.
  • ActiveResource (commit) - ActiveResource가 별도의 젬으로 추출되었습니다. ActiveResource는 널리 사용되지 않았습니다.
  • vendor/plugins 제거 (commit) - Gemfile을 사용하여 설치된 젬을 관리하세요.

ActionPack

  • 강력한 매개변수 (commit) - 모델 객체를 업데이트할 때 허용된 매개변수만 사용할 수 있습니다(params.permit(:title, :text)).
  • 라우팅 관심사 (commit) - 라우팅 DSL에서 공통 하위 경로를 추출할 수 있습니다(/posts/1/comments/videos/1/commentscomments).
  • ActionController::Live (commit) - response.stream으로 JSON을 스트리밍합니다.
  • 선언적 ETag (commit) - 액션 ETag 계산에 포함될 컨트롤러 수준의 ETag 추가.
  • 러시안 돌 캐싱 (commit) - 뷰의 중첩된 조각을 캐싱합니다. 각 조각은 일련의 종속성(캐시 키)을 기반으로 만료됩니다. 캐시 키는 일반적으로 템플릿 버전 번호와 모델 객체입니다.
  • 터보링크 (commit) - 초기 HTML 페이지만 제공합니다. 사용자가 다른 페이지로 이동할 때 pushState를 사용하여 URL을 업데이트하고 AJAX를 사용하여 제목과 본문을 업데이트합니다.
  • ActionView를 ActionController에서 분리 (commit) - ActionView가 ActionPack에서 분리되었으며 Rails 4.1에서 별도의 젬으로 이동될 예정입니다.
  • ActiveModel에 의존하지 않음 (commit) - ActionPack이 더 이상 ActiveModel에 의존하지 않습니다.

일반

  • ActiveModel::Model (commit) - ActiveModel::Model은 일반 Ruby 객체를 ActionPack과 함께 사용할 수 있게 해주는 믹스인입니다(form_for).
  • 새로운 스코프 API (commit) - 스코프는 항상 호출 가능한 객체를 사용해야 합니다.
  • 스키마 캐시 덤프 (commit) - Rails 부팅 시간을 개선하기 위해 데이터베이스에서 직접 스키마를 로드하는 대신 덤프 파일에서 로드합니다.
  • 트랜잭션 격리 수준 지정 지원 (commit) - 반복 가능한 읽기 또는 향상된 성능(더 적은 잠금)이 더 중요한지 선택할 수 있습니다.
  • Dalli (commit) - memcache 저장소에 Dalli memcache 클라이언트를 사용합니다.
  • 알림 시작 및 완료 (commit) - Active Support 계측은 시작 및 완료 알림을 구독자에게 보고합니다.
  • 기본적으로 스레드 안전 (commit) - Rails는 추가 구성 없이 스레드 안전 앱 서버에서 실행될 수 있습니다.

참고: 사용 중인 젬이 스레드 안전한지 확인하세요.

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

보안

  • match가 모든 것을 잡지 않음 (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로 열지 않도록 방지).

기능의 젬 추출

Rails 4.0에서는 여러 기능이 젬으로 추출되었습니다. 추출된 젬을 Gemfile에 추가하면 해당 기능을 다시 사용할 수 있습니다.

문서화

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

  • 가이드에 반응형 디자인이 적용되었습니다.

Railties

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

주요 변경 사항

  • 새로운 테스트 위치 test/models, test/helpers, test/controllerstest/mailers. 해당 rake 작업도 추가되었습니다. (Pull Request)

  • 애플리케이션의 실행 파일이 이제 bin/ 디렉토리에 있습니다. rake rails:update:bin을 실행하여 bin/bundle, bin/railsbin/rake를 얻으세요.

  • 기본적으로 스레드 안전

  • --builder (또는 -b)를 rails new에 전달하여 사용자 정의 빌더를 사용할 수 있는 기능이 제거되었습니다. 대신 애플리케이션 템플릿을 사용하는 것을 고려해 보세요. (Pull Request)

사용 중단

  • config.threadsafe!config.eager_load로 사용 중단되었으며, 이는 무엇이 적극적으로 로드되는지에 대한 더 세부적인 제어를 제공합니다.

  • Rails::Plugin이 사라졌습니다. vendor/plugins에 플러그인을 추가하는 대신 젬 또는 경로 또는 Git 종속성이 있는 Bundler를 사용하세요.

Action Mailer

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

주요 변경 사항

사용 중단

Active Model

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

주요 변경 사항

  • ActiveModel::ForbiddenAttributesProtection을 추가하여 허용되지 않은 속성이 전달될 때 대량 할당으로부터 속성을 보호합니다.

  • ActiveModel::Model을 추가하여 일반 Ruby 객체를 Action Pack과 함께 사용할 수 있게 해줍니다.

사용 중단

Active Support

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

주요 변경 사항

  • memcache-client 젬을 dalli로 대체하여 ActiveSupport::Cache::MemCacheStore를 사용합니다.

  • ActiveSupport::Cache::Entry를 최적화하여 메모리 및 처리 오버헤드를 줄였습니다.

  • 로케일별로 변형을 정의할 수 있습니다. singularizepluralize는 로케일을 추가 인수로 허용합니다.

  • Object#try는 이제 수신 객체가 메서드를 구현하지 않으면 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
    

사용 중단

  • 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 표준 라이브러리의 로거를 사용하세요.

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

Action Pack

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

주요 변경 사항

  • 개발 모드의 예외 페이지 스타일시트를 변경했습니다. 또한 모든 예외 페이지에서 예외를 발생시킨 코드 줄과 조각도 표시합니다.

사용 중단

Active Record

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

주요 변경 사항

  • change 마이그레이션을 작성하는 방법을 개선하여 이제 updown 메서드가 더 이상 필요하지 않습니다.

    • drop_tableremove_column 메서드가 이제 reversible합니다. 필요한 정보가 제공되는 한 말입니다. remove_column은 여러 열 이름을 허용했지만, 대신 remove_columns를 사용하세요(reversible하지 않음). change_table 메서드도 reversible합니다. 블록에서 remove, change 또는 change_default를 호출하지 않는 한 말입니다.
    • 새로운 reversible 메서드를 사용하면 마이그레이션 업 또는 다운 시 실행할 코드를 지정할 수 있습니다. 마이그레이션 가이드를 참조하세요.
    • 새로운 revert 메서드를 사용하면 전체 마이그레이션 또는 지정된 블록을 되돌릴 수 있습니다. 다운 마이그레이션 시 지정된 마이그레이션/블록이 정상적으로 실행됩니다. 마이그레이션 가이드를 참조하세요.
  • PostgreSQL 배열 유형 지원을 추가했습니다. 모든 데이터 유형을 사용하여 배열 열을 만들 수 있으며 완전한 마이그레이션 및 스키마 덤프 지원이 제공됩니다.

  • Relation#load를 추가하여 명시적으로 레코드를 로드하고 self를 반환합니다.

  • Model.all이 이제 배열이 아닌 ActiveRecord::Relation을 반환합니다. 배열을 원하는 경우 Relation#to_a를 사용하세요. 일부 특정 경우에는 이로 인해 업그레이드 시 문제가 발생할 수 있습니다.

  • ActiveRecord::Migration.check_pending!을 추가하여 보류 중인 마이그레이션이 있는 경우 오류를 발생시킵니다.

  • ActiveRecord::Store에 대한 사용자 정의 코더 지원을 추가했습니다. 이제 다음과 같이 사용자 정의 코더를 설정할 수 있습니다:

    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 옵션이 더 이상 사용되지 않으며 제거해야 합니다.

  • ActiveRecord::NullRelationActiveRecord::Relation#none을 추가하여 Relation 클래스에 널 객체 패턴을 구현했습니다.

  • create_join_table 마이그레이션 헬퍼를 추가하여 HABTM 조인 테이블을 생성할 수 있습니다.

  • PostgreSQL hstore 레코드 생성을 허용했습니다.

사용 중단

  • 이전 스타일의 해시 기반 파인더 API가 사용 중단되었습니다. 즉, 이전에 “파인더 옵션"을 허용했던 메서드가 더 이상 그렇지 않습니다.

  • find_by_...find_by_...! 이외의 모든 동적 메서드가 사용 중단되었습니다. 다음과 같이 코드를 다시 작성할 수 있습니다:

    • 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!(...)를 사용하여 다시 작성할 수 있습니다.

크레딧

Rails에 많은 시간을 보내 안정적이고 강력한 프레임워크로 만든 모든 기여자의 전체 목록을 참조하세요. 모든 분들께 박수를 보냅니다.