ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js - 비동기 중심 모델
    프로그래밍/Node 2021. 6. 26. 15:16
    • 비동기 중심 모델
    • 싱글스레드 기반

    Node를 처음 공부할 때, 맨 처음 들었던 Node의  2가지 속성이다.

    Node를 공부할 때마다 맨날 나오는 용어들이라서, 이제는 이 용어들을 듣는 것이 익숙했지만,

    항상 마음속에는 두 가지의 질문 있었다.

    1. 사용자들의 요청을 처리하는 쓰레드가 많으면 많을 수록 좋은 거 아닌감???? 
       Node는 왜 Single-Thread기반인 거야??? 
    2. 도대체 비동기 중심이 뭐야???

     

    이러한, 궁금증들이 있었지만, 너무나도 게을렀던 나는 그것에 대한 답을 이제서야 찾아 보았다.

     


    Multi-Thread의 한계

    Multi-Thread 방식은 서버의 요청 처리를 쓰레드에서 처리하도록 하여 병렬처리를 가능하도록 하는 방식이다.

    쓰레드는 서버 CPU 자원을 시분할 형태로 나누어 가지면서, 독립실행이 가능하고 다른 요청을 동시에 받을 수 있게 한다.

    *시분할: 주어진 시간을 다수의 사용자에게 그 시간을 분배하여  작업을 하도록 하는 것.

     

    Mutti-Thread에는 몇 가지 한계가 존재 하는데 다음과 같다.

    1. 메모리 자원을 많이 소모한다

    Multi-Thread는 일반적으로 클라이언트의 요청 마다 Thread를 만든다. 즉, 동시 접속자가 많을 수록 Thread가 많이 발생한다는 얘기다. 물론 서버의 자원이 제한 되어있어서 일정 수 이상의 Thread를 발생시킬 수는 없지만, 어쨋든 메모리 자원을 많이 소모한다.

     

    2. 공유 자원 접근 시 교착상태가 발생할 수도 있다.

    각 Thread는 독립적인 시점에서 동작하므로 공유자원에 대한 동기화 없이 접근하면 예상치 못한 결과가 나올 수도 있다.

     

    아하, 마냥 Multi-Thread가 좋은 게 아니었군. 

    물론 Multi-Thread 환경을 잘다룰 수 있다면, Single-Thread 보다 좋을 수 있겠지만, 

    나같은 코린이들한테는 Multi-Thread 환경보단 Single-Thread가 낫다.

    Node.js를 사랑하자ㅋㅋ


    비동기 처리

    먼저, 비동기라는 의미가 뭘까?

    Asynchronous means that things can happen independently of the main program flow.
    비동기는 주된 프로그램 흐름과 독립적으로 발생할 수 있는 것을 의미한다.

     javascript는 기본적으로 동기적이고, Single-Thread 기반이다. 즉, 새로운 Thread를 만들지 못하고, 병렬적으로 처리하지 못한다는 얘기.

    하지만 javascript는 브라우저에서 APIs를 제공해서 이벤트 함수를 비동기적으로 실행 할 수 있다.

    여기서 나오는 중요한 개념이 Callback.

    Callback에 대해 간단히 설명하자면....

    음, 예를들어 사용자들이 click 버튼을 언제 누를 지 모른다.

    그래서, javascript는 언제 누를 지 모를 이 클릭 event에 대해 event handler를 정의 해놓는데,

    이 event handler는 클릭 이벤트가 trigger 될 때 호출하는 함수를 가지고 있다.

    이 함수가 Callback이다.

    document.getElementById('button').addEventListener('click', () => {
      //item clicked
    })​

    Callback은 오직 event가 발생했을 때만 실행되어지는 함수이다.

     

    마찬가지로 Node.js는 Sigle-Thread 기반으로 동작한다. 

    그 이유로, 우리의 코드를 병렬적으로 실행할 수 없지만, 모든 I/O는 비동기식이고, non-blocking이다.

     

    Node.js에서는 I.O를 처리하는 backend에 대해서 어떠한 신경을 쓸 필요도 없다.

    단지 Callback을 사용해서 요청만 하면 된다. 

     

    여기까지, Nodejs 관련 비동기, Single-Thread에 대해 공부를 해보았는데,

    조금이나마 Node라는 녀석을 이해한 기분이다. ㅋㅋ

     


    참조

    https://nodejs.dev/learn/javascript-asynchronous-programming-and-callbacks

    https://www.nextree.co.kr/p7292/

    http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

    '프로그래밍 > Node' 카테고리의 다른 글

    Blocking vs Non-Blocking  (0) 2021.07.20
    이벤트 루프?  (0) 2021.07.04
    NodeJs란  (0) 2021.05.14
    Node-passport  (0) 2021.03.10
Designed by Tistory.