Rails 개발자를 위한 JavaScript 개발자의 가이드: 상속보다 컴포지션이 의미하는 것

A JavaScript developer's guide to Rails: What does Composition Over Inheritance mean?

작성자
발행일
2026년 01월 29일

핵심 요약

  • 1 Rails 프레임워크는 상속을 많이 사용하지만, 애플리케이션 코드에서는 의존성을 명확히 하고 테스트를 용이하게 하는 컴포지션을 선호해야 합니다.
  • 2 컴포지션은 의존성을 생성자나 메서드 인자를 통해 명시적으로 주입하여 코드 가독성과 격리된 테스트를 크게 향상시킵니다.
  • 3 JavaScript 개발자에게 익숙한 컴포지션 패턴(예: React props)은 Rails 애플리케이션의 비즈니스 로직 개발에 적용하여 효율성을 높일 수 있습니다.

도입

Rails는 메서드를 애플리케이션 전체에 걸쳐 사용 가능하게 하기 위해 상속과 믹스인을 광범위하게 활용합니다. 이는 명시적인 임포트에 익숙한 JavaScript 개발자들에게 혼란을 줄 수 있습니다. thoughtbot은 Rails 프레임워크 코드가 상속을 많이 사용하더라도, 애플리케이션 코드에서는 컴포지션을 선호하여 코드를 테스트하기 쉽게 만들고 의존성을 명확하게 드러낼 것을 권장합니다. 이 글은 모던 JavaScript 개발자들이 Rails에서 코드를 작성할 때 상속과 컴포지션을 어떻게 이해하고 적용해야 하는지에 대한 가이드를 제공합니다.

Rails는 메서드 제공에 상속과 믹스인을 활용하지만, thoughtbot은 애플리케이션 코드에서 컴포지션을 선호하여 의존성을 명확히 하고 테스트를 용이하게 할 것을 권장합니다.

상속(Implicit Dependencies)의 한계

상속은 메서드 출처를 불분명하게 만들고 의존성을 숨깁니다. WelcomeNotifier < BaseNotifier와 같은 구조에서 메서드 출처를 파악하려면 상위 클래스를 추적해야 합니다. 이는 테스트 시 상속 체인 전체를 고려해야 하므로 복잡한 설정이 필요하며, 테스트 더블 주입이 어려워 테스트 속도가 느려집니다. 또한, 구현 변경 시 상속 구조를 수정해야 하는 유연성 부족을 초래합니다.

컴포지션(Explicit Dependencies)의 장점

컴포지션은 생성자를 통해 의존성을 명시적으로 주입받는 방식입니다(initialize(mailer:, logger:)).

  • 명확한 의존성: 필요한 의존성을 한눈에 파악할 수 있습니다(React props와 유사).

  • 쉬운 테스트: 실제 객체 대신 테스트 더블을 주입하여, 데이터베이스나 외부 서비스 없이 빠르고 격리된 테스트가 가능합니다.

  • 높은 유연성: 구현 교체 시 상속 계층 변경 없이 주입 객체만 변경하면 됩니다.

  • 코드 이해도 향상: 메서드 출처가 클래스 내부 또는 주입된 의존성 객체로 명확합니다.

Rails 프레임워크와 애플리케이션 코드

Rails 프레임워크(ApplicationController, ApplicationRecord 등)는 상속을 적극 활용하므로, 이 부분에서는 프레임워크 컨벤션을 따릅니다. 그러나 비즈니스 로직을 구현하는 애플리케이션 코드에서는 컴포지션을 선호해야 합니다. 이는 JavaScript 개발자에게 익숙한 패턴이며, Rails 애플리케이션 코드의 가독성, 테스트 용이성 및 유지보수성을 크게 향상시킵니다.

결론

Rails 개발 환경에서 JavaScript 개발자들은 프레임워크의 상속 중심 접근 방식에 적응해야 하지만, 자신만의 애플리케이션 코드를 작성할 때는 컴포지션을 적극 활용하는 것이 중요합니다. 컴포지션은 의존성을 명시적으로 드러내어 테스트를 훨씬 쉽게 만들고, 코드의 가독성을 높이며, 유지보수를 용이하게 합니다. `initialize` 메서드를 통해 의존성을 주입하고, 키워드 인자를 사용하여 명확성을 확보하며, 작은 클래스를 유지하는 것이 핵심입니다. 이는 JavaScript 개발자들이 이미 익숙한 패턴이므로, Rails에서도 이러한 원칙을 적용하여 더욱 명확하고 견고한 애플리케이션을 구축할 수 있습니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!