Node는 Chrome V8 Javascript 엔진으로 빌드 된 Javascript Runtime 이다.
* runtime 이란 ? - 프로그램이 구동되는 환경을 말한다. 자바면 자바, 자바스크립트면 자바스크립트, 노드면 노드
1. 탄생배경
예전에는 자바스크립트 런타임이 브라우저 밖에 존재하지 않았다.
하지만 그런 한계를 극복하고 Node.js 가 나왔다.
좀 더 자세한 스토리를 적어보자면...
1990년 Tim Berners lee 가 WEB을 창시했다.
이때의 웹은 정적인 체계의 웹이었다.
Marc Andreessen 에 의해 Netscape 라는 대중적 웹브라우저가 등장하게 되었고,
Brendan Eich 가 JavaScript 를 만들어 웹에 동적인 체계를 탑재하게 되었다.
즉, 사용자와 상호작용이 가능해졌다는 이야기다.
WEB 이라는 울타리 안에 갇혀있던 Javascript 였다.
천대받던 Javascript가 재조명 받게되는 계기가 있었다.
2004 년 Gmail 의 등장이다.
순수한 웹기술 ( HTML, JavaScript 등) 을 통해서 만들었음에도 불구하고 뛰어난 성능을 보인것.
이어서 GMap 도 순수 웹기술로 구축되었고 이 또한 개발자들에게 신선한 충격을 주었다.
이후로 자바스크립트의 성장세는 계속되는데,
2008 년 구글이 Chrome의 성능 향상을 위해 JavaScript Engine을 개발하였다.
그것이 V8이고 이것을 오픈소스로 공개하여 수많은 개발자들을 이끌었다.
그리고 2009 년 Ryan Dal 이 자바스크립트 언어로 구현된 서버사이드 언어 Node.js 를 내보인다.
2. Node 의 특징 및 장점
1. V8 Engine 이다. (갓 구글)
- 구글이 망하지 않는 한 이 엔진은 끊임없이 개선되고 발전할 것이고,
지금도 충분한 성능을 보이고 있지만 추후 더 훌륭한 퍼포먼스를 보일것으로 예상된다.
2. Event - driven 방식
- 사용자가 이벤트를 발생시켰을 때, 즉 입력장치로 데이터를 전송했을 때에만 작동하는 방식이다.
발생한 이벤트에 대해서만 웹서버가 '연결'을 해주기 떄문에 자원을 최소화 할 수 있다.
( 대부분의 웹 서버는 사용자가 이벤트를 발생하기까지를 기다리면서 자원[대기시간 , 메모리] 을 계속 소비하게 된다.
3. non - blocking 패러다임 (비동기방식)
- non blocking I/O (Input/Output - 전처리/후처리) 을 이해하기 위해 우선 Blocking I/O 방식을 설명해야한다.
Blocking I/O 방식 ( 동기식 I/O ) 는 Read/Write 이벤트가 발생하면 이벤트가 끝날때까지 해당 모듈을 점유하게 된다.
즉 다른일을 못하게 된다.
또한 메모리 버퍼에 데이터를 차지하게 되므로 메모리도 소비하게 된다.
요청한 I/O 가 완료될 때 까지 해당 Thread를 '대기모드' 로 전환시켰다가 요청한 I/O 완료 후 유저코드를 실행시킨다.
이런 Blocking 방식의 비효율성을 극복하고자 만들어진 것이 Non-Blocking 방식이다.
I/O 작업을 진행하는 동안 유저 프로세스의 작업을 중단시키지 않는다.
non-Blocking I/O ( 비동기식 I/O) 의 경우 Read/Write 이벤트가 시작하자마자 모듈을 변환시켜 다른 작업을 하도록 준비상태가 된다.
그래서 속도가 동기식보다 빠르고 메모리도 덜 차지하게 된다.
적합한 경우에는 굉장히 빠른 퍼포먼스를 보이고 적재적소에 이 방식을 사용하면 퍼포먼스가 크게 향상할 수 있다.
4. Single Thread
- 양날의 검이다. 장점이라기보단 특징에 가깝다.
적은 양의 자원으로 일을 처리하는 것이 가능하다.
하지만 어느 한곳에 예외상황 및 에러가 발생한다면 애플리케이션 전체에 영향이 가게된다.
5. 클라이언트와 서버에서의 언어가 동일하다. (협업하기에 좋다)
출처 : https://perfectacle.github.io/2017/06/18/what-is-node-js/
'javascript & Node.js' 카테고리의 다른 글
브라우저 의 렌더링 과정 (0) | 2020.10.29 |
---|---|
when use Node.js ? (0) | 2020.09.15 |
WebPack (0) | 2020.06.04 |
Typescript (0) | 2020.05.12 |