Ruby에서 Observer 패턴 마스터하기

Mastering the Observer Pattern in Ruby | by Prateek vyas | Medium

작성자
jeff
발행일
2025년 03월 20일

핵심 요약

  • 1 옵저버 패턴은 객체 간의 느슨한 결합을 통해 한 객체의 상태 변화를 여러 종속 객체에 자동으로 알리는 행동 디자인 패턴입니다.
  • 2 Ruby에서 `Employee` 클래스를 Subject로, `Payroll` 및 `HR`을 Observer로 구현하여, 주체 객체가 특정 알림 수신자에 의존하지 않고 변경 사항을 브로드캐스트하는 방식을 설명합니다.
  • 3 Rails의 Active Record 콜백은 옵저버 패턴의 실용적인 예시로, `before_save` 및 `after_save`와 같은 메커니즘을 통해 유연하고 확장 가능한 이벤트 기반 시스템을 구축할 수 있습니다.

도입

본 글은 Ruby에서 옵저버 패턴(Observer Pattern)의 중요성과 구현 방법을 다룹니다. 먼저 옵저버 패턴이 없을 때 발생할 수 있는 문제점을 `Employee` 클래스의 급여 변경 알림 사례를 통해 설명합니다. 초기 설계에서는 `Employee`가 `Payroll` 부서에 직접 의존하여 급여 변경 시 수동으로 알리는 방식이 사용되는데, 이는 새로운 부서(예: 회계, 세금, HR)가 추가될 때마다 `Employee` 클래스를 수정해야 하는 강한 결합 문제를 야기합니다. 이러한 비효율적이고 유지보수가 어려운 설계를 해결하기 위해 옵저버 패턴의 필요성을 제기합니다.

옵저버 패턴은 객체 간의 일대다(one-to-many) 의존성을 정의하는 행동 디자인 패턴입니다. 주체(Subject) 객체의 상태가 변경되면, 이에 종속된 모든 관찰자(Observer) 객체에게 자동으로 알림이 전송됩니다. 이는 주체 객체가 특정 관찰자에 대한 지식 없이 변경 사항을 브로드캐스트할 수 있도록 하여 느슨한 결합을 달성합니다.

Ruby에서의 옵저버 패턴 구현

  1. 주체(Subject) 구현: Employee 클래스는 변경 사항을 관찰할 observers 목록을 유지합니다.
    • add_observer(observer): 관찰자를 목록에 추가합니다.
    • notify_observers: 모든 등록된 관찰자의 update 메서드를 호출하여 변경 사항을 알립니다.
    • salary= 메서드에서 급여 변경 후 notify_observers를 호출합니다.
  2. 관찰자(Observer) 구현: PayrollHR 클래스는 주체로부터 알림을 받을 update(employee) 메서드를 정의합니다.
    • Payroll#update: 급여 변경 시 새로운 급여명세서 발행을 알립니다.
    • HR#update: 인사 기록 업데이트를 알립니다.
  3. 연결: Employee 인스턴스에 PayrollHR 인스턴스를 옵저버로 등록하면, Employee의 급여가 변경될 때 두 부서 모두 자동으로 알림을 받게 됩니다.

Rails 콜백과 옵저버 패턴

Rails의 Active Record 콜백(before_save, after_save 등)은 옵저버 패턴과 유사하게 작동합니다. 이는 객체의 특정 라이프사이클 이벤트 발생 시 미리 정의된 동작을 실행합니다. 본문에서는 이를 모방하여 Ruby에서 커스텀 콜백 시스템을 구현하는 방법을 제시합니다.

  • CallbackHandler: 콜백 유형(:before_save, :after_save)별로 메서드 이름을 등록하고 관리합니다.
  • Callbacks 모듈: 클래스 메서드 before_save, after_save를 통해 콜백을 등록하고, 인스턴스 메서드 save에서 등록된 콜백을 실행합니다.
  • 이러한 커스텀 구현은 Post 클래스에서 sanitize_contentbefore_save로, notify_followersafter_save로 등록하여 객체 저장 전후에 특정 로직이 자동으로 실행되도록 합니다.

결론

옵저버 패턴은 유연하고 확장 가능한 이벤트 기반 시스템을 구축하는 데 매우 효과적인 디자인 패턴입니다. 이 패턴을 통해 객체 간의 강한 결합을 피하고, 주체 객체가 자신의 상태 변화에만 집중하며, 관심 있는 모든 관찰자에게 변경 사항을 효율적으로 브로드캐스트할 수 있습니다. 핵심적으로, 옵저버 패턴은 동적으로 이벤트에 구독하는 객체 시스템을 가능하게 하며, Rails의 콜백 메커니즘은 이러한 패턴의 강력한 실제 적용 사례입니다. Ruby는 표준 라이브러리에 `Observable` 모듈을 제공하여 옵저버 패턴을 더욱 쉽게 구현할 수 있도록 지원하며, 이를 통해 개발자는 더 깔끔하고 느슨하게 결합된 애플리케이션을 설계할 수 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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