Node.js란?
- Node.js는 Javascript 런타임( 런타임은 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻합니다. )입니다. 따라서 노드는 Javascript 프로그램을 브라우저가 아닌 환경에서 실행할 수 있도록 도와주는 런타임입니다.
Node.js와 V8엔진
- 과거에는 브라우저에서만 Javascript를 실행할 수 있었으며, 브라우저 외의 환경에서 실행하고 싶어도 성능의 문제 때문에 어려움이 있었습니다. 하지만, 2008년 구글의 V8 엔진이 공개되고 V8 엔진의 높은 성능 덕분에 라이언 달( Ryan Dahl )이 2009년 V8 엔진 기반의 노드 프로젝트를 시작하여 현재의 Node.js를 완성할 수 있었습니다.
이벤트 기반, 논 블로킹 I/O 모델
- Node.js는 V8과 더불어 libuv라는 라이브러리를 사용합니다. V8과 libuv는 C/C++로 구현되어 있으며 우리가 작성한 Javascript코드를 Node.js가 알아서 V8과 libuv에 연결해줍니다. libuv는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있습니다.
이벤트 기반( event-driven )
- 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 즉, 클릭이 발생했을 때 이에 대응하는 콜백 함수가 실행될 수 있도록 지정하는 것을 말합니다. 이벤트 기반 모델에서는 이벤트 루프( event loop ), 백그라운드( background ), 테스크 큐( task queue )라는 개념이 있습니다.
이벤트 루프( event loop )
- 이벤트 발생 시 호출할 콜백 함수들을 관리하고 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프( loop )라고 합니다.
백그라운드( background )
- setTimeout과 같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 됩니다. 여러 작업이 동시에 실행될 수 있습니다.
테스크 큐( task queue )
- 이벤트 발생 후 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냅니다. 테스크 큐는 여러 개로 이루어져 있으며 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부릅니다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 합니다.
이벤트 처리 과정
function run() {
console.log("3초 후 실행");
}
setTimeout(run, 3000);
- anonymous가 호출되고 setTimeout()을 호출 후 역순으로 호출스택에서 제거됩니다.
- 백그라운드에서는 3초를 센 후 run 함수를 테스크 큐로 보냅니다.
- 이벤트 루프가 호출스택이 비어있다는 것을 확인하고 테스크 큐에서 run 함수를 호출스택에 넣고 실행합니다.( 이벤트 루프는 호출 스택이 비어있을 때만 테스크 큐에 있는 함수를 호출 스택으로 가져옵니다. )
Node.js와 논 블로킹 I/O
- Node.js는 non-blocking I/O를 이용해서 I/O 작업을 백그라운드로 넘겨 동시에 처리합니다.
Node.js와 싱글 쓰레드
- 노드는 싱글 쓰레드라고 불리지만 엄밀히 따지면 싱글 쓰레드가 아닙니다. 노드를 실행하면 여러 쓰레드를 생성합니다. 다만, 노드 개발자가 제어할 수 있는 쓰레드는 하나뿐입니다.( 노드 12버전부터는 노드에서 멀티 쓰레드를 사용할 수 있습니다. )
'Node.js' 카테고리의 다른 글
express 프레임 워크란? (0) | 2022.12.18 |
---|---|
npm(node package manager)란? (0) | 2022.12.18 |
Node.js의 파일 시스템 (0) | 2022.12.17 |
Node.js와 모듈 (0) | 2022.12.11 |