node.js는 오픈소스 및 크로스 플랫폼 자바스크립트 런타임(실행) 환경입니다. 기존의 자바스크립트는 script언어로 웹에서밖에 사용이 불가능했는데요. 이때 구글 크롬의 V8엔진을 이용하여 node.js가 탄생하였고, node.js가 탄생하고 난 뒤에 자바스크립트는 웹에서만 국한된 게 아닌 프로그래밍적 언어로도 사용이 가능하게 됐습니다.
Node.js의 특징
특징 | 설명 |
Chrome V8 Javascript 엔진 기반 | V8엔진을 인터프리터[1]로 사용하여 빠른 실행이 가능합니다. 그리고 Javascript 프레임워크가 아니라 런타임 환경[2]입니다. |
단일 스레드[3] | 하나의 스레드가 모든 작업을 수행하기 때문에 리소스 사용량 변화가 많지 않고 대규모 네트워크 프로그램을 개발하기에 적합합니다. |
비동기 I/O (Non-Blocking I/O) 이벤트 기반 | 비동기방식에는 blocking I/O방식과 Non-Blocking I/O방식이 있는데 이중에 Non-Blocking I/O 방식을 사용합니다. 이는 어떤 요청이 발생했을때 그작업에 대한 스레드 실행을 하는데요 이후 작업을 할당 받은 스레드는 작업을 마친 다음에 콜백함수를 실행하여서 이벤트루프로 응답을 보내고 이벤트루프는 클라이언트에게 결과를 보내줍니다. 때문에 동시에 요청이 오더라도 처리가 완료될때까지 기다리지 않아도 되어 서버부하가 적은편에 속합니다. |
방대한 모듈 제공 ( NPM ) | 모듈은 어플리케이션을구성하는 하나의 개별적인 요소를 말하는데 npm이라는 설치 관리자를 통해서 모듈을 설치 및 관리를 할 수있다. |
Node.js의 장점 및 단점
장점
- javascript 언어를 사용하기때문에 다른 언어를 배울 필요 없이 frontend 뿐만 아니라 backend 코드를 작성할 수 있습니다.
- 단일 스레드를 사용하기 떄문에 컴퓨터 자원을 적게 사용하고 멀티스레드보다 방식이 쉽습니다.
- 웹 서버가 내장되어 있습니다.
- Non-Blocking I/O 덕분에 blocking I/O보다 짧은 시간에 더 많은 작업을 처리할 수 있습니다.
단점
- 단일 스레드이기 때문에 해당 스레드에 문제가 발생할 경우 프로그램 전체에 문제가 발생합니다.
- CPU 작업이 많은 서버로는 부적합합니다.
- 비동기 동작시 콜백함수로 구현을 하기때문에 자칫하면 무한 콜백 지옥에 빠질 수 있습니다.
- 서버 규모가 커지면 서버를 관리하는데 어렵습니다.
Node.js로 서버를 만드는 이유
서버를 왜 node.js로 개발하는걸까요? Non-Blocking I/O가 어디에 좋은가요?를 알려주는 예시로 많이 나오는 게 바로 영화예매사이트입니다.
ABC 총 3명의 예매자가 존재합니다. 이때 A는 한장, B는 백장, C는 다섯 장을 구매하려 하는데 일반적인 Blocking I/O의 경우 A가 한 장 구매할 때까지는 문제가 발생하지 않습니다. B가 백장을 구매하면서 문제가 발생하는데요 B가 백장을 구매하는 동안 C는 B구매가 끝날 때까지 아무것도 하지 못합니다.
하지만 이 사이트를 Node.js로 만들면 어떻게 될까요?
똑같이 ABC가 한장 백장 다섯 장을 구매한다고 하면 순서와 상관없이 처리가 끝나면 바로 결과를 가져다주기 때문에 C가 B를 기다리는 일이 없게 됩니다.
이런 강점이 있기 때문에 Node로 서버를 개발하는것입니다.
[1] 인터프리터 : 고급 언어로 작성된 원시코드 명령어들을 한 번에 한 줄씩 읽어 들여서 실행하는 프로그램
[2] 런타임환경 : 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태
[3] 스레드 : 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위
'프로그래밍📚 > node' 카테고리의 다른 글
express-generator 알아보기 (0) | 2023.12.08 |
---|---|
req.body, req.query, req.params (0) | 2023.12.07 |
응답을 통해 정보를 전달하자 - json (0) | 2023.12.06 |
[node] 웹 서버 구동하기 - express (0) | 2023.12.06 |
Node Packaged Manager - NPM (0) | 2023.12.05 |