노드의 정의
Node.jsⓇ는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다.
- 서버의 역할도 수행할 수 있는 자바스크립트 런타임
- 노드로 자바스크립트로 작성된 서버를 실행할 수 있음.
- 서버 실행을 위해 필요한 http/https/http2 모듈을 제공
런타임
노드: 자바스크립트 런타임
- 런타임: 특정 언어로 만든 프로그램들을 실행할 수 있게 해주는 가상 머신(크롬의 V8 엔진 사용)의 상태
- ∴ 노드 : 자바 스크립트로 만든 프로그램들을 실행할 수 있게 해 줌
- 다른 런타임으로는 웹 브라우저(크롬, 엣지, 사파리, 파이어폭스 등)가 있음
- 노드 이전에도 자바스크립트 런타임을 만들기 위한 많은 시도)
- But, 엔진 속도 문제로 실패
내부 구조
2008년 V8 엔진 출시, 2009년 노드 프로젝트 시작
노드는 V8과 libuv를 내부적으로 포함
- V8엔진 : 오픈소스 자바스크립트 엔진을 속도 개선한 것
- libuv: 노드의 특성인 이벤트 기반, 논블로킹 I/O모델을 구현한 라이브러리
노드의 특성
이벤트 기반
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
- 이벤트의 예: 클릭, 네트워크 요청, 타이머 등
- 이벤트 리스너: 이벤트를 등록하는 함수
- 콜백 함수: 이벤트가 발생했을 때 실행될 함수
이벤트 기반 모델에서는 이벤트 루프(event loop)라는 개념이 등장
- 어떤 순서로 콜백 함수를 호출할지 판단
- 함수 호출 발견 시, 호출 스택에 함수 삽입
이벤트 루프, 백그라운드, 태스크 큐
- 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수 관리, 실행 순서 결정
- 백그라운드: setTmeout 같은 타이머/이벤트 리스너가 대기하는 곳
- 태스크 큐: 백그라운드로부터 타이머/이벤트 리스너를 받는 곳
논블로킹 I/O
논 블로킹: 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행
- 논 블로킹 방식 하에서 일부 코드는 백그라운드에서 병렬로 실행됨
- 일부 코드: I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화 등
- 나머지 코드는 블로킹 방식으로 실행됨
- ∴ I/O 작업이 많을 때 노드 활용성이 극대화
프로세스 vs 스레드
프로세스와 스레드
- 프로세스: 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원 공유X
- 스레드: 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유
노드 프로세스는 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현
노드는 주로 멀티 스레드 대신 멀티 프로세스 활용
노드는 14버전부터 멀티 스레드 사용 가능
싱글 스레드
싱글 스레드라 주어진 일을 하나밖에 처리하지 못함
- 블로킹이 발생하는 경우 나머지 작업은 모두 대기해야 함 -> 비효율 발생
주방에 비유(점원: 스레드, 주문: 요청, 서빙: 응답)
대신 논 블로킹 모델을 채택하여