Node.js 교과서 1장을 공부하고
2월 15일 입사를 하고 일이 바빠 블로그를 못하고 지내다가,
슬슬 다른 공부가 하고 싶어져서 기존에 활동하던 동아리에 활동 신청을 하고 Node.js 공부를 하게 되었다.
⚠️ 본 포스팅은 매주 Node.js를 공부하고, 동아리 스터디원들과 함께 스터디한 내용을 정리하는 곳입니다.
⚠️ 모든 내용을 기록하려고 하기 보다는 함축하고 필요한 내용만 작성하고 있습니다.
자바스크립트 런타임
- Node.js는 Chrome V8 엔진으로 빌드된 js 런타임
- V8과 더불어 libuv 라이브러리 사용
- libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있음
이벤트 기반
-
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때, 이벤트 리스너에 콜백 함수를 등록한다.
- ex) 클릭 이벤트 리스너에 경고창을 띄우는 콜백을 등록해두면, 해당 이벤트가 발생할 때마다 콜백 함수로 경고창이 뜨는 것
-
발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 대기
-
용어 정리
-
이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당. 노드가 종료될 때까지 이벤트 러리를 위한 작업을 반복하므로 루프라고 부름
-
백그라운드: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳. js가 아닌 다른 언어로 작성된 프로그램. 여러 작업이 동시에 실행될 수 있다.
-
태스크 큐: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냄. 정해진 순서대로 콜백들이 줄서 있어, 콜백 큐라고도 부름, 특정 경우에는 순서가 바뀌기도 함.
-
-
예시:
- setTimeout 실행 시 콜백 run은 백그라운드로 보냄.
- 백그라운드에서 3초 후 태그크 큐로 보냄
- 태스크 큐에서 그때서야 run에 해당하는 작업을 호출 스택으로 올림
- 주의: 호출 스택이 비어있어야 큐에서 run을 가져옴 (setTimeout으로 올린 시간이 정확하지 않을 수 있는 이유)
논 블로킹 I/O
- 논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것
- 반대로 블로킹은 이전 작업이 완료되어야만 다음 작업을 진행하는 것
- 논 블로킹 방식으로 코드를 작성하더라도 실행 순서만 바꾸는 것이지 동시성이 활성화된 것이 아니기 때문에 전체 소요시간을 짧아지지 않는다.
- 하지만 이러한 작업이 의미없는 것은 아님.
- 순서를 바꿔줌으로써 간단한 작업을 얼른 처리하고 대기상황을 막을 수 있다는 장점이 있다.
싱글 스레드
- 노드가 싱글 스레드라고 하지만, 실제로 진짜 싱글 스레드는 아님.
- 우리가 제어할 수 있는 스레드가 하나라서 싱글 스레드라고 부름
- 그렇기 때문에 블로킹이 심하게 일어나는 작업만 아니면 충분히 처리가 가능하다.
- 싱글 스레드 + 블로킹
- 점원 한명이 주문을 받고, 요리가 나오면 서빙함.
- 이 후에 다음 주문을 받음
- 이런 구조는 다음 손님은 이전 손님의 요리가 나올 때까지 아무것도 못하고 대기해야함
- 싱글 스레드 + 논 블로킹
- 점원 한명이 여러 주문을 동시에 받을 수 있음
- 그러나 요리시간이 너무 길거나 점원이 아파서 쓰러지면 문제가 발생함
- 멀티 스레드 + 논 블로킹
- 점원 한명에게 문제가 발생해도 다른 점원이 있기 때문에 문제가 발생하진 않음
- 그러나 일이 급격하게 늘어나거나 줄어들때, 고용과 해고를 하는데 비용이 발생
서버로서의 노드
- 작은 데이터를 실시간으로 주고 받는데 적합함
- CPU연산이 많이 요구되는 서버로는 적합하지 않음
- 멀티 스레드 방식보다는 쉬우나, 싱글 스레드이므로 멈추지 않도록 관리가 필요함