Node.js 란?
: Chrome V8 JavaScript 엔진으로 빌드된 Javascript 런타임.
서버
: 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말함
노드는 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행 할 수 있음.
노드의 특성
1. 자바스크립트 런타임
쉽게 말하면 자바스크립트 실행기로 이해 할 수 있다. 기존에는 자바스크립트를 웹 브라우저 위에서만 실행 할 수 있었음.
V8과 libuv는 C와 C++로 구현되어 있지만 노드가 알아서 연결해주기때문에 노드를 사용 할 때 C와 C++는 몰라도 실행 가능하다.
2. 이벤트 기반
이벤트 기반(event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미함. ex) 클릭, 네트워크 요청 등
이벤트 기반 시스템에서는 특정 이벤트가 발생 할 떄 무엇을 할지 말지 미리 등록을 해야하는데 이를 보통 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다고 표현한다. ex) 클릭 이벤트 리스너에 경고창을 띄우는 콜백 함수를 등록 → 클릭 할때마다 콜백 함수가 적용되어 경고창이 뜨게 되는것!
이벤트 루프 : 이벤트 발생시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당.
노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고도 부름.
백그라운드 : setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라도 봐도 되고, 여러 작업이 동시에 실행된다.
테스크 큐 : 이벤트 발생 후, 백그라운드에서는 데스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냄. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부름. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.
예시) 코드가 실행되는 내부 과정
※ 호출 스택에 함수들이 너무 많이 들어 있으면 3초가 지난 후에도 run 함수가 실행되지 않을 수 있음.
3. 논 블로킹 I/O
I/O는 Input과 Output을 의미. ex) 파일 시스템 접근(파일 읽기, 파일 쓰기, 폴더 만들기 등)이나 네트워크를 통한 요청 작업 등
논 블로킹 : 이전 작업이 완료 될때까지 대기하지 않고 다음 작업을 수행함
ex) setTimeout(콜백, 0) → 코드를 논 블로킹으로 만들기 위해 사용하는 기법 중 하나
※ setTimeout(콜백, 0)
밀리초를 0으로 설정했기에 바로 실행되는것으로 생각 할 수 있으나 브라우저와 노드에는 기본적으로 지연 시간이라는게 있기때문에 바로 실행되지 않음. HTML5에서는 보통 4ms, 노드에서는 1ms의 지연시간이 있음.
블로킹 : 이전 작업이 끝나야만 다음 작업을 수행함
노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리하곤하는데, 이에따라 동시에 처리 할 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약 할 수 있다.
4. 싱글 스레드
프로세스 : 운영체제에서 할당하는 작업의 단위. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스. 프로세스 간에는 메모리 등의 자원을 공유하지 않음.
스레드 : 프로세스 내에서 실행되는 흐름의 단위. 프로세느는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있음. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유 할 수 있음.
노드를 실행하면 프로세스 하나가 생성되고, 그 프로세스에서 스레드들이 생성되는데, 내부적으로 스레드 여러개를 생성한다. 그 중 우리가 제어 할 수 있는 스레드는 하나뿐. 그래도 보통 노드가 싱글 스레드라고 여기는 부분이 많다. 멀티 스레드가 싱글 스레드보다 좋아보이지만 꼭 그런것도 아님. I/O 작업을 처리 할 때는 멀티 스레딩보다 멀티 프로세싱이 효율적이기 때문에 노드는 멀티 프로세싱을 주로 많이 한다.
멀티 스레딩 | 멀티 프로세싱 |
하나의 프로세스 안에서 여러 개의 스레드 사용 | 여러 개의 프로세스 사용 |
CPU 작업이 많을 때 사용 | I/O 요청이 많을 때 사용 |
프로그래밍이 어려움 | 프로그래밍이 비교적 쉬움 |
서버로서의 노드
노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 사용하므로 노드 서버 또한 동일한 모델일 수밖에 없음.
노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 적합. 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기때문. 실시간 채팅 어플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용. 멀티 스레드에서는 속도도 느리기 때문에 이미지나 비디오 처리. 또는 대규모 데이터 처리 등 CPU를 많이 사용하는 작업을 위한 서버로는 적합하지 않음.
그럼에도 불구하고 하고싶다면? → AWS Lambda 혹은 Google Cloud Functions 같은 서비스에서 CPU 많이 사용하는 작업을 처리하기떄문에 고려를 해봐야함.
장 점 | 단 점 |
멀티 스레드 방식에 비해 적은 컴퓨터 자웢 사용 | 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용 |
I/O 작업이 많은 서버로 적합 | CPU 작업이 많은 서버로는 부적합 |
멀티 스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리가 필요함 |
웹 서버가 내장되어 있음 | 서버 규모가 커졌을 때 서버를 관리하기 어려움 |
자바스크립트를 사용함 | 어중간한 성능 |
JSON 형식과 쉽게 호환됨 |
서버 외의 노드
노드는 자바스크립트 런타임으므로 용도가 서버에만 한정되지 않음. 사용 범위가 증가함에 따라 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되며, 노드 기반으로 돌아가는 대표적인 웹 프레임워크로는 앵귤러(Angular), 리액트(React), 뷰(Vue) 등이 있음.
참 조 : Node.js 교과서(개정 2판)
'node.js' 카테고리의 다른 글
[Node.js] #6 익스프레스 웹 서버 만들기 (0) | 2021.11.15 |
---|---|
[Node.js] #5 패키지매니저 (0) | 2021.11.15 |
[Node.js] #4 http 모듈로 서버 만들기(2) (0) | 2021.11.12 |
[Node.js] #3 http 모듈로 서버 만들기(1) (0) | 2021.11.12 |
[Node.js] #2노드의 기능 (1) | 2021.11.11 |