Rails는 메서드 제공에 상속과 믹스인을 활용하지만, thoughtbot은 애플리케이션 코드에서 컴포지션을 선호하여 의존성을 명확히 하고 테스트를 용이하게 할 것을 권장합니다.
상속(Implicit Dependencies)의 한계
상속은 메서드 출처를 불분명하게 만들고 의존성을 숨깁니다. WelcomeNotifier < BaseNotifier와 같은 구조에서 메서드 출처를 파악하려면 상위 클래스를 추적해야 합니다. 이는 테스트 시 상속 체인 전체를 고려해야 하므로 복잡한 설정이 필요하며, 테스트 더블 주입이 어려워 테스트 속도가 느려집니다. 또한, 구현 변경 시 상속 구조를 수정해야 하는 유연성 부족을 초래합니다.
컴포지션(Explicit Dependencies)의 장점
컴포지션은 생성자를 통해 의존성을 명시적으로 주입받는 방식입니다(initialize(mailer:, logger:)).
-
명확한 의존성: 필요한 의존성을 한눈에 파악할 수 있습니다(React
props와 유사). -
쉬운 테스트: 실제 객체 대신 테스트 더블을 주입하여, 데이터베이스나 외부 서비스 없이 빠르고 격리된 테스트가 가능합니다.
-
높은 유연성: 구현 교체 시 상속 계층 변경 없이 주입 객체만 변경하면 됩니다.
-
코드 이해도 향상: 메서드 출처가 클래스 내부 또는 주입된 의존성 객체로 명확합니다.
Rails 프레임워크와 애플리케이션 코드
Rails 프레임워크(ApplicationController, ApplicationRecord 등)는 상속을 적극 활용하므로, 이 부분에서는 프레임워크 컨벤션을 따릅니다. 그러나 비즈니스 로직을 구현하는 애플리케이션 코드에서는 컴포지션을 선호해야 합니다. 이는 JavaScript 개발자에게 익숙한 패턴이며, Rails 애플리케이션 코드의 가독성, 테스트 용이성 및 유지보수성을 크게 향상시킵니다.