Develope Me!

[Node.js] Node.js - V8엔진, 이벤트 기반 비동기I/O 본문

JavaScript/Node.js

[Node.js] Node.js - V8엔진, 이벤트 기반 비동기I/O

코잘알지망생 2024. 3. 4. 17:22

직장에서 주로 Java 기반의 프로젝트를 하다보니 새로운 환경에서의 프로그래밍을 배워보고 싶었다. 그 중에서도 백엔드 프로그래밍을 서치했을 때 Java 다음으로 많이 언급되는 게 Node.js 였기 때문에 자연스럽게 Node.js에 대해 관심이 생겼다. 그래서 한 번 자바스크립트 기반의 Node.js에 대해 학습해보려 한다. 

 

개인적으로 계획해본 학습 방법은 인프런 '테스트 주도개발(TDD)로 만드는 NodeJS API 서버' 강좌를 들으면서 기본 개념과 동작 과정을 가볍게 익힌 뒤 부족한 내용은 유튜브나 공식 문서를 참고하여 보충하려고 한다. 간단하게 API를 구축도 해본 뒤 마지막으로는 자바로 프로그래밍을 했을 때와 비교해보는 방식으로 진행할 것이다. 

 

 

Node.js의 기초

자바스크립트는 별도의 설치 과정없이 브라우저에서 실행 가능한 언어다. 브라우저에서 동작하는 자바스크립트를 내 컴퓨터 혹은 서버(백엔드 환경) 에서 실행 하려면 Node.js를 설치해야 한다. Node.js가 브라우저 밖에서 실행할 수 있는 이유는 크롬에서 사용하고 있는 V8 엔진을 사용하기 때문이다. 

 

*V8 엔진은 자바스크립트 코드를 구문 분석하고 실행하는 일명 '자바스크립트 해석기'라고도 표현할 수 있다.

이 엔진과 다른 엔진과의 차이점은 JIT(Just In Time) 컴파일러라는 점이다. JIT 컴파일은 프로그램을 실행하는 시점에 기계어로 번역하는 기법이다. 인터프리터 방식(한 줄 씩 번역 후 실행)과 정적 컴파일 방식(전체 번역 후 한 번에 실행)을 혼합한 방식으로 생각할 수 있는데 런타임에 모든 자바스크립트를 기계어 코드로 컴파일하고 중간 코드를 생성하지 않는다.

(Node.JS에 대한 포스팅이기 때문에 V8엔진에 대한 자세한 설명은 필요 시에 추가적으로 학습하는 걸로 하자!)

 

 

 

 

이벤트 기반 

Node.js로 만든 어플리케이션은 이벤트를 기반으로 동작한다. 예를 들어 클라이언트가 요청을 하게 되면 Node.js는 클라이언트의 요청을 이벤트로 만들어서 이벤트 큐에 쌓는다. 그리고 이벤트 루프(싱글 스레드)가 이벤트 큐에 있는 이벤트 하나 하나를 뽑아내서 실행하여 잡을 처리하고 클라이언트 요청에 응답을 한다. 

 

비동기I/O

이벤트가 바로 실행되어 응답할 수 있는 이벤트가 있을 수 있지만 시간이 더 필요한 이벤트가 있을 수도 있다. (ex. 외부 네트워크와의 통신) 그럴 땐 이벤트 루프에서는 무거운 잡을 Non-blocking Worker라는 스레드에 잡을 위임한다. Non-blocking Worker는 이벤트 루프로 부터 위임받은 잡을 실행하고 실행이 완료되면 이벤트 형태로 이벤트 큐에 다시 전달한다. 이벤트 루프는 이벤트 큐에 있는 것들을 하나씩 실행하다가 워커 스레드가 보내준 이벤트를 이벤트 큐에서 뽑으면 다시 그 이벤트를 계속해서 실행한다. 실행 완료했으면 요청한 결과를 클라이언트에게 보내준다. 

 

 

Comments