Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다.
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻.
우선 자바스크립트라는 언어를 알아야한다.
JavaScript 란? 자바스크립트는 HTML에 종속되어있는 언어다. HTML 조작과 변경을 위해 사용한다.
HTML은 웹페이지에 글쓰고, 그림을 넣는 언어다. (정적언어)
💡HTML은 자바스크립트가 조작한다면 자바스크립트 해석은 브라우저가 한다.
브라우저에는 자바스크립트 해석 엔진이 있고, 브라우저 종류에 따라 쓰는 엔진이 다르다.
기존에는 브라우저에서만 자바스크립트를 실행할 수 있었지만 구글이 출시한 v8 엔진을 기반으로 노트 프로젝트가 시작돼 Node.js(v8)이 등장했다.
Node.js는 브라우저 말고도 다른 환경에서 자바스크립트를 사용할 수 있게 해준다.
요청이 많거나, 오래걸리는 요청이 있어도 멈추거나 요청 대기시간이 발생하지 않는다.
🎇이벤트 기반
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
이런 Non-blocking 덕분에 채팅이나 sns에서 자주 사용된다.
이벤트가 발생할 때 지정해준 작업을 수행, 특정이벤트가 무엇을 할 지 미리 등록해두고 이벤트 리스너에 콜백함수를 등록한다.
후에 이벤트가 발생하면 콕백함수를 호출하며 이벤트가 끝난 후 노드는 다음 이벤트가 발생할때까지 대기.
🎇이벤트 루프
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수르 호출할지를 이벤트 루프가 판단.
이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하무로 루프라고 부른다.
✨Non-blocking
이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미.
파일 시스템 접근, 네트워크를 통한 요청 작업은 I/O의 일종이며 이러한 작업을 할 때 노드는 논 브로킹 방식으로 처리한다.
(반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 수행하는 것을 말한다.)
Node.js는 코드가 매우 짧고 쉬워서 빠른 개발 가능(Pivoting이 잘됨)
정리하자면, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합해서,
실시간 채팅이나 주식 차트 등에 노드를 많이 사용한다
코드가 CPU 연산을 많이 요구하면 스레드 하나에서 처리하는 Node.js가 감당하기 어렵다.
자바스크립트 코드는 노드가 싱글 스레드 기반이기 때문에 동시에 실행될 수 없다.
이미지나 비디오 처리, 대규모 데이터 처리 같이 CPU 를 많이 사용하는 작업을 위한 서버로는 권장되지 않는다.
*프로세스 : 운영체제에서 할당하는 작업의 단위. (노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스)
프로세스 간에는 메모리 등의 자원을 공유하지 않음.
*스레드: 스레드는 프로세스 내에서 실행되는 흐름의 단위. 스레드들은 부모 프로세스의 자원을 공유한다.
같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
Node는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어온 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행(유저 프로세스의 작업을 중단시키지 않는 방식)한다.
(리눅스는 CPU의 기본적인 I/O모델로 모든 소켓 통신은 기본 blocking으로 동작)
🎇Non-blocking 문제인 반복적인 시스템 콜 호출을 해결하기 위해 I/O 이벤트 통지 모델이 도입되었다.
이벤트란 수신 버퍼나 출력 버퍼에 데이터를 처리하는 동작을 의미한다.
I/O 이벤트 통지방식에는 동기/비동기 모델로 분류,I/O 작업 상황(결과) 반환 방식에 따라 동기, 비동기 방식으로 분류된다.
I/O 작업이 진행되는 동안 유저 프로세스는 결과를 기다렸다가 이벤트(결과)를 직접 처리하는 방식이다.
결국 notify를 유저 프로세스가 담당하여 주체적으로 진행하며, 커널은 유저 프로세스의 요청에 수동적으로 응답
I/O 작업이 진행되는 동안 유저 프로세스는 관심이 없다. 그저 자신의 일을 하다가 이벤트 핸들러에 의해 알림이 오면 처리하는 방식이다.
결국 notify를 커널이 담당하여 주체적으로 진행하며, 유저 프로세스는 수동적인 입장에서 통지가 오면 그때 I/O 처리를 한다.
(이벤트 핸들러, callback)에 의해 운영체제에서 처리 결과 통지받는다.
노드는 CPU부하가 큰 작업에는 적합하지 않다.
개수는 많지만 크기가 작은 데이터를 실시간으로 주고 받는 쪽에 적합하다.
-멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용한다.
-I/O작업이 많은 서버로 적합하다. (카카오톡과 같은 메신저)
-웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없다.
-자바스크립트를 사용해 JSON 형식과 쉽게 호환된다.
I/O는 입력(Input)/출력(Output)의 약자로, 컴퓨터 및 주변장치에 대하여 데이터를 전송하는 프로그램, 운영 혹은 장치를 일컫다. 대개의 경우 입력에 함께 출력이 발생하게 된다. 단, 키보드와 마우스처럼 입력을 위한 기기, 프린터처럼 출력에만 사용되는 기기도 있다. 프로세서와 메모리, 확장 슬롯, 마더보드에서 일어나는 데이터 전송도 I/O라고 일컬어진다.
([출처]https://velog.io/@remon/%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D-Node.js%EB%9E%80)
([출처]https://velog.io/@kimkevin90/Nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0Nodejs-%EB%9E%80)
([출처]https://junshock5.tistory.com/148)