메모리 낭비를 방지
가능하다데이터 공유가 쉽다
동시성 문제
가 발생할 수 있다 (synchronized
필요)테스트
가 격리된 상황에서 수행되기 위해서는 매번 인스턴스의 상태를 초기화해주어야 한다의존
하게 된다Subject
→ Observer
에게 데이터를 전송Observer
가 이벤트를 실행하는 주체 Subject
에 등록1:N
의 관계로 강한 관계Subscriber
)와 이벤트 발생 객체(Publisher
), 그 사이에 Event Channel
존재캡슐화
, 느슨한 결합
이 가능!Publisher
는 Subscriber
를 모른 채로 이벤트 발생 시 Event Channel
에게 메시지를 넘겨주고(push
) Event Channel
은 이벤트들을 필터링해 받아야할 Subscriber
들에게 전송Subscriber
는 Publisher
에 대한 정보 없이 자신에게 맞는 메시지만을 전송받음Publisher
관점에서 Subscriber
를 관리할 필요가 없다Publisher-Subscriber
패턴에서 브로커
역할을 수행emitter.on("name", (val) => {})
(= addListener
) : 이벤트가 동작될때 호출되는 리스너 정의emitter.once("name", () => {})
: 콜백이 한 번만 실행되도록 정의emitter.emit("name", val)
: 이벤트 동작emitter.off(”name”, (val) ⇒ {})
(= removeListner) : 이벤트를 삭제Observer
패턴은 Observer
와 Subject
간에 서로를 알고 있으나 Publisher-Subscriber
는 서로를 몰라도 된다Observer
패턴은 주로 동기적으로 작동하며 Publisher-Subscriber
패턴은 비동기적으로 작동한다Node.js
는 싱글 스레드 논 블로킹
I/O작업
이 발생한 경우 비동기적으로 처리 가능Worker Thread
모듈로 여러 스레드 생성 가능V8 Engine
: 브라우저에서 실행하던 자바스크립트를 로컬에서 실행 가능libuv
: C++로 작성된 비동기 I/O라이브러리
libuv
에 요청하면 내부의 스레드풀에게 이 작업을 요청Node.js
는 I/O 작업을 libuv
에게 위임함으로써 논 블로킹 I/O를 지원하고 그 기반에는 이벤트 루프가 있다.이벤트 루프
Node.js
가 여러 비동기 작업을 관리하기 위한 구현체참고자료
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://devmoony.tistory.com/43
https://velog.io/@minsuk/Publish-Subscribe-패턴알림
https://handhand.tistory.com/271
https://gobae.tistory.com/122
https://dongwooklee96.github.io/post/2021/03/29/메시지-큐를-이용한-비동기처리-및-에러-처리.html
https://www.korecmblog.com/node-js-event-loop/
https://sjh836.tistory.com/149
https://velog.io/@teo/reactive-programming#3-반응형-프로그래밍-deep-dive