-
Node.js란?Background 2022. 5. 14. 21:04
Node.js의 개념 및 특징에 대해 정리하였습니다.
< Node.js란? >
Node.js 공식문서: Node.js는 Chrome V8 JavaScript 엔진으로 빈드된 JavaScript 런타임입니다. Node.js는 이벤트 기반, 논 블로킹 I/모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.
- 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻합니다.
- 공식문서를에 적혀있는 말을 쉽게 풀어보자면 Node.js는 브라우저에서만 작동하던 JavaScript를 브라우저 밖에서도 작동할 수 있게 해주는 도구입니다. 보통 백엔드에서 서버구축을 할 때 많이 사용합니다.
- Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징입니다.
< 싱글스레드 >
Node.js는 하나의 스레드로 동작하지만 I/O 작업이 발생한 경우 이를 비동기적으로 처리할 수 있습니다. 분명 하나의 스레드는 하나의 실행 흐름만을 가지고 있고 파일 읽기와 같이 기다려야 하는 작업을 실행하면 그 작업이 끝나기 전에는 아무것도 할 수 없어야만 합니다. 하지만 Node.js는 하나의 스레드만으로 여러 비동기 작업들을 블로킹 없이 수행할 수 있고 그 기반에는 이벤트 루프가 있기 때문에 가능합니다.
- 프로세스 : 운영체제에서 할당하는 작업의 단위입니다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스입니다. 프로세스 간에는 메모리 등의 자원을 공유하지 않습니다.
- 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있습니다. 스레드들은 부모 프로세스의 자원을 공유합니다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있습니다.
- 동기: 이전 작업이 완료된 후에 다음 작업 수행
- 비동기: 이전 작업의 완료 여부와 관계없이 다음 작업 수행
< 이벤트루프 >
Node.js는 V8 엔진과 더불어 libuv라는 라이브러리를 사용합니다. libuv 라이브러리는 노드의 특성인 Non-blocking I/O와 단일 스레드 이벤트 루프 모델을 구현하고 있습니다.
이벤트 기반(Event-Driven)이란 이벤트가 발생했을 때 지정해둔 작업을 수행하는 방식을 말합니다.Example: 버튼 클릭 시 배경색 변경
const btn = document.querySelector('button'); function random(number) { return Math.floor(Math.random() * (number+1)); } btn.onclick = function() { const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; document.body.style.backgroundColor = rndCol; }
: '버튼 클릭' 이라는 이벤트가 발생했을 때 random이라는 함수(이벤트 리스너) 실행
이벤트 루프(Event Loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 판단합니다.
노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부릅니다.
< Non-blocking >
이벤트 루프를 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다. 동기적으로 실행될 수 없는 작업은 비동기적으로 처리해야 하는데(파일 시스텝 접근, 네트워크를 통한 요청 등) 이러한 작업을 막힘(블로킹) 없이 없이 부드럽게 처리하기 때문에 Non-blocking 특성을 가졌다고 말합니다.
이게 가능한 이유는 이벤트 발생 시 이벤트 리스너 함수를 바로 실행하는 게 아니라 큐에 요청을 저장해두고 동시에 요청을 처리한 후에 요청이 완료된 순서대로 처리하기 때문에 가능합니다.
< 장단점 >
Node.js는 싱글스레드, Non-blocking 특성을 가지고 있기 때문에 I/O요청이 많이 발생하는(비동기 작업을 많이 필요로 하는) 웹 애플리케이션을 개발할 경우 Node.js를 사용하는 게 좋습니다.
Example: 실시간 채팅 어플, 주식 차트, etc.
하지만 싱글스레드로 모든 작업을 처리하기 때문에 CPU에 많은 부담이 되는 작업인 경우 Node.js는 적합하지 않습니다.'Background' 카테고리의 다른 글
테스트 코드(Test Code) (0) 2024.02.28 let, var, const의 차이점 & 호이스팅(Hoisting) (0) 2022.04.29 HTTPS (0) 2022.03.14 Project Workflow (1) 2022.02.22 HTTP (0) 2022.02.10