본문 바로가기

프로그래밍&IT/기타

(1) Event 발행 (Publisher), 구독(Subscriber) 패턴에 대해서

현재 내가 만들고있는 프로그램과 관련되어,

이벤트 구독 & 발행 (Event Publisher / Subscriber)에 대해 알아본다.

 

목차

  • 이벤트 발행 & 구독 패턴의 목적
  • 이벤트 발행 및 구독 구조
  • 실제 사용 사례
  • 이벤트 패턴의 장단점

 

이벤트 발행 & 구독 (Event Publisher & Subscriber) 패턴의 목적

1. 느슨한 결합

  • 발행자(Publisher)와 구독자(Subscriber)는 서로 직접적으로 연결되지 않습니다.
  • 발행자는 구독자가 누군지 알 필요가 없고, 구독자는 발행자의 내부 구현에 대해 알 필요가 없습니다.
  • 이는 시스템을 보다 모듈화하고 유지보수를 쉽게 해줍니다.
  • 이를 통해 한 객체가 변경되더라도 다른 객체에 미치는 영향을 최소화할 수 있습니다.

2. 확장성

  • 여러 구독자가 동일한 이벤트를 구독할 수 있고, 구독자가 추가되거나 제거되더라도 발행자의 동작에 변화가 없습니다.
  • 즉, 구독자 추가, 제거가 유연하며 시스템 확장에 용이합니다.

3. 비동기성

  • 이벤트는 비동기적으로 처리될 수 있어 성능을 향상시킬 수 있습니다
  • 이벤트가 발생할 때 발행자는 즉시 구독자에게 전달하지 않고, 구독자는 필요한 시점에 이벤트를 처리할 수 있습니다.

4. 리액티브 시스템 설계

  • 이 패턴은 시스템이 이벤트 기반으로 동작하도록 설계할 때 유용합니다.
  • 특정 동작에 대한 결과를 이벤트로 정의하고, 해당 결과를 처리할 여러 컴포넌트가 독립적으로 반응할 수 있습니다.

 

이벤트 발행 및 구독 구조

이벤트 발행 및 구독 패턴은 기본적으로 발행자(Publisher)와 구독자(Subscriber)로 이루어집니다.

발행자는 이벤트가 발생했을 때 해당 이벤트를 외부로 알리고, 구독자는 그 이벤트를 처리합니다.

1. 발행자 (Publisher)

발행자는 이벤트를 정의하고, 이벤트가 발생할 때 이를 외부에 발행하는 역할을 합니다.

  • 발행자는 구독자가 누군지 알 필요가 없습니다.
  • 발행자는 이벤트를 정의하고, 이를 트리거하는 메서드를 제공합니다.
  • 발행자는 이벤트가 발생했을 때 구독자에게 알리는 역할을 합니다.

2. 구독자 (Subscriber)

구독자는 발행자가 발행한 이벤트에 구독하고, 이벤트가 발생했을 때 특정 작업을 수행하는 역할을 합니다.

  • 구독자는 이벤트를 구독하고, 구독한 이벤트가 발생할 때 이벤트 핸들러를 통해 응답합니다.
  • 여러 구독자가 동일한 이벤트를 구독할 수 있습니다.
  • 구독자는 필요에 따라 언제든지 구독을 해지할 수 있습니다.

3. 이벤트 및 대리자 (Event and Delegate)

이벤트 발행 및 구독은 대리자(delegate)와 이벤트(event)의 개념을 사용하여 구현됩니다.

  • Delegate(대리자): 이벤트 핸들러 메서드를 정의하는 역할을 합니다. 구독자가 이 대리자를 통해 이벤트를 처리할 메서드를 연결합니다.
  • Event(이벤트): 대리자를 통해 구독자에게 이벤트를 발생시키는 역할을 합니다. 구독자는 이벤트를 구독할 때 이벤트에 연결된 대리자를 통해 해당 이벤트에 응답하게 됩니다.

 

실제 사용 사례

1. UI 프레임워크

윈도우 폼, WPF와 같은 UI 프레임워크에서 버튼을 클릭했을 때 발생하는 클릭 이벤트를 처리하는 것이 대표적인 예입니다.

사용자(구독자)는 버튼(발행자)의 클릭 이벤트를 구독하고, 버튼이 클릭될 때 특정 동작을 수행합니다.

button.Click += OnButtonClick;

void OnButtonClick(object sender, EventArgs e)
{
    // 버튼이 클릭되었을 때 수행할 동작
}

2. 게임 개발

게임에서 플레이어가 특정 행동을 했을 때 적 또는 환경이 반응하는 시스템을 만들 때도 이벤트 패턴이 유용합니다. 예를 들어, 플레이어가 문을 열었을 때 적들이 이를 인식하고 공격 행동을 시작할 수 있습니다.

3. 시스템 모니터링

서버 모니터링 시스템에서는 특정 조건(예: CPU 사용량 초과, 메모리 부족)이 발생할 때 알림을 보내거나 로그를 기록하는 등의 작업을 이벤트 기반으로 처리합니다.

이벤트 발행 & 구독 패턴의 장단점

장점

  • 모듈화: 발행자와 구독자가 독립적이므로 유지보수와 코드 재사용성이 높아집니다.
  • 확장성: 여러 구독자를 쉽게 추가하거나 제거할 수 있습니다.
  • 비동기적 처리 가능: 이벤트가 발생한 뒤 즉시 구독자에게 전달되지 않고, 비동기적으로 처리할 수 있어 성능이 향상될 수 있습니다.

단점

  • 디버깅의 어려움: 발행자와 구독자가 느슨하게 결합되어 있어 디버깅이 어려울 수 있습니다. 어떤 이벤트가 발행되었고, 구독자가 어떤 동작을 수행하는지 추적하는 것이 복잡해질 수 있습니다.
  • 메모리 누수: 이벤트를 구독한 객체가 이벤트에서 구독을 해제하지 않으면, 발행자에 의해 계속 참조되어 메모리 누수가 발생할 수 있습니다. 이를 방지하기 위해 구독 해제가 필요합니다.

 

다음 차례엔, 실제 이벤트 발행 & 구독을 간단한 C# 소스로 만들어본다