인프런 커뮤니티 질문&답변

차형석님의 프로필 이미지
차형석

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

nodeJS 기술적 소개

NodeJS 는 왜 싱글 스레드라고 불리는가요?

작성

·

453

·

수정됨

1

안녕하세요! 개발을 시작한지 얼마되지 않은 개발자입니다.

 

수업의 내용을 조금 인용하면 "nodeJS 는 싱글 스레드 모델이고, 이벤트 룹이 앞단에서 nonBlocking 요청 빠르게 수행하고 만일 Blocking 요청이 들어온다면 워커 스레드에 넘긴다. " 라고 이해했습니다.

하지만 워커 스레드를 사용하게된다면 그것이 싱글 스레드라는 이름에 맞는건지 의구심이 듭니다. 단순히 이벤트 룹이라는 특정 스레드가 앞단에서 Blocking 요청과 nonBlocking 요청을 구분해서 처리를 하기에 싱글 스레드라는 말이 나온건가요?

그리고 이벤트 룹이 Blocking 요청과 nonBlocking 요청을 나누는 기준 또한 궁금합니다.

마지막으로 구글링을 하며 본 정보에 의하면 JavaScript 가 싱글 스레드 기반의 언어이고, NodeJS는 스레드 풀을 미리 생성하여 워커 스레드들을 미리 생성해 둔 뒤, 각 워커 노드에서 JavaScript 를 실행하여 멀티 스레드를 가능하게 한다는 글을 보았는데 이 내용이 맞다면 NodeJS 는 싱글 스레드 기반 프레임워크가 아닌것으로 받아드려도 괜찮을까요?

답변 1

2

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

그런 기준을 준다면 세상에 '싱글 스레드' 서버 프레임워크는 존재하지 않습니다.

싱글 스레드라고 부르는 이유는 nodeJS의 최전방에서 작업을 실행하는 쓰레드가 하나뿐이기 때문입니다.

멀티쓰레드 서버 프레임워크의 경우 아예 처음 요청을 받을때부터 여러 쓰레드로 로드밸런싱이 됩니다.

그렇기 때문에 워커 쓰레드가 다수이긴 하지만 nodeJS를 멀티 쓰레드라고 소개하는 사람은 없습니다.

이벤트 룹이 blocking과 non blocking을 나누는게 아닙니다. 이벤트 룹을 막게되면 blocking 요청이고 막지 않는다면 non blocking 요청입니다. event loop을 막지 않기 위해 말씀하신 OS관련 작업이나 async 작업들을 유동적으로 처리하게 됩니다.

쉽게 말씀 드리면 while(true) 무한 룹을 요청에 넣는다면 이 또한 blocking이 됩니다. 이벤트 룹은 이런 요청을 non blocking으로 만들지 못합니다. (여기서 멀티 쓰레드를 다시 짚고 넘어가자면 멀티쓰레드 프레임워크는 한 쓰레드가 무한 룹으로 막혀도 다른 쓰레드 사용이 가능합니다: 요청을 받을 수 있습니다). 요청을 non blocking으로 만드는건 개발자의 역량입니다. 다만 event loop이 할 수 있는건 async 요청이나 OS요청등 event loop이 기다리거나 직접 실행하면 리소스 낭비가 있을만한 작업들을 event loop이 막히지 않는 형태로 처리하는겁니다. 만약에 IO 작업이 sync 였다면? 만약에 네트워크 요청을 sync로 보낸다면? 그렇다면 blocking 작업이었을거라는 관점에서 event loop이 blocking 요청을 non blocking하게 처리 할 수 있다는 이야기입니다.

말씀하신 이유때문에 nodeJS가 싱글 쓰레드가 아니라고 생각하시겠다면 그건 수강생님의 자유입니다. 하지만 위에 말씀드린 이유때문에 개발자 커뮤니티는 분명 nodeJS를 싱글쓰레드 프레임워크로 구분하고 있습니다.

감사합니다!

차형석님의 프로필 이미지
차형석
질문자

왜 싱글스레드라고 불리고있는지 이해가 되네요!

자세하게 답변해주셔서 감사합니다!

차형석님의 프로필 이미지
차형석

작성한 질문수

질문하기