[Node.js] 노드 핵심개념 이해하기
Node.js란?
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 javascript 런타임이다.
1. 서버
네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 혹은 프로그램을 말한다. 🔗HTTP와 웹 서버
2. 자바스크립트 런타임
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다. 노드는 자바스크립트를 실행하는 실행기이다. 기존에는 자바스크립트 프로그램을 웹 브라우저 위에서 실행했는데, 실행속도가 느려 호응을 얻지 못했으나 구글이 V8 엔진을 사용하여 크롬을 출시하면서 속도문제가 해결되면서 노드 프로젝트가 시작됐다.
노드는 V8과 libuv라는 라이브러리를 사용하는데, libuv는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
3. 이벤트 기반
이벤트 기반(event-driven)이란 이벤트가 발생할 때 지정한 작업을 수행하는 방식을 말한다. (ex) 클릭 등) 이벤트 기반 시스템에서는 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다. 노드 또한 이벤트 기반으로 동작하므로 이벤트 루프에 대한 개념을 다져야한다.
4. 이벤트 루프
이벤트 발생 시 호출할 콜백 함수들을 관리하고 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 반복하므로 루프라고 불린다. 이벤트 루프의 실행과정 상세에 대해서는 추후 따로 포스팅 하는게 좋을 것 같아 간단히 설명만 정리한다.
- 호출스택(call stack) : 🔗호출스택
- 백그라운드 : setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 공간. 여러 작업이 동시에 실행될 수 있다.
- 태스크 큐 : 이벤트 발생 후, 백그라운드->태스크 큐로 콜백함수를 보낸다.
5. 논 블로킹 I/O
일반적으로 자바스크립트 코드는 동시에 실행될 수 없으나 I/O(입출력) 작업의 경우는 동시에 처리될 수 있다. 논 블로킹이란, 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 뜻한다. (동시에 처리될 수 있는 작업임을 전제함.)
setTimeout(callback, 0)
코드를 논 블로킹으로 만드는 기법 중 하나. setTimeout에서 설정된 callback 함수는 백그라운드로 보내져 태스트 큐로 보내지므로 실행 순서를 바꿔줄 수 있다. 밀리초를 0 으로 설정해도 바로 실행되는 것이 아니라, HTML5 브라우저에서는 4ms, 노드에서는 1ms의 지연시간이 있다.
6. 싱글 스레드
- 프로세스 : 운영체제에서 할당하는 작업의 단위
- 스레드 : 프로세스 내에서 실행되는 흐름의 단위.
노드는 직접 제어할 수 있는 스레드가 하나여서 싱글 스레드라고 한다.
싱글 스레드로 동작하지 않는 경우
- 스레드 풀(Thread Pool) : 특정 동작을 수행할 때 스스로 사용 (ex.암호화, 파일출력, 압축)
- 워커 스레드(Worker Thread) : 연산이 많은 작업의 경우 워커 스레드를 사용하여 직접 다수의 스레드를 다룰 수 있다.
멀티 스레딩과 멀티 프로세싱
멀티 스레딩 | 멀티 프로세싱 |
---|---|
하나의 프로세스 안에서 여러개의 스레드 사용 | 여러개의 프로세스 사용 |
CPU 작업이 많을 때 사용 | I/O 요청이 많을 때 사용 |
프로그래밍이 어려움 | 프로그래밍이 비교적 쉬움 |
멀티 프로세싱이 가능하게하는 방법과 멀티스레딩을 하는 방법은 추후 다루기로 한다.
장단점
장점
- 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
- I/O 작업이 많은 서버로 적합
- 멀티 스레스 방식보다 프로그래밍이 쉬움
- 웹 서버 내장
- 자바스크립트 사용 - 하나의 언어로 웹 사이트 개발
- JSON과 호환이 용이
단점
- 기본적으로 싱글 스레드라 CPU 코어를 사용하기 떄문에 CPU 작업이 많은 서버로는 부적합
- 하나 뿐인 스레드가 멈추지 않도록 관리가 필요
- 서버 규모가 커졌을 때 관리가 어려움
- 어중간한 성능
Comments