Ruby On Rails/버전이야기

ruby on rails 6.1.3 버전 정리

Dexlee 2021. 3. 6. 11:53

 우리 회사에서 6.0 버전을 사용하고 있어서 6.1 버전을 적용해보았지만 역시나 쉽지 않았다. 호환되지 않는 젬들이나 아예 6.1 버전과 호환이 되지 않는 젬들도 있었다. 그 젬들을 버전 업과 주석처리를 한 후 6.1.3 버전으로 업그레이드하였지만, 서버 실행 시 not singleton(TypeError)가 발생하였다. 에러가 나는 부분의 로그를 확인해 보면 들어오는 객체 모두 싱글톤으로 들어와야 하는데, 싱글톤으로 들어오지 않는 객체가 존재하였다. 그리고 이 에러를 rails 팀에서 해결했다고 머지까지 시켜놓은 글을 보았는데, 모든 경우에 완벽히 해결된 것은 아니라는 생각을 하였다. 결론은 전 버전으로 사용하는데 바로 업그레이드하여 사용하기에는 아직 불안정하다고 생각했다.

 6.1.3 버전에 대한 모든 변경점을 정리한 글은 아니고 내가 현재 중요하다고 느끼는 부분에 중점을 두고 정리한 글이다. 그리고 삭제된 객체나 deprecated 된 객체는 적어놓지 않았고 변경점만 정리하였다. 그러한 내용들은 직접 레일즈 사이트에 들어가서 확인하시길 바란다.

 

1. per-database connection switching

 각 데이터베이스를 스위칭할 수 있다.

1) 6.0 버전

 한번 스위칭을 하면 모든 데이터베이스에 적용이 되었다. 만약 reading role로 스위칭을 하면, 모든 데이터베이스 커넥션도 reading role로 변경이 되었다. 또한 connectionHandler는 두 개를 사용한다.

이렇게 writing에 대한 커넥션핸들러와 reading에 대한 커넥션핸들러가 존재해서 각 데이터베이스마다 룰을 줄 수 없는 구조이다.

2) 6.1 버전

 커넥션 스위칭을 각 데이터베이스 마다 변경을 적용할 수 있게끔 하였다. 이때, 각 모델들 단위로 커넥션 스위칭을 할 수 없다. 오직 추상 모델들만 커넥션스위칭을 할 수 있다. 또한 connectionHandler는 하나를 사용한다.

이렇게 커넥션 핸들러를 하나로 관리를 하며 poolManager를 두어서 이 매니저가 writing과 reading을 관리할 수 있게 하였다. 즉, 이 poolManager가 각 데이터베이스에 할당이 되는 것이다.

 

2. horizontal sharding

1) 데이터베이스를 쪼개었을 때, 각 데이터베이스의 행의 수를 줄이기 위한 것을 의미.

2) "multi-tenant" sharding 이라고도 부름.

3) 6.1 버전 이전에는 모델이 하나의 커넥션과 하나의 롤 하나의 클래스만 가질 수 있으므로 horizontal sharding을 지원하지 않았다.

 

3. strict loading associations

1) 모든 연관관계를 eager 로드하고 n+1을 발생하지 않게 하는 것이 목적

2) 문제점

(1) 그런데 이렇게 모든 연관관계를 즉시로딩을 하면.. 속도의 문제가 생길 수 있다.

(2) 즉 필요없는 연관관계에 대해서는 지연로딩으로 설정해주고, 꼭 필요한 데이터가 포함된 테이블만 즉시로딩을 해주는 것이 좋다. (자바 ORM 표준 JPA 프로그래밍 책 참고)

 

4. delegated type

1) an alternative to single-table inheritance

2) 멀티 테이블 상속과 비슷하지만 실제 상속하고는 다르다.

3) 이 접근은 계층을 형성해 위임을 사용하고 책임을 공유한다.

 

5. destroy associations async

1) 비동기로 연관관계를 삭제

2) has_many :players, dependent: :destroy_async

 

6. action pack

1) ActionDispatch::Response#content_type

 to return the full Content-Type header.

 

7. action view

1) Require that ActionView::Base subclasses implement #compiled_method_container

2) Make locals argument required on ActionView::Template#initialize

3) javascript_include_tag 와 stylesheet_link_tag asset helpers가 link header를 생성하는데, 이 링크 해더가 modern browsers에 프리로딩을 할 것에 대한 힌트를 준다. setting : config.action_view.preload_links_header = false로 놓는다면, 프리로딩을 안 할 수도 있다.

 

8. active record

1) uniqueness validator 가 database collation(정렬) 디폴트 방식을 존중해서 더이상 case sensitive comparison이 디폴트가 아니다.

 즉, rails 에서 where(name: 'store') == where(name: 'Store')는 같은 의미로 인식한다.

2) relation.create does no longer leak scope to class level querying methods in initialization block and callbacks.

3) 각 데이터베이스 커넥션을 따로 사용하려면..

  1. legacy_connection_handling = false
  2. remove deprecated accessors on connection_handlers
  3. Public methods for connects_to and connected_to require no changes.

9. active model

1) error objects

2) 쿼리 인터페이스를 포함

3) 더 정확한 테스트를 가능하게 함

4) 더 자세한 에러메세지에 접근 가능함.

 

10. action text

1) add method ?

  1. 텍스트에 바로 ? 를 붙여서 true or false를 판별할 수 있다.
  2. i.notes.present? before 6.1
  3. i.notes?

works cited

https://guides.rubyonrails.org/6_1_release_notes.html

https://github.com/rails/rails/pull/40370

https://edgeguides.rubyonrails.org/active_record_multiple_databases.html#horizontal-sharding

https://github.com/rails/rails/pull/37400

https://github.com/rails/rails/pull/39341

https://github.com/rails/rails/pull/32313

https://github.com/rails/rails/pull/37951

https://github.com/rails/rails/pull/38144