inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

nodeJS 기술적 소개

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

821

차형석

작성한 질문수 3

1

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

 

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

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

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

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

javascript typescript rest-api nestjs backend

답변 1

3

코드팩토리

안녕하세요!

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

싱글 스레드라고 부르는 이유는 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를 싱글쓰레드 프레임워크로 구분하고 있습니다.

감사합니다!

0

차형석

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

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

cascade 질문

0

49

1

@types/bcrypt 설치과정이 누락된것같습니다.

0

60

1

process.env port key 에러

0

55

1

추상화

0

56

1

[공유] DTO optional 필드가 undefined로 잡혀 TypeORM 조건이 깨지는 현상

0

114

2

where 키워드가 들어가는 메서드와 아닌 메서드

0

59

1

BearerTokenGuard에서 db를 조회해서 유저 정보를 불러오는 이유?

0

75

1

app.controller app.service 는 지워도되나요?

0

75

1

@JoinColumn을 쓰는 경우와 안쓰는 경우의 차이

0

86

1

포트 3000에서 listen하는 곳까지 넘어가지 않습니다.

0

76

1

PickType 사용 시 `as const`를 꼭 사용해야 하나요?

0

112

2

socket connect 오류

0

111

2

강의를 들으면서 궁금한 점

0

104

2

DELETE 요청의 반환값은 어떤 기준으로 결정하는 게 좋을까요?

0

72

2

커리큘럼 질문

0

103

2

put 요청은 언제

0

98

3

typeorm VS prisma

0

357

2

142 강의 > 4:00 > 포스트멘 활용 관련 질문 드립니다.

0

81

2

User 데코레이터 버그 수정 전달드립니다.

0

70

1

git 주소 부탁드립니다.

0

118

2

nest g resource 명령어 에러

0

102

2

로그인 엔드포인트 관련 질문

0

89

2

yarn으로 express 다운 후 node 2_server.js 실행 안되는 경우

0

153

3

"흔히 사용되는 메서드" 강의 관련 질문입니다~

0

98

2