본문 바로가기
Nodejs

[Nodejs] Event-driven (이벤트기반)

by hotdog7778 2023. 9. 30.

 

Nodejs

1. 이벤트기반 아키텍처를 사용

2. 싱글 스레드 기반

3. 논블로킹 I/O

 

이벤트 기반 아키텍처는 논블로킹과 비동기 처리의 이점을 최대한 활용하고 효율적으로 구현하기 위한 방식 중 하나

 

노드가 이벤트 기반 아키텍처를 사용하는 이유는 자바스크립트가 이벤트 기반 언어이기 때문만은 아님. 주된 이유는 주로 성능, 비동기+논블로킹 처리, 자바스크립트 표준 및 확장성을 개선하기 위함

 

싱글 스레드 모델이라 간단, 경량화, 스레드 간의 동기화 문제를 처리하는 복잡성을 줄임.

싱글 스레드 모델이지만 비동기/논블로킹 방식 + 이벤트 기반의 처리를 통해 많은 요청을 효율적으로 처리할 수 있도록 설계됨.

 

이벤트 기반 아키텍처에서 여러 요청(이벤트)를 처리하기 위해 효율적인 논블로킹 방식을 사용.

이벤트 기반 아키텍처에서 성능 향상과 간결한 아키텍처를 위해 싱글 스레드 방식을 사용. (많은 동시 요청을 처리하고 논블로킹 작업을 쉽게 관리)

 

그러나 모든 작업이 비동기적으로 처리되지는 않으며, CPU 작업(계산 집약적 작업)은 단일스레드에서 실행되기 때문에 일반적으로 동기적(순차적)으로 처리됨.

 

 

1. 이벤트 기반(event-driven)

특정 이벤트 발생(클릭 등)시 수행될 함수(콜백)를 미리 지정해두고 수행하는 방식

 

키워드 (이벤트 루프, 백그라운드, 태스크 큐)

 

1-1. 이벤트 루프 :

출처. Nodejs 교과서

자바스크립트 함수가 스택에 쌓이고 실행되는 동작 이미지 

 

스택에 함수들은 동시에 실행 될 수 없고 결국, 이벤트 기반 모델에서 여러 이벤트가 동시에

발생했을 때 실행될 함수(콜백)들이 스택에서 어떤 순서로 실행될지 판단 되어야 한다.

이때 실행 되어야할 순서를 결정하고 스택에서 처리될 수 있게 하는게 이벤트 루프의 역할이다.

 

 

출처. Nodejs 교과서

타이머 함수를 사용해 비동기 작업을 진행할때 이벤트 루프, 백그라운드, 태스크 큐의 동작을 이해하기 위한 이미지

타이머 함수 실행 -> 백그라운드로 타이머 + 콜백함수 전달

-> 타이머 함수 호출스택에서 빠짐 ->  백그라운드에서 타이머 수행

-> 콜백함수를 태스크 큐로 전달 -> 이벤트 루프는 호출 스택이 비어 있으면 태스크 큐에서 하나씩 콜백을 가져와 호출 스택으로 전달

-> 호출 스택에서 콜백함수 수행 

 

 

1-2. 백그라운드 : 

 - 메인 스레드에서의 코드 실행을 차단하지 않기위해 비동기 작업(예: 타이머 함수, AJAX 요청, 이벤트 핸들러 등)을 병렬로 처리하는 공간

 - Node.js의 이벤트 루프와 백그라운드는 주로 C++ 코드로 작성된 libuv 라이브러리를 통해 구현됨

 - 결론, 비동기 작업이 처리되는 곳

 

 

1-3. 태스크 큐 & 이벤트 큐: 

호출 스택으로 넘어가기전 콜백함수가 대기하는 공간 (비동기 작업을 스케줄링을 위해)

 

위 그림은 비동기처리 예로 타이머 함수를 사용해서 태스크 큐가 사용된것.

 - 태스크 큐는 주로 타이머 함수 및 Promise와 관련이 있다.

 - 이벤트 큐는 주로 이벤트 핸들러와 관련이 있다.

 - 둘다 역할을 똑같음