본문 바로가기
디비연동 MySQL &그누보드 & Node.js

이벤트 기반 & 논 블로킹 I/O - 자바스크립트는 이벤트 기반이구나!

by db_dpipe 2020. 9. 13.
728x90
반응형

이벤트 기반

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 말한다고 합니다.

제가 여지껏 사용해왔던 자바스크립트가 대표적일듯 합니다. 

 

이벤트 기반 프로그래밍은 특정 이벤트가 발생할 때 미리 등록해둔 어떤 일을 하도록 해줍니다. 

자바스크립에서 이벤트 리스너에 콜백함수를 등록하는 것이 바로 이벤트 기반이라고 볼 수 있습니다.

 

위키백과에서 이벤트를 찾아보면 다음과 같이 이야기 하고 있습니다. 

https://ko.wikipedia.org/wiki/이벤트_(컴퓨팅

 

노드도 이벤트 기반 방식으로 동작한다고 합니다. 즉, 노드도 이벤트 리스너에 콜백함수를 등록해두고 사용하는 것입니다. 노드는 자바스크립트의 코드를 맨 위부터 한 줄씩 실행합니다. 

 

새로운 공부는 용어와 개념의 정립이 중요합니다.

용어가 눈에 익고, 이해되고, 개념이 잡히면 다 된것이라고 볼 수 있습니다.


* 이벤트 루프

프로그램은 이벤트를 처리하기 위한 하나 이상의 전용 공간(헨들러)을 가지게 되는데 이를 이벤트 루프라 불리는 곳에서 처리한다고 합니다. 이벤트 루프는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할지 판단합니다. 

이벤트 루프는 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다고 합니다.


* 호출 스택

호출 스택, 즐 콜 스택은 위키백과에서는 현재 실생중인 서브루틴에 관한 정보를 저장하는 스택 자료 구조라고 설명합니다. 음.. 자바스크립 상황에서 쉽게 이야기하면 함수의 호출을 기록하는 자료구조라고 보면 됩니다.

(자료 구조란 자료의 집합의 의미이며, 각 원소들이 논리적으로 정의된 규칙에 의해 나열되며, 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 구분하여 표현한 것)

 

https://ko.wikipedia.org/wiki/콜_스택


* 백그라운드

자바스크립트에서 setTimeout( ) 함수를 사용해보았을 것입니다. 백그라운드란 setTimeout() 같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 


* 태스크 큐:  큐 사인을 보내는 것과 비슷하다고 보면 됩니다. 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백함수를 보내게 됩니다. 불린 순서대로 줄을 서고 있다고 보시면 됩니다. 

 

저는 지금까지  setTimeout( ) 함수를 사용하면 정해진 초수에 정확하게 실행된다고 생각했습니다. 하지만 책을 통해 공부해보니...  정확하지 않을수도 있다고 하네요. 즉, 호출 스택에 함수들이 너무 많으면 태스크 큐에 있는 함수를 바로 못가져오는 상황이 발생해서  setTimeout( ) 의 시간이 정확하지 않을수도 있다고 합니다..

아아.. 그렇구나^^

 


 

논 블로킹 I/O

 

I/O는 입력(Input)과 출력(Output)을 말합니다.

우리가 흔히 하는 파일 읽기, 쓰기, 등등의 작업입니다. 이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리한다고 합니다. 논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 말합니다. 블로킹은 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미하지요.

이 개념을 알면 논 블로킹 방식으로 코딩해야 작업 처리시간이 짧아진다는 것을 알 수 있습니다. 

 

노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리합니다. 동시에 처리할 수있는 작업들은 백그라운드로 넘겨주면 그만큼 시간을 절약할 수 있다는 의미입니다. 

자바스크립트도 그렇지만 작업 순서에 따라 성능, 시간이 크게 달라집니다. 

동시에 처리될 수 있는 작업이라도 블로킹 방식으로 코딩하면 처리 시간이 느려지겠지요.

논 블로킹 방식으로 코딩하는 습관이 중요합니다. 

그럼 어떻게 하는 것이 논 블로킹 방식일까요?

 

setTimeout( 콜백, 0)  과 같은 방식을 예를 들 수 있습니다.

 

 

논 블로킹을 통해 실행 순서를 바꿔줌으로써 간단한 작업들이 대기하는 상황을 막아주는 것이 중요합니다. 

노드에서는 동기와 블로킹이 유사하고, 비동기와 논 블로킹이 유사하다고 하네요.

앞으로 알아가야겠지요~

 


늘 그렇듯 새로운 개념, 용어는 익숙치 않고, 공부는 꾸준한 인내력을 요하네요.

요거 조금하고도 발버둥이 치니 말입니다. 

일하러 가면서 약간의 위로를 합니다. 

그래.. 그래도 공부했어 ㅎㅎㅎ

 

책 34페이지까지 정독하며, 구글링하며, 정리하며 보았습니다.

뒤에 색인빼고 748페이분량이니까 4.5% 책을 본것입니다. 

100일 일정이니 이 속도로 보면 100일동안 시나브로 책 한권을 다 볼듯 하네요.

보통 책가지고 공부하다보면.. 지루하고, 막히고.. 앞에 보다 말기를 여러번 하더라구요.

하지만 이렇게 100일 계획을 하고, 약간의 강제성이 생기면 꾸준하게 보게 되더군요.^^

기대합니다. 100일후에 Node.js를 활용할수 있는 나를^^

728x90
반응형