[NodeJS] Node.js란 무엇인가?
Node.js란?
- Javascript는 브라우저에 내장되어 있다. Node.js는 Javascript를 브라우저 밖으로 가져와서 유저의 컴퓨터에서도 Javascript가 실행되도록 한다. 브라우저 밖의 Javascript!
- 브라우저에 종속되어 있지 않기 때문에 Javascript를 이용하여 모바일 앱(React Native), 웹 앱(Electron) 생성이 가능하다.
언제 Node.js를 사용해야 할까?
- 백엔드, 서버를 빌드해야 할 경우
- 프론트엔드와 백엔드를 모두 javascript로 만들고 싶을 때
- 많은 데이터를 다뤄야 할 때(알림, 실시간 처리 등)
언제 Django(Python) / Laravel(PHP)을 사용해야 할까?
- Data Science, 이미지 압축, 비디오 인코딩/디코딩 등 하드웨어를 사용할 때(메모리, 램 등)
Node.js의 특징
이벤트 기반
- 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미.(클릭, 네트워크 요청 등…)
- 이벤트 기반 시스템은 특정 이벤트가 발생할 때 어떤 일을 할지 미리 등록해둬야 하는데 이것을 이벤트 리스너(Event Listener)에 콜백(callback) 함수를 등록한다고 표현함.
1
2
3
4
5
6
import express from 'express';
const app = express();
const PORT = 4000;
const handleListening = (req, res) => res.send('This is callback');
app.listen(PORT, handleListening);
// ↑ 이벤트 리스너 ↑ 콜백
논블로킹 I/O (Input/Output)
- 오래 걸리는 함수를 일종의 백그라운드로 보내고, 다음 코드가 먼저 실행되게 하고 백그라운드의 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기다리는 방식.
- 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행한다.
1
2
3
4
5
6
7
8
9
10
11
12
// Blocking (뜻: 중단)
import fs from 'fs';
const data = fs.readFileSync('secret.md');
// 파일을 읽을 때까지 블로킹. 블로킹 메소드는 동기로 실행.
// 오류가 발생하면 반드시 처리해줘야 함. 그렇지 않으면 프로세스 죽음.
// Non-Blocking
import fs from 'fs';
fs.readFile('secret.md', (err, data) => {
if (err) throw err;
});
// 논블로킹 메서드는 비동기로 실행. 오류가 생겼을 때 에러를 던질지 아닐지 작성자가 선택할 수 있음.
- 블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간동안 처리할 수 있음.
싱글 스레드
- 노드는 싱글 스레드기 때문에 주어진 작업을 혼자 처리해야 함. 멀티 스레드의 경우, 여러 개의 스레드가 일을 나눠서 처리할 수 있음.
- 노드에서 논블로킹이 중요한 이유. 한 번에 한 가지 일만 처리하기 때문에 블로킹이 발생하면 다음 일을 처리 못 함.