이벤트 기반 아키텍처

이벤트 기반 아키텍처(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'); // 아무것도 발생하지 않음

같이 보기

각주