방학 불태우기 10

김민석·2021년 8월 3일
0

방학

목록 보기
10/16

비동기 처리

자바스크립트는 싱글스레드 언어로 현재 진행중인 작업이 끝날 때 까지 다음 작업을 대기해야 하는 상황이 발생할 수 있다.

이런 블로킹 발생으로 인해 시스템 성능이 저하될 수 있기에 자바스크립트는 비동기 처리를 수행할 수 있는 환경을 제공한다.


자바스크립트의 비동기 처리를 위해 자바스크립트 엔진에 추가적인 요소를 구성하는데, 이것을 자바스크립트 런타임 이라고 부른다.

그림과 같이 Web API, Event Loop, message queue로 구성되어 있다.
(call stack은 자바스크립트 엔진의 구성요소로 함수가 실행될 때 마다 함수에 대한 스택 프레임 쌓임)

동작방식은 다음과 같다.
1. 콜스택에 쌓인 작업이 비동기 이면 Web API로 작업을 전달
2. Web API에서 작업을 마친 후 콜백함수를 메세지 큐에 전달
3. 이벤트루프가 콜스택과 메세지큐를 끊임없이 확인하여 콜스택이 비게 되면 메세지큐에서 작업 하나를 콜스택으로 전달하여 나머지 작업 처리

참고 : https://www.luniverse.io/2021/03/24/javascript-async-processing/?lang=ko

Event Emitter

관찰자 패턴이란 상태 변화가 일어날 때 관찰자에게 알릴 수 있는 객체를 정의하는 것을 의미한다.

Node.js에는 관찰자 패턴이 내장되어 있으며 EventEmitter 클래스를 통해 사용이 가능하다.

EventEmitter를 이용하여 특정 이벤트가 발생하면 호출될 하나 이상의 함수를 Listener로 등록할 수 있다.

const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('print',function(){
	console.log('print');
});
emitter.emit('print');

위와 같은 방식으로 활용할 수 있다.

자세히 설명하자면 eventemitter 객체를 생성하여 내부 메소드들을 이용하여 동작하도록 할 수 있다.

위의 코드에서 사용한 on() 메소드는 주어진 이벤트(문자열)에 대해 새로운 listener를 등록하는 메소드이고, emit() 메소드는 새 이벤트를 생성하는 메소드이다.

즉, on() 메소드를 통해 'print'라는 이벤트가 발생하면 등록된 함수가 실행되도록 한 것이며, emit()을 통해 'print'라는 이벤트가 발생했음을 알려준 것이다.

eventemitter를 통해 비동기 프로그램 역시 작성할 수 있다고 하는데, 좀 더 공부가 필요한 부분이다.

참고 : https://vanayun.netlify.app/til/2019-04-10-node_04/
https://edykim.com/ko/post/events-eventemitter-translation-in-node.js/

더 알아보기

  • 디자인 패턴
  • redis
  • 싱글톤
profile
김민석의 학습 정리 블로그

0개의 댓글