Rails 6.1의 Delegated Types: 다중 테이블 상속의 새로운 접근

Delegated Types - Rails in Focus - YouTube

3줄 요약

  • Rails 6.1에 도입된 Delegated Types는 다중 테이블 상속을 통해 데이터베이스 내 객체 지향 상속을 처리하는 새로운 방식입니다.
  • 이는 Single Table Inheritance(STI)의 단점인 불필요한 속성으로 인한 공간 낭비와 혼란을 해결하며, 각 모델이 자체 테이블을 가집니다.
  • Delegated Types는 명시적이고 타입 안전하며, 특정 하위 모델에 대한 간소화된 쿼리 및 메서드 호출을 제공하여 더 나은 유효성 검사 및 쿼리 최적화를 가능하게 합니다.

Rails In Focus 시리즈의 일환으로, 본 영상은 Rails 6.1에 도입된 'Delegated Types' 기능에 대해 심도 있게 다룹니다. 이 기능은 데이터베이스 내에서 객체 지향 상속을 구현하는 Rails의 기본 방식 중 하나로, 기존의 Single Table Inheritance(STI) 및 클래식 다형성(Polymorphism)과 차별화됩니다. Delegated Types는 각 모델이 자체 데이터베이스 테이블에 해당하는 '다중 테이블 상속' 개념으로 이해할 수 있으며, 이는 데이터 모델링의 유연성과 효율성을 크게 향상시킵니다.

Delegated Types의 필요성 및 문제 해결

Delegated Types가 해결하고자 하는 주요 문제점은 Single Table Inheritance(STI)에서 발생하는 ‘속성 분산(attribute diversion)’ 문제입니다. 예를 들어, Message 모델이 subject 속성을 가지지만 Comment 모델에는 해당 속성이 필요 없는 경우, STI 방식에서는 subject 속성이 Comment 모델에도 불필요하게 존재하여 데이터베이스 공간을 낭비하고 잠재적인 혼란을 야기할 수 있습니다. Delegated Types는 이러한 비효율성을 제거하고 각 모델의 특성에 맞는 속성만 포함하도록 합니다.

Delegated Types의 구현 및 작동 방식

본 영상은 소셜 네트워킹 애플리케이션 구축 시나리오를 통해 Delegated Types의 구현 방식을 상세히 설명합니다. Post 모델이 Video 또는 Article이 될 수 있는 경우를 가정하여 다음과 같이 구현됩니다.

  1. 마이그레이션 파일: posts 테이블은 t.references :postable, polymorphic: true, null: false와 같이 postable이라는 다형성 참조를 포함합니다. articles 테이블은 content 속성을, videos 테이블은 URL 속성을 가집니다. 이는 각 하위 모델이 독립적인 테이블과 속성을 가지도록 합니다.

  2. 모델 설정: Post 모델에는 delegated_type :postable, types: %w[Article Video]가 정의되어 PostArticle 또는 Video 타입으로 위임될 수 있음을 명시합니다. ArticleVideo 모델은 Postable이라는 Concern을 포함하는데, 이 Concern은 has_one :post, as: :postable, touch: true를 정의하여 각 하위 모델이 상위 Post와 연결되도록 합니다. 이 구조를 통해 각 모델은 독립성을 유지하면서도 상위 모델을 통해 통합적으로 관리될 수 있습니다.

Delegated Types의 주요 장점 및 활용

Delegated Types는 개발 편의성과 코드 효율성을 높이는 여러 이점을 제공합니다.

  • 간편한 쿼리: Post.videos 또는 Post.articles와 같은 편리한 쿼리 메서드를 통해 특정 유형의 게시물만 쉽게 가져올 수 있습니다. 이는 복잡한 SQL 쿼리 없이도 특정 콘텐츠를 필터링하거나 페이징 처리하는 데 매우 유용합니다.

  • 예측(Predicate) 메서드: post.last.video? 또는 post.last.article?와 같은 예측 메서드를 사용하여 객체의 실제 유형을 쉽게 확인할 수 있습니다. 이는 객체 지향적인 접근 방식을 강화하고, 다형성 연관 관계에서는 얻기 어려운 타입 안전성을 제공합니다.

Polymorphic Associations와의 비교

Delegated Types는 기존의 다형성 연관 관계(Polymorphic Associations)와 비교하여 다음과 같은 차이점을 가집니다.

  • 다형성 연관 관계: 유연하지만 덜 명시적입니다. 어떤 모델과도 연관될 수 있어 유형별 동작을 수동으로 처리해야 할 수 있으며, 이는 복잡성이 증가할 수 있습니다.

  • Delegated Types: 명시적이고 타입 안전합니다. 연관된 모델을 명확하게 정의하고, 더 나은 유효성 검사, 콜백 처리 및 쿼리 최적화를 제공합니다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 기여합니다.

결론적으로, Delegated Types는 Rails 애플리케이션에서 객체 지향 상속을 구현하는 강력하고 효율적인 대안입니다. 이 기능은 Single Table Inheritance(STI)의 단점을 효과적으로 보완하고, 데이터 모델의 명시성과 타입 안전성을 강화합니다. 개발자는 Delegated Types를 활용하여 더욱 깔끔하고 최적화된 코드를 작성할 수 있으며, 특히 Rails 6.1 이상 버전을 사용하는 프로젝트에서 복잡한 상속 구조나 다양한 유형의 콘텐츠를 다룰 때 매우 유용하게 적용할 수 있습니다. 이는 Rails 개발의 생산성과 애플리케이션의 성능을 동시에 향상시키는 중요한 기능으로 평가됩니다.