본문 바로가기

Node.Js

NodeJS의 소개와 특징


Nodejs 란?


Node.js 는 많은 사람들이 언어나 프레임워크 많은 사람들이 프레임워크도 아니다.

Node js는 구글의 Chrome V8엔진 위에서 구현된 자바스크립트를 위한 런타임 환경이다.

런타임 환경이란 프로그램언어가 브라우저에서 프로그래머로서 실행되고 있는 장소를 말한다.

javascript와 비교하여 정리하자면 javascript 는 브라우저에서 작동하는 프로그래밍 언어라고 할 수 있고

Nodejs는 javascript가 브라우저 동작 할 수 있도록 도와주는 환경이라고 할 수 있다.

Nodejs가 서버사이드 언어라고 보여지는 이유는 Nodejs가 javascript로 서버를 구현 할 수 있도록 환경을 구성 해주기 때문이다.

Nodejs는 여러 프레임워크와 라이브러리가 있어 다양한 환경을 구성 할 수 있도록 해주는 플랫폼이기도 하다.

그럼 Nodejs의 특징에 대해서 알아보자.


Nodejs의 특징


1. V8 엔진

1. 빠른 프로퍼티 접근(Fast Property Access)

모든 JavaScript Engine이 프로퍼티를 저장하기 위해서 사전식 데이터 구조(Dicitionary-like data structure)를 이용하는데 반해, V8은 hidden class를 이용한다. 이 둘의 차이는 단순하게 이야기해서 Hashing과 Pointer의 차이라고 할 수 있다.

V8은 객체에 새로운 프로퍼티를 추가할 때 hidden class를 생성하고, hidden class에 프로퍼티의 정적인 위치(offset)를 저장함으로써 실제 데이터가 저장되어 이는 위치에 대한 Pointer를 제공한다. 이로 인해 동적 룩업이 필요 없어지고, 고전적인 클래스 기반의 최적화를 할 수 있다.

매번 프로퍼티를 추가할 때마다 새로운 hidden class를 생성하는 방식은 상당히 비효율적이지만, 다음 번에 같은 객체를 생성할 때 이전에 생성했던 hidden class를 재사용함으로써 객체 생성 비용을 줄일 수 있다.


2. 동적인 기계어 코드 생성(Dynamic Machine code Generation) 

V8은 JavaScript 소스 코드를 처음 컴파일 할 때 bytecode가 아닌 기계어 코드로 직접 변환한다. 따라서 중간에 bytecode를 기계어로 변환해 줄 인터프리터가 필요 없다. 기계어로 컴파일 할 때는 인라인 캐싱 코드(Inline caching code) 기법을 이용한다.


3. 효율적인 가비지 콜렉션(Efficient Garbage Collection)

V8은 Garbage Collection Cycle을 수행할 때 프로그램 실행을 멈추는데, 이때 객체의 heap 부분만 처리함으로써 프로그램이 멈추는 영향을 최소화한다. 또한 객체와 포인터가 메모리상에 어디에 위치해 있는지 정확히 관리하여 메모리 누수를 피한다.


2. 논블로킹 비동기 실행

일반적인 동기 모델은 특정 라인의 코드가 있다고 가정하면 그 이전 코드들의 연산이 다 끝날 때까지 기다려야 한다.

즉 이전 이벤트가 끝나지 않으면 메모리를 계속적으로 점유 하고 있고 완료 될때 까지 대기 상태가 된다.

하지만 비동기 모델에서는 조금 다르게 동작한다. 비동기적으로 처리하는 요청과 결과 처리가 동시에 일어나지 않는다.

그러므로 이벤트가 중단 되지 않고 계속적으로 실행된다. 그리고 이전 코드의 연산은 결과가 나오면 그때 리턴 된다.

밑에는 이해를 돕기 위한 예시 코드다


위에 코드를 실행 했을 경우 결과가 어떻게 나올거 같은가?

결과는 

foo

bar

node

test 

nav

이렇다 . 그러나 동기형 프로그래밍 언어에서는 결과가

foo

bar

nav

node

test

이 순서 이다.  


3. 싱글스레드!

nodejs 요청들이 모두 같은 스레드에서 실행된다.

클라이언트오는 요청들을 하나의 스레드에서 받아드리고 사실 내부적으로는 멀티스레드로 작업이 된다.

자세한 이해는 이 링크를 참조 바란다.


4. 서버도 구현 가능!

나는 개인적으로 앞으로는 javascript의 영향력이 날로 커질거라고 생각한다.

javascript는 이미 많은 영역에서 영향력을 가지고 있다.

그래서 나올 수 있는 장점이다.

클라이언트, 서버사이드 영역을 javasript로 개발 할 수 있다.

이는 프로젝트의 개발 단계에서나 유지보수 단계에서나 시간, 인력, 효율 등에서 큰 이점이 될 수 있다.





'Node.Js' 카테고리의 다른 글

Node 설치 하기  (0) 2017.11.13