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
을 사용하여 애플리케이션에 필요한 젬을 결정합니다. 이 Gemfile
은 Bundler 젬에 의해 처리되며, Bundler는 모든 종속성을 설치합니다. 심지어 모든 종속성을 애플리케이션 로컬에 설치할 수 있어 시스템 젬에 의존하지 않습니다.
더 자세한 정보: Bundler 홈페이지
최신 버전 사용하기
Bundler
와 Gemfile
을 사용하면 새로운 전용 bundle
명령으로 Rails 애플리케이션을 쉽게 동결할 수 있습니다. Git 저장소에서 직접 번들링하려면 --edge
플래그를 전달하면 됩니다:
$ rails new myapp --edge
로컬에 Rails 저장소가 있고 그것을 사용하여 애플리케이션을 생성하려면 --dev
플래그를 전달하면 됩니다:
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
주요 기능
업그레이드
- 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/comments
의comments
). - 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)
Active Record 모델의 대량 할당 보호 ([GitHub](https://github.com/네, 번역을 계속하겠습니다.
ActiveRecord::SessionStore (GitHub, Pull Request)
Active Resource (GitHub, Pull Request, Blog)
액션 캐싱 (GitHub, Pull Request)
페이지 캐싱 (GitHub, Pull Request)
Sprockets (GitHub)
성능 테스트 (GitHub, Pull Request)
문서화
가이드가 GitHub Flavored Markdown으로 다시 작성되었습니다.
가이드에 반응형 디자인이 적용되었습니다.
Railties
자세한 변경 사항은 변경 로그를 참조하세요.
주요 변경 사항
새로운 테스트 위치
test/models
,test/helpers
,test/controllers
및test/mailers
. 해당 rake 작업도 추가되었습니다. (Pull Request)애플리케이션의 실행 파일이 이제
bin/
디렉토리에 있습니다.rake rails:update:bin
을 실행하여bin/bundle
,bin/rails
및bin/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
를 최적화하여 메모리 및 처리 오버헤드를 줄였습니다.로케일별로 변형을 정의할 수 있습니다.
singularize
와pluralize
는 로케일을 추가 인수로 허용합니다.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_present
와assert_blank
가 사용 중단되었습니다. 대신assert object.blank?
와assert object.present?
를 사용하세요.
Action Pack
자세한 변경 사항은 변경 로그를 참조하세요.
주요 변경 사항
- 개발 모드의 예외 페이지 스타일시트를 변경했습니다. 또한 모든 예외 페이지에서 예외를 발생시킨 코드 줄과 조각도 표시합니다.
사용 중단
Active Record
자세한 변경 사항은 변경 로그를 참조하세요.
주요 변경 사항
change
마이그레이션을 작성하는 방법을 개선하여 이제up
및down
메서드가 더 이상 필요하지 않습니다.drop_table
과remove_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
mysql
및mysql2
연결은 기본적으로SQL_MODE=STRICT_ALL_TABLES
를 설정하여 숨겨진 데이터 손실을 방지합니다. 이는database.yml
에서strict: false
를 지정하여 비활성화할 수 있습니다.IdentityMap을 제거했습니다.
EXPLAIN 쿼리의 자동 실행을 제거했습니다.
active_record.auto_explain_threshold_in_seconds
옵션이 더 이상 사용되지 않으며 제거해야 합니다.ActiveRecord::NullRelation
과ActiveRecord::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에 많은 시간을 보내 안정적이고 강력한 프레임워크로 만든 모든 기여자의 전체 목록을 참조하세요. 모든 분들께 박수를 보냅니다.