소프트웨어 개발에서 디자인 패턴은 문제를 해결하기 위한 반복 가능한 접근 방식을 제공합니다. 다양한 디자인 패턴 중에서 옵저버 패턴은 객체 간의 관계를 정의하는 데 유용합니다. 이 패턴은 한 객체의 상태 변화가 다른 객체에 자동으로 통지되도록 합니다. 이번 글에서는 루비에서 옵저버 패턴을 어떻게 구현할 수 있는지 알아보겠습니다.
옵저버 패턴은 주로 이벤트 기반 시스템에서 사용됩니다. 이 패턴에서는 한 객체(주체)가 상태를 변경할 때, 그 상태에 의존하는 다른 객체들(옵저버)에게 자동으로 통지합니다. 이를 통해 주체와 옵저버 간의 느슨한 결합을 유지할 수 있습니다.
옵저버 패턴은 다음과 같은 주요 구성 요소로 이루어져 있습니다:
이제 루비를 사용하여 옵저버 패턴을 구현해 보겠습니다. 예를 들어, 간단한 뉴스 기사를 주제로 주체와 옵저버를 설정해 보겠습니다.
주체 클래스는 옵저버를 등록하고, 상태를 변경하며, 옵저버에게 상태 변화를 통지하는 역할을 합니다. 아래는 주체 클래스를 정의한 예입니다:
class News def initialize @observers = [] @title = "" end def attach(observer) @observers << observer end def detach(observer) @observers.delete(observer) end def notify @observers.each { |observer| observer.update(self) } end def title=(new_title) @title = new_title notify end def title @title end end
위의 코드에서 `News` 클래스는 옵저버를 관리하는 메서드(`attach`, `detach`, `notify`)를 포함하고 있습니다. `title=` 메서드를 통해 제목이 변경될 때마다 모든 옵저버에게 통지합니다.
이제 옵저버 클래스를 정의해 보겠습니다. 옵저버는 주체의 상태 변화에 반응하여 업데이트를 수행합니다.
class NewsSubscriber def initialize(name) @name = name end def update(news) puts "#{@name} received an update: #{news.title}" end end
위의 `NewsSubscriber` 클래스는 주체의 상태가 변경되었을 때 호출되는 `update` 메서드를 포함하고 있습니다. 이 메서드는 주체의 제목을 출력합니다.
이제 주체와 옵저버를 연결하고, 상태 변화가 발생했을 때 옵저버가 어떻게 반응하는지 확인해 보겠습니다.
# 주체 인스턴스 생성 news = News.new # 옵저버 인스턴스 생성 subscriber1 = NewsSubscriber.new("Alice") subscriber2 = NewsSubscriber.new("Bob") # 옵저버 등록 news.attach(subscriber1) news.attach(subscriber2) # 제목 변경 news.title = "New Ruby Features Released"
위의 코드에서 `news` 객체에 두 명의 옵저버(`subscriber1`, `subscriber2`)를 등록한 후, 제목을 변경하면 두 옵저버가 업데이트를 받게 됩니다.
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:
Alice received an update: New Ruby Features Released Bob received an update: New Ruby Features Released
제목이 변경되자 등록된 모든 옵저버가 업데이트를 받는 것을 확인할 수 있습니다.
옵저버 패턴은 여러 가지 장점을 제공합니다:
하지만 옵저버 패턴에도 몇 가지 단점이 있습니다:
옵저버 패턴은 다양한 분야에서 활용될 수 있습니다. 예를 들어:
이번 글에서는 루비에서 옵저버 패턴을 구현하는 방법에 대해 알아보았습니다. 옵저버 패턴은 객체 간의 관계를 효과적으로 관리할 수 있는 유용한 도구입니다. 주체와 옵저버 간의 느슨한 결합을 통해 코드의 유연성과 재사용성을 높일 수 있습니다. 실제 프로젝트에서 이 패턴을 활용해 보시기 바랍니다.
```© 2024 RailsInsights. All rights reserved.