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
이 될 수 있는 경우를 가정하여 다음과 같이 구현됩니다.
-
마이그레이션 파일:
posts
테이블은t.references :postable, polymorphic: true, null: false
와 같이postable
이라는 다형성 참조를 포함합니다.articles
테이블은content
속성을,videos
테이블은URL
속성을 가집니다. 이는 각 하위 모델이 독립적인 테이블과 속성을 가지도록 합니다. -
모델 설정:
Post
모델에는delegated_type :postable, types: %w[Article Video]
가 정의되어Post
가Article
또는Video
타입으로 위임될 수 있음을 명시합니다.Article
및Video
모델은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 개발의 생산성과 애플리케이션의 성능을 동시에 향상시키는 중요한 기능으로 평가됩니다.