개발자
node를 공부하고 있는 학생입니다. node.js는 single thread, non blocking 언어다라고 설명하는 글을 자주 접할 수 있는데 여기서 non blocking이 정확히 어떤 것인지 궁금합니다. 대부분 예시로 코드에서 파일을 읽거나 API 요청을 말하고 있는데, 이게 왜 non blocking인가요? 단순히 파일을 읽거나, API 요청을 보낼때 그걸 실행 시켜놓고 다른 코드 작업을 이어갈 수 있어서인가요?
답변 1
안녕하세요! non-blocking 이라는 개념은 단순하게 봤을때 질문자님이 이해하신게 얼추 맞습니다. 예를 들어보겠습니다. A, B, C 라는 코드를 순차적으로 실행한다고 칩시다. 이때 A가 끝날때까지 B가 실행을 할 수 없다면, blocking이 되는 것입니다. 반면, A가 실행되고 아직 끝나지 않았는데 B가 실행될 수 있다면 이는 non blocking입니다. 이걸 node.js로 가져와서 설명해보겠습니다. non-blocking을 설명하는 것보다 blocking에 대해 정의하는게 이해가 더 빠를 것 같아서 blocking 부터 설명하겠습니다. 우선 아시다시피 node.js에는 메인 스레드라는 것이 있습니다. 이 메인 스레드에선 이벤트 룹이라는 것이 계속 돌고 있습니다. node.js에서 blocking이란 이 이벤트 룹이 Javascript 이외의 작업 때문에 대기해야될 때로 정의하고 있습니다. 즉, 특정 함수 A가 엄청 오래걸리는데 Javascript 이외의 작업이 포함되지않은 순수 JS 코드라면 - 단순히 함수가 오래걸리는 것이고 blocking이라고 정의하지 않습니다. node.js에서 blocking은 JS 작업 이외의 작업(I/O, network 등)을 기다려야할때 입니다. 예를 들면 fs.readFileSync와 같은 함수들입니다. 질문자님이 본 설명 글에 "파일 읽기"나 "API 요청"이 많이 나온 이유도, 이 I/O 작업을 뜻하기 때문입니다. (여기서 I/O는 node.js가 사용하는 libuv가 디스크나 네트워크랑 상호작용하는 행위를 뜻합니다) 그럼 blocking을 알았으니, non-blocking은 이벤트 룹이 JS이외에 작업 때문에 대기를 하지 않을때라고 정의할 수 있을 것 같습니다. 거의 대부분의 경우에서 node.js의 코드는 non-blocking이기 때문에 node.js 자체를 non-blocking 하다고 표현한다고 볼 수 있습니다. 참고하시면 좋은 글들 첨부합니다 - https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ - https://blog.naver.com/pjt3591oo/221976414901
익명
작성자
2022년 11월 24일
답변 정말 감사합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!