node.js

[Node.js] #1 node.js 첫 시작. 노드(node.js) 란?

로춘남 2021. 11. 11. 18:13
728x90


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판)

728x90