저자는 Teacher
모델의 available_places
에 따라 배경색을 지정하는 colour_coded_availability
메서드를 예시로 들며, 이 뷰 로직을 데코레이터에서 처리해야 한다고 제안합니다. 초기 TeacherDecorator
는 Teacher
인스턴스를 감싸지만, 뷰에서 모델의 다른 메서드를 호출할 때 NoMethodError
가 발생합니다.
이 문제를 해결하기 위해 Ruby의 method_missing
과 respond_to_missing?
을 활용합니다. method_missing
을 재정의하여 데코레이터에 정의되지 않은 메서드 호출을 내부 teacher
객체로 public_send
를 통해 전달함으로써, 데코레이터가 자신의 메서드와 기본 모델의 공용 메서드를 모두 처리할 수 있게 합니다.
나아가, 이러한 공통 위임 로직을 재사용하기 위해 ApplicationDecorator
라는 상위 클래스를 도입합니다. ApplicationDecorator
는 객체 초기화 및 method_missing
을 통한 메서드 위임 로직을 캡슐화하며, TeacherDecorator
는 이를 상속받아 뷰에 특화된 로직만을 구현합니다. alias_method
를 사용하여 내부 객체를 teacher
로 참조할 수 있게 하여 가독성을 높입니다.
또한, edit_teacher_path(@teacher)
와 같은 Rails 헬퍼가 데코레이터 인스턴스를 올바르게 처리하지 못하는 문제를 다룹니다. to_param
메서드를 기본 모델로 위임하여 해결할 수 있지만, 모든 Rails 기본 동작을 수동으로 위임하는 것은 복잡성을 증가시킨다고 지적합니다.
최종적으로 저자는 Ruby 표준 라이브러리의 SimpleDelegator
를 활용하는 가장 간결하고 효율적인 방법을 제안합니다. SimpleDelegator
는 생성자에 전달된 객체의 모든 공용 메서드 호출을 자동으로 위임하므로, ApplicationDecorator
는 복잡한 초기화 및 method_missing
로직 없이 단순히 SimpleDelegator
를 상속받는 것만으로 충분해집니다. 이로써 데코레이터 구현이 극적으로 간결해지며, __getobj__
메서드를 통해 내부 객체에 접근할 수 있습니다.