다운로드 한 노드는 터미널에서 node -v
명령어로 확인 가능
Node.js 란 ?
Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임
Node.js는 서버사이트 스크립트 언어가 아닌 프로그램(환경)임
즉 Node.js란 본래 웹브라우저에서만 동작하던 언어인 javascript를 브라우저 없이도 사용할 수 있도록 브라우저 환경에서 독립시킨 것
특히 Node.js를 통해 javascript로 서버를 만들 수 있게 되면서 한 가지 언어로 전체 웹 페이지를 만들 수 있게 되어 개발의 확장성이 커짐
*이전에는 웹에 표시되는 부분은 javascript로 만들고, 서버 부분은 다른 언어를 사용해서 만들어야만 했음
터미널에서 node
입력 후 node 환경에서 수식을 입력하면 그 결과값을 도출해 주는 것을 통해 javascript 엔진이 node.js 안에서도 똑같이 구동되는 것을 확인가능
*그러나 node.js 에는 브라우저의 정보를 담은 객체(ex. window)는 없기 때문에 브라우저 환경의 javascript와 완전히 똑같은 것은 아님!
브라우저에서 벗어난 Javascript(Node.js)
node index.js
명령어로 파일 자체를 불러오면 브라우저 환경이 아니더라도 이렇게 터미널 상에서 바로 출력되는 것을 확인 가능 (브라우저에서 독립됨) Node.js 와 싱글 쓰레드
Node.js 는 javascript 처럼 싱글 쓰레드임
따라서 위와 같은 코드를 Node로 실행하면 1번 작업, 4번 작업, 3번 작업, 2번 작업 순으로 실행됨
쉽게 말해 우선 JS 엔진에는 Heap 와 Call stack 이 있음
*Heap = 메모리가 할당이 되는 곳, 선언한 변수, 함수가 담겨져 있음
코드가 실행될 때 해당 코드는 우선 Call stack에 들어감
바로 처리되는 작업들은 그대로 바로 실행되고 Call stack에서 빠져 나감
반면 Call stack에 들어오는 setTimeout 같은 함수들은 javascript 엔진이 아닌 브라우저에서 제공하는 API로, 이런 비동기 함수들은 Web API(node 의 경우 Node API)를 호출하여 해당 함수들은 Callback Queue로 넘어가서 대기상태가 됨
Event Loop는 Call stack 상태를 실시간으로 체크하여 Call stack이 비어있을 경우 Callback Queue에 들어온 순서대로 각 함수를 Call stack으로 보내 처리함
Node.js 와 싱글 쓰레드 - gif로 이해하기
1. 바로 처리되는 작업은 Call stack에서 바로 처리
2. 바로 처리되지 않는 작업은 비동기 처리됨 (이 경우 setTimeout은 web API를 호출하는 함수이기에 우선 web API(node 의 경우 Node API)로 넘어감)
3. 작업이 끝난 함수 (setTImeout의 경우 일정시간 기다린 후 실행되는) 는 web API(node 의 경우 Node API)에서 Callback queue 로 이동되고, Event loop는 Call stack이 비어있는지 여부를 체크 후 Callback queue에 있는 콜백함수를 Call stack으로 옮겨 처리