Rails Insights

루비에서 옵저버 패턴 구현하기

소프트웨어 개발에서 디자인 패턴은 코드의 재사용성과 유지보수성을 높이는 데 큰 도움이 됩니다. 그 중에서도 옵저버 패턴은 객체 간의 일대다 관계를 정의하여 한 객체의 상태 변화가 다른 객체에 자동으로 통지되도록 하는 패턴입니다. 이 글에서는 루비에서 옵저버 패턴을 어떻게 구현할 수 있는지에 대해 알아보겠습니다.

옵저버 패턴이란?

옵저버 패턴은 주로 이벤트 기반 시스템에서 사용됩니다. 이 패턴을 사용하면 한 객체(주체)의 상태가 변경될 때, 그 객체에 의존하는 다른 객체들(옵저버)에게 자동으로 알림을 보낼 수 있습니다. 이를 통해 객체 간의 결합도를 낮추고, 시스템의 유연성을 높일 수 있습니다.

옵저버 패턴의 구성 요소

옵저버 패턴은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  • 주체(Subject): 상태를 가지고 있으며, 옵저버를 관리하는 객체입니다.
  • 옵저버(Observer): 주체의 상태 변화를 감지하고 반응하는 객체입니다.
  • 구독(Subscription): 옵저버가 주체에 등록하여 상태 변화를 통지받는 과정입니다.
  • 알림(Notification): 주체의 상태가 변경될 때 옵저버에게 전달되는 정보입니다.

루비에서 옵저버 패턴 구현하기

이제 루비에서 옵저버 패턴을 구현해보겠습니다. 간단한 예제로 주체가 온도를 나타내고, 옵저버가 온도 변화에 반응하는 시스템을 만들어보겠습니다.

1. 주체 클래스 구현

먼저 주체 클래스를 구현합니다. 이 클래스는 옵저버를 등록하고, 상태가 변경될 때 옵저버에게 알림을 보내는 기능을 포함합니다.

class Temperature
  def initialize
    @observers = []
    @temperature = 0
  end

  def add_observer(observer)
    @observers << observer
  end

  def remove_observer(observer)
    @observers.delete(observer)
  end

  def temperature=(value)
    @temperature = value
    notify_observers
  end

  def notify_observers
    @observers.each { |observer| observer.update(@temperature) }
  end
end

2. 옵저버 클래스 구현

다음으로 옵저버 클래스를 구현합니다. 이 클래스는 주체의 상태 변화에 반응하는 메서드를 포함합니다.

class TemperatureDisplay
  def update(temperature)
    puts "현재 온도: #{temperature}도"
  end
end

3. 옵저버 패턴 사용하기

이제 주체와 옵저버를 연결하여 옵저버 패턴을 사용할 수 있습니다. 아래의 코드를 통해 주체의 온도를 변경할 때마다 옵저버가 알림을 받는 모습을 확인할 수 있습니다.

# 주체와 옵저버 인스턴스 생성
temperature = Temperature.new
display = TemperatureDisplay.new

# 옵저버 등록
temperature.add_observer(display)

# 온도 변경
temperature.temperature = 25
temperature.temperature = 30

위 코드를 실행하면 다음과 같은 출력이 나타납니다:

현재 온도: 25도
현재 온도: 30도

옵저버 패턴의 장점

옵저버 패턴을 사용하면 다음과 같은 장점을 누릴 수 있습니다:

  • 유연성: 주체와 옵저버 간의 결합도가 낮아, 서로 독립적으로 변경할 수 있습니다.
  • 재사용성: 다양한 옵저버를 추가하여 주체의 상태 변화에 반응할 수 있습니다.
  • 확장성: 새로운 옵저버를 쉽게 추가할 수 있어 시스템을 확장하기 용이합니다.

옵저버 패턴의 단점

하지만 옵저버 패턴에도 단점이 존재합니다:

  • 성능 문제: 옵저버가 많아질수록 주체의 상태 변경 시 모든 옵저버에게 알림을 보내는 데 시간이 소요될 수 있습니다.
  • 복잡성 증가: 옵저버와 주체 간의 관계가 복잡해질 수 있어, 시스템의 이해도가 떨어질 수 있습니다.

결론

이번 글에서는 루비에서 옵저버 패턴을 구현하는 방법에 대해 알아보았습니다. 옵저버 패턴은 객체 간의 관계를 유연하게 만들어주며, 다양한 상황에서 유용하게 사용될 수 있습니다. 하지만 성능과 복잡성 문제를 고려하여 적절한 상황에서 사용하는 것이 중요합니다. 여러분의 프로젝트에 옵저버 패턴을 적용해보세요!

Published: August 13, 2024

© 2024 RailsInsights. All rights reserved.