Node.js란? Node.js 개념 알고가기

Doyun Geum·2020년 1월 3일
0

Node.js란 ?

노드는 Javascript의 runtime입니다. 즉, Javascript program을 실행할 수 있게 해줍니다.

  • runtime(런타임)이란 ?
  1. 기존에는 Javascript program을 인터넷 브라우저에서만 실행할 수 있었던 점
  2. 웹 서버에 파일을 업로드할 때, 업로드 진행상황을 알기 위해 서버에 쿼리를 전송해야 한다는 점

인터넷 브라우저 외의 환경에서 더 빨리 실행될 수 있도록, 이런 점을 개선하기 위해 Node.js가 개발되었습니다.

다음은 Node.js의 내부 구조입니다.

노란색은 Javascript, 초록색은 C/C++로 구현되어 있습니다. Javscript 코드는 Node가 알아서 V8과 libuv에 연결해줍니다.

위 구조에 나온 이벤트 기반이 뭘까요 ?

이벤트 기반(event-driven)

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식입니다. 그렇기에 이벤트가 발생했을 때 무엇을 할지 미리 등록되어 있어야 합니다.

이는 이벤트 리스너(event listener)에 콜백(callback)함수를 등록함으로써 가능합니다.

Node.js application은 단일 스레드/이벤트 기반 모델로 실행됩니다. Node.js는 Background에서 thread pool을 구성해 작업을 수행하지만 application 자체에서는 단일 스레드로 실행됩니다. 요청이 처리되는 과정은 아래와 같습니다.

[From stackoverflow]

  1. Node API가 처리할 요청과 비동기 작업을 이벤트 큐에 넣는다.

  2. 단일 스레드가 이벤트 루프를 돌면서 우선순위가 높은 이벤트를 이벤트 큐에서 꺼내어 수행한다. (요청 완료 시간이 짧을수록 우선순위가 높다.)

    • 이벤트에 블로킹 I/O가 있다면, 백그라운드에 있는 스레드 풀에서 스레드를 꺼내 이곳에서 별도로 처리된다.
    • 그외는 꺼낸 이벤트(요청)을 실행한 후 콜백함수를 이벤트 큐에 추가한다.
  3. 이벤트 루프 or 그외 스레드에서 콜백함수가 실행되면 다음 동작 중 하나를 수행한다.

    • 응답 보내기
    • 다른 이벤트 스케줄링
    • 종료
  4. 이 과정은 이벤트 큐에 있는 이벤트가 모두 처리될 때까지 진행된다.

스레드 기반 웹 서버

웹 서버에 요청이 도착하면 스레드에 작업이 할당되고 요청이 처리될 때까지 동일한 스레드에서 지속됩니다. 각 스레드에서 순차적으로 요청이 처리되는 방식이죠.

스레드 기반 모델은 요청을 처리할 수 있는 스레드 수가 제한되어 있습니다. 또한 공유된 자원이 존재하기 때문에 하나의 스레드가 공유된 자원을 사용하면 다른 스레드들은 도중에 대기해야 합니다.(공유 자원을 사용한다면)

예제를 통해 알아보는 이벤트 기반의 Node.js

이제 스레드 기반, 이벤트 기반 방식 모두를 살펴보았는데요. 이는 일상생활에서 대화를 할 때를 생각하면, 그 차이점을 분명히 알 수 있습니다.

  • 가정

자신은 웹 서버의 일부입니다.

대화는 다양한 웹 요청 처리를 위한 작업입니다.

대화에는 여러 종류가 있습니다.

ex. 짧은 대화(간단한 요청), 여러 부분으로 나눠지는 다양한 대화(복잡한 서버단 송수신), 대화 상대를 기다리는 경우(DB, File System, 블로킹 I/O)

  • 스레드 기반

자신의 클론(스레드)가 1개 이상 존재하여 사람들과 대화를 주고 받습니다.
이렇게 보면 대화할 사람들 수만큼 클론을 만들어 다중 대화를 동시에 가능 할 것 같습니다...실제로는 클론(스레드) 수에 제한이 있습니다. 대화할 사람들이 늘어나면 동시에 처리할 수 없겠죠.(줄어도 클론이 놀고 있기에 문제가 됩니다.) 더 큰 문제는 모든 클론이 하나의 머리(CPU)을 사용한다는 것입니다. CPU 역시 제한되어 있기 때문입니다. 그래서 하나의 클론이 브레인을 사용하면 다른 클론은 대기하고 있어야 합니다.

  • 이벤트 기반

자신 스스로가 사람들의 질문(요청)에 응답하고 상호 작용은 각 사람들을 대상으로 이벤트 방식으로 처리됩니다. 동시에 진행되는 많은 대화에 대해 개별적으로 대화를 하면서 처리할 수 있습니다. 브레인을 공유하지 않기에 대화를 나누고 있는 사람에게만 집중할 수 있습니다. 만약 어려운 질문을 문의하는 경우(블로킹 요청) 답변을 머릿속으로 생각하고 있는 동안(background에서 처리 중) 다른 사람과 대화를 할 수 있습니다.(이벤트 루프에서 요청을 수행할 수 있다.)

profile
안녕하세요, 서버 개발자 도유니입니다.

0개의 댓글