How Node.js Works? (TIL 55일차)

EenSung Kim·2021년 5월 29일
4
post-custom-banner

"Single Thread"


Node.js 의 작동 방식

이전 글에서 Node.js 가 무엇인지에 대해 살펴보았고, 이번에는 Node.js 의 작동 원리에 대해 알아보도록 하겠습니다.

어제와 마찬가지로 Programming with Mosh 채널의 How Node.js Works 영상 내용을 한국어로 통역해보았습니다. 영상과 함께 참고하시면 더욱 좋습니다.

Node 애플리케이션은 매우 확장성이 뛰어납니다. Node 가 갖는 non-blocking 또는 비동기적인 (asynchronous) 특징 때문인데요. 비동기가 무엇인지 비유를 들어 설명해보겠습니다.

레스토랑에 가면 웨이터가 주문을 받고 주방에 전달하죠. 셰프가 요리를 만드는 동안 웨이터는 또 다른 테이블에서 주문을 받습니다. 셰프가 요리를 마칠 때까지 기다릴 필요 없이, 한 명의 웨이터가 여러 테이블을 맡아 주문을 처리할 수 있습니다. 이것이 바로 non-blocking 또는 비동기적 아키텍처이고, node 애플리케이션이 동작하는 방식입니다. 웨이터는 요청을 처리하기 위해 할당된 "스레드"라고 할 수 있고, "하나의 스레드 (Single Thread)" 가 여러 요청을 처리할 수 있는 것이죠.

대조되는 개념이 blocking 또는 동기적 (synchronous) 아키텍처입니다. 어떻게 동작하는지 레스토랑의 예시로 돌아가보죠. 또 다른 레스토랑을 갔다고 상상해봅시다. 한 웨이터가 여러분에게 배정(할당)되어 주문을 받고 주방에 전달합니다. 그리고는 주방에 앉아 셰프가 음식을 준비할 때까지 아무 것도 하지 않은채 가만히 있네요. 당신이 주문한 음식이 준비될 때까지 다른 테이블의 주문을 받지 않습니다. 이것이 blocking 또는 동기적 아키텍처입니다. ASP.NET 이나 (Ruby on) Rails 와 같은 프레임워크로 만든 애플리케이션들의 특징이죠.

서버가 요청을 받게 되면 요청을 처리하기 위해 스레드가 할당됩니다. 예를 들어 데이터베이스를 query 하는 작업이라고 할 때, 결과가 나오기까지 시간이 조금 걸릴 수 있죠. 이 때 데이터베이스가 query 를 실행하는 동안 스레드는 다른 클라이언트의 요청을 처리하지 못합니다. 다른 요청을 처리하기 위해서는 새로운 스레드가 필요하죠.

만약 우리가 많은 숫자의 클라이언트들로부터 동시다발적으로 주어진 요청들을 처리해야 한다고 가정한다면, 어느 순간 모든 스레드를 다 써버리게 될 수도 있습니다. 그렇게 되면 새로운 클라이언트는 요청을 처리할 수 있는 스레드가 나타날 때까지 기다려야 되죠. 아니면 기다리는 것을 방지하기 위해 하드웨어를 추가해야 하거나요.

이런 아키텍처로는 자원을 효과적으로 사용할 수 없습니다. 이것이 blocking, 또는 동기적 아키텍처가 갖는 문제이고, 말씀드렸듯이 ASP.NET 같은 프레임워크가 기본적으로 동작하는 방식입니다. 물론 ASP.NET 으로도 비동기적인 아키텍처를 사용할 수 있지만, 추가적인 작업이 필요하죠.

이와 달리 node 애플리케이션은 기본적으로 비동기적으로 동작합니다. 추가적인 작업이 필요없죠. Node 는 Single Thread 로 동작하고 모든 요청을 바로 이 하나의 스레드가 맡아서 처리합니다. 만약 데이터베이스를 query 해야 한다면 스레드는 데이터베이스가 데이터를 리턴할 때까지 기다리지 않고, 다른 클라이언트의 요청을 처리하죠. 그리고 데이터베이스의 결과가 나오면 Event Queue 에 메시지를 보냅니다. Node 는 백그라운드에서 계속해서 Event Queue 를 체크하면서, Event 를 발견하면 꺼내와 처리합니다.

Node 의 이런 구조는 많은 디스크나 네트워크 접근을 포함하는 애플리케이션을 만드는 데 적합합니다. 하드웨어를 추가하지 않고서도 더 많은 클라이언트를 담당할 수 있죠. 이것이 바로 Node 애플리케이션의 뛰어난 확장성을 갖는 이유입니다.

대신에 Node 는 동영상을 인코딩하거나 영상을 처리하는 서비스와 같은 CPU 집약적인 애플리케이션에 활용될 수 없습니다. 이런 애플리케이션은 아주 많은 대부분의 연산을 CPU 가 맡고, file system 이나 네트워크 작업은 매우 적기 때문이죠. (Node 로 이런 애플리케이션을 만들게 되면) Single Thread 의 특성 상, 연산이 일어나는 동안 다른 클라이언트는 기다려야 합니다. 이런 이유로 Node 는 CPU 를 많이 활용하는 데 쓰기보다는 data 를 많이 활용하거나, 실시간으로 작동하는 애플리케이션에 적합합니다.

이 정도면 이론은 충분한 것 같네요. 다음 영상에서는 어떻게 Node 를 설치하는 지와, 첫 Node 애플리케이션을 만드는 방법을 다뤄보겠습니다.

profile
iOS 개발자로 전직하기 위해 공부 중입니다.
post-custom-banner

4개의 댓글

comment-user-thumbnail
2021년 5월 30일

번역해주셔서 편안하게 영상보고가네요! 감사합니다 :)

1개의 답글
comment-user-thumbnail
2021년 5월 30일

블로깅 정말 열심히 하시네요 잘 보고갑니다 !

1개의 답글