Node.js 2009년 Ryan Dahl에 의해 만들어진 기술이다. C/C++과 JavaScript로 이루어져 있으며, 기본적으로 JavaScript 코드를 브라우저 밖에서 구동한다. Node.js에 대해 설명하기 이전에 왜 Ryan은 JavaScript를 사용하였는지,그리고 JavaScript가 어떻게 브라우저 밖에서 구동되는지 설명하고자 한다. 이를 이해하기 위해서는 Chrome V8, Non-Blocking I/0, Event Loop에 대해 알아야 한다.
Chrome V8 Engine
p1과 p2는 같은 hidden class를 가지지만, p2에 z가 추가 되면 서로 다른 hidden class를 갖기 때문에 성능에 악영향을 끼친다.
- 모든 객체 멤버를 생성자 함수 안에서 초기화 (나중에 변화시키지 않도록 하자)
- 항상 같은 순서로 멤버를 초기화
V8에서는 사용자가 사용하는 값을 통해서 Number 타입을 추론한다. 데이터 타입은 동적으로 변할 수 있기 때문에, 효율적으로 값을 나타내는 태그 사용이 필요하고, number 타입을 지속적으로 쓰는 것이 중요하다.
- 31비트 부호있는 정수를 사용
- Normal Arrays
큰 배열을 처리하기 위해서는 '키 값이 순서대로 채워지신 선형 저장소'인 Fast Element와 '그렇지 않은 해쉬 테이블 저장소'인 Dictionary Element가 존재한다. 배열 저장소가 한 유형에서 다른 유형으로 변경되지 않는 것 또한 중요하다.
- 배열은 초기화 시킨다.
- 숫자 배열의 요소를 활용한다.
- Index는 0부터 시작하는 연속키를 사용한다.
- Double Arrays
상단부 코드 경우 a[2]가 선언될 때에 double 배열의 형태로 바뀌었다가, 다시 a[3]가 선언될 때에 일반 배열로 바뀐다. 이렇듯 선언 될때마다 배열의 종류가 바뀌지 않도록 신경써야한다.
- JavaScript Compile
2가지 종류의 컴파일러를 가지고 있다. 이는 따로 설명하지 않겠다.
- Full Compiler
- Optimize Compiler
참고: Captain Pangyo (https://joshuajangblog.wordpress.com/2016/07/30/chrome-v8-javascript-perf/)
Non-Blocking I/O

Event Loop
(출처: http://meetup.toast.com/posts/89)
브라우저 환경에 관한 그림이다. 비동기 호출을 위해 사용되는 'Timer'를 비롯하여 Event Loop 및 Task Queue 또한 JavaScript 엔진이 아닌 외부에 있음을 볼 수 있다. 다음은 Node.js 환경에 관한 그림이다.
Node.js는 비동기 I/O를 지원하기 위해 LIBUV 라이브러리를 사용하며, Event Loop를 제공한다. JavaScript 엔진은 비동기 작업을 위해 Node.js API를 호출하며, 이때 넘겨진 콜백은 Event Loop를 통해 계획되고 실행된다.
Task Queue는 콜백 함수들이 대기하는 큐(First In First Out) 형태의 배열이다. Event Loop는 호출 스택이 비워질 때 마다 Task Queue에서 콜백 함수를 꺼내와서 실행하는 역할을 해준다. 이런 식으로 Event Loop는 '현재 실행중인 태스크가 있는지'와 '태스크 큐에 태스크가 있는지'를 반복적으로 확인하는 것이다. 간단히 확인하면 다음과 같다.
모든 비동기 API들은 작업이 완료되면 콜백 함수를 태스크 큐에 추가한다.
Event Loop는 '현재 실행중인 태스크가 없을 때' 태스크 큐의 첫 번째 태스크를 꺼내와 실행한다.
참고콜백 예시
'IT & 개발 > 웹키워드' 카테고리의 다른 글
[웹키워드#6] MEAN Stack (MongoDB, Express, AngularJS, node.js) (0) | 2016.12.29 |
---|---|
[웹키워드#5] Framework (Framework7, Spring) (0) | 2016.12.28 |
[웹키워드#4] MVC, MVP, MVVM (0) | 2016.12.28 |
[웹키워드#2] Javascript, JQuery, DOM Parser (0) | 2016.12.27 |
[웹키워드#1] HTML, CSS, SASS, SCSS (0) | 2016.12.26 |