ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js[1] - Single thread,Async,Callback
    Node.js 2018. 2. 16. 21:57



    - Node.js



    -    single thread 기반으로 동작하는 고성능의 비동기 IO (Async / Non-blocking IO)를 지원하는 네트워크 서버


    -    Google Chrome V8 엔진으로 개발되어 있으며, 프로그래밍 언어로는 Java script를 사용하며, Event 기반의 프로그래밍 모델


    먼가 되게 어려운 말들만 늘어놓은거 같애서 차근차근 풀어나가보자.

    먼저 single Thread 이다. 



    - Multi Thread vs Single Thread 



    서버에서는 node.js 가 나오기전엔 Apache Tomacat 은 Multi Thread 를 지원하였다. 밑에 나온 그림과 같이 Thread Pool에 여러개의 Thread를 담아둔 상태에서 클라이언트가 요청할때 마다 Thread를 꺼내서 응답을 해주는 방식이다. (주머니에서 공을 꺼내듯이)


    단점이 두드러진다. Thread pool 에 담겨진 Thread 의 개수는 무한이 아니다 . 그렇기 때문에 Thread pool이 허용가능한 Thread 수에 따라 동시 요청에 제한을 따른다.



    또한 위의 그림처럼 클라이언트에 할당된 Thread는 IO 작업 (DB,Network,File)이 있을 경우 IO 호출을 해놓고, Thread는 CPU를 사용하지 않는 Wait상태로 빠져 버리게 된다. (비효율적인 처리)


    이러한 단점을 보완하기 위해 Single Thread는 하나의 Thread만 사용해서 여러 클라이언트로 부터 오는 요청을 처리한다.

    과연 어떻게 해결하는것인가?



    위의 그림처럼 IO작업이 있을 경우 비동기 IO방식으로 IO 요청을 던져놓고, 다시 돌아와서 다른 작업을 하다가 IO 작업이 끝나면 이벤트를 받아서 처리하는 구조를 가진다. 그러면 하나의 Thread가 계속적으로 자기 일을 하면서 IO작업 기다리지 않고처리할수 있게 된다.


    그러면 효율성면에서는 Single Thread 의 장점을 보았다. 여기서 또 궁금한 점은 비동기 방식이다.



    - Async / Non-blocking IO



    -    하나의 요청 처리가 끝날때까지 기다리지 않고 다른 요청을 동시에 처리할수 잇는 방식


    파일을 '비동기 방식으로 읽는다'라는 것은 파일 시스템에 읽기 요청을 한 후에 프로그램이 대기하지 않고 다른 작업을 진행한다는 것을 의미한다.


    근데 어떻게 그게 가능할까?

    프로그램에서 해당 파일의 내용을 처리할수 있는 있는 시점이 되면 Callback 함수가 호출된다. ( Callback? 콜백? )

    프로그램에서는 파일 읽기 요청을 하기 전에 Callback 함수를 등록하는데 , 파일 시스템은 파일 처리가 끝나면 자동으로 Callback 함수를 호출한다.

    프로그램이 파일 읽기 작업이 끝날 때까지 대기하지 않아도 파일을 다 읽은 시점에 통보를 받고 파일의 내용을 화면에 보여주는 작업을 진행할수 있다.

    순서를 중요시 여기는 동기 방식과는 다르게 속도가 중요하다면 비동기를 사용하는게 맞다.


    두리뭉실하게  넘어간 Callback 함수, 이 친구도 굉장히 중요한 역할을 하는 것같다.


    - Callback 함수



    -    특정함수에 매개변수로서 전달된 함수


    Javascript 는 Java, C, C++ 등 과 다르게 (매개)변수로서 함수,메소드를 선언및 사용할수 있다.

    Callback 함수는 전달받은 즉시 바로 실행시킬필요가 없으며 특정이벤트를 발생이되면 그때 호출이되어진다.


    예를 들어


    var fs = require('fs');

    console.log(2);

    fs.readFile('data.txt',{encoding:'utf8'},function(err,data){  // Callback 함수 

    console.log(3);

    console.log(data);

     });

    console.log(4);


    readFile() 함수의 매개변수 정의는 ('파일명','옵션','Callback')으로 정의되어있다.

    이때 이 Callback 함수는 data.txt 파일을 다 읽었을때(특정 이벤트가 발생하였을때) 호출되는 함수로서 { } 중괄호 안에 실행문이 실행된다.( 등록된 이벤트 처리를 하게된다.) 


    이 예제 코드의 결과는  2    4    3    data.txt 의 내용 순으로 console에 뿌려지게 된다.

    왜? 라는 의문에는 아까배운 비동기 방식을 떠올리면 된다.

    2 가 출력되면 파일을 읽는 과정에서 4를 출력하는 코드가 먼저 실행되고 파일을 다 읽었으면 Callback 함수가 호출되 그안에 3 과 data가 출력되어지기 때문이다.    




    node.js는 single thread 기반으로 동작하는 고성능의 비동기 IO (Async / Non-blocking IO)를 지원하는 네트워크 서버 라는 정의는 대략 이해가 되었다.

    다음글로 event 기반의 프로그래밍과 Node.js의 주의사항 에 대해서 공부를 해보겠다.



    Ref

    빠르게 훝어보는 node.js #1 - node.js 소개 및 내부구조



    'Node.js' 카테고리의 다른 글

    Node.js - Webpack  (0) 2018.08.09
    Node.js - Babel  (0) 2018.08.07
    Node.js[2] - Event Loop, 주의사항  (0) 2018.04.01
    Node.js[JWT] - 토큰 기반 인증 - 2  (0) 2018.03.24
    Node.js[JWT] - 토큰 기반 인증 - 1  (0) 2018.02.24
Designed by Tistory.