이벤트 기반 아키텍처

이벤트 기반 아키텍처(event-driven architecture, EDA)는 이벤트의 제작, 감지, 소비, 반응을 제고하는 소프트웨어 아키텍처 패턴이다.

이벤트는 "상태의 상당한 변화"로 정의할 수 있다.[1] 예를 들어, 소비자가 자동차를 구매할 때 자동차의 상태는 "판매 중"에서 "판매 완료"로 바뀐다.

구현 및 예시 편집

자바 스윙 편집

public class FooPanel extends JPanel implements ActionListener {
    public FooPanel() {
        super();

        JButton btn = new JButton("Click Me!");
        btn.addActionListener(this);

        this.add(btn);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Button has been clicked!");
    }
}

다른 방법으로는 다음과 같다.

public class FooPanel extends JPanel {
    public FooPanel() {
        super();

        JButton btn = new JButton("Click Me!");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Button has been clicked!");
            }
        });
        this.add(btn);
    }
}

자바스크립트 편집

(() => {
  'use strict';

  class EventEmitter {
    constructor() {
      this.events = new Map();
    }

    on(event, listener) {
      if (typeof listener !== 'function') {
        throw new TypeError('The listener must be a function');
      }
      let listeners = this.events.get(event);
      if (!listeners) {
        listeners = new Set();
        this.events.set(event, listeners);
      }
      listeners.add(listener);
      return this;
    }

    off(event, listener) {
      if (!arguments.length) {
        this.events.clear();
      } else if (arguments.length === 1) {
        this.events.delete(event);
      } else {
        const listeners = this.events.get(event);
        if (listeners) {
          listeners.delete(listener);
        }
      }
      return this;
    }

    emit(event, ...args) {
      const listeners = this.events.get(event);
      if (listeners) {
        for (let listener of listeners) {
          listener.apply(this, args);
        }
      }
      return this;
    }
  }

  this.EventEmitter = EventEmitter;
})();

사용법:

const events = new EventEmitter();
events.on('foo', () => { console.log('foo'); });
events.emit('foo'); // "foo" 출력
events.off('foo');
events.emit('foo'); // 아무것도 발생하지 않음

각주 편집

  1. K. Mani Chandy Event-Driven Applications: Costs, Benefits and Design Approaches, California Institute of Technology, 2006