Node.js란
최상단
Node.js core Library : 파일 입출력, 쓰고 저장할때 사용하는 fs 호환의 라이브러리나 운영체제 관련된 os, 여러가지 프로세스 쓰레드 관리의 코어라이브러리?
Node.js Bindings : 최하단의 v8, libuv 는 c 와 c++로 사용되기 때문에 js로 사용할 수 없으므로 bindings가 자바스크립트로 받은 언어를 c 와 c++로 사용할 수 있게 함
최하단 ; c 와 c++로 구현되있음
V8 Engine : 자바스크립트를 사용해서 실제로 실행시 해당결과 보여줌 (크롬사용시 크롬내부에서 자바 스크립트 해석, 결과값 출력 담당)
libuv :하나의 라이브러리 ; (비동기 i/o) 하나의 프로그램 실행시 위에서 밑으로 실행되어야 하지만 만약 파일 입출력시 파일 불러들어야 할 때 비동기적으로 작업처리 도와줌 => 노드사용시 파일을 읽거나 쓸 때에 멈추지 않고 진행하게 함
나의 결론 : 동기로 사용 => 하나 수정할 때 모두가 멈춤
비동기로 사용 => 하나 수정해도 수정안하는 나머지는 그대로 진행함
Node.js = js를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경
node.js 특성 : 1. 논 블로킹 I/O, 2. 싱글 스레드, 3. 호출스택, 4. 이벤트 루프
I/O : input입력, output출력 => 파일 저장, 불러오는 것을 I/O처리 한다 라고 함
1. 블로킹 I/O : 한 번에 하나의 작업만 처리함 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게 제어권 넘기지 않음
논 블로킹 I/O : 시스템 호출이 완료되길 기다리지않고 바로 다음 작업으로 넘어가는 방식. 파일 읽는 동안에도 동시에 연산하는 것처럼 다른 작업 수행가능
- 블로킹, 논블로킹 그리고 동기와 비동기
<그럼 블로킹 I/O은 동기처리, 논 블로킹 I/O은 비동기처리?>
AI에게 물어본 결과
동기 프로그래밍 방식에 블로킹 I/O이 포함되어 있음. 그 외에도,
동기프로그래밍에는 작업순서 보장, 단일 스레드 실행, 간단한 제어 흐름, 공유자원 접근 제어 용이, 메모리 관리 용이가 있음, 재진입 코드 필요없음
단점 : 동시성이 낮고 응답성이 떨어짐
비동기 프로그래밍 : 논 블로킹 I/O 외에도 작업분리, 이벤트 기반 프로그래밍, 응답성 향상, 확장성, 콜백 함수, 프로미스 => 효율적이고 확장 가능한 시스템 구축할 수 있음
단점 : 코드의 복잡성 증가, 콜백지옥, 에러처리 어려움, 병목현상 발생 가능성, 동기화이슈
2. 싱글스레드 : 스레드 하나 사용하는 것 이며 동시에 하나의 작업만을 처리할 수 있음
스레드란? 프로그램 동작시 CPU 또는 프로세서를 사용하는 단위. 여러 스레드로 활용하면 동시에 처리 가능하지만 복잡성 증가, 리로스를 많이 소모하는 문제생김
멀티 스레드에서는 쉐어메모리를 어떻게 관리하냐가 중요함.
싱글 스레드는 a->b->c순으로 순차적으로 실행. 공유하는 메모리가 없으므로 개발 시 편리하지만 연산속도에는 문제있음
일반적으로 1개 프로그램은 1개의 스레드 사용할 수 있음 (하지만 1개 프로그램에서 여러개 스레드를 사용할 수 있다면 연산할 수 있는 시간을 단축시킬 수 있음)
Node.js가 싱글스레드를 고집하는 이유?
싱글스레드 : 스레드 생성관 관리에 드는 부담을 줄이며, 컴퓨팅 리소스를 효율적으로 사용 또한, 멀티 스레드가 가지고 있는 동시접근문제인 Race condition문제를 방지함
싱글스레드의 집중적 작업에 적합하지 않는 등의 싱글스레드약점을 극복하기 위해 Node.js 는 추가 스레드를 생성하는 방법들을 제공합니다만! 기본적으로 Node.js의 철학은 싱글 스레드 방식에 기반하고 있음을 기억
3. 호출스택 (call stack) : 함수의 실행 순서를 추적 하는 자료구조
자바스크립트는 코드를 실행하면서 호출스택에 함수를 추가하고 함수가 완료되면 호출 스택에서 제거
; 이는 비동기 작업에서 문제가 되는데, 특히 네트워크 요청과 같이 시간이 많이 걸리는 작업을 기다리는동안 JavaScript는 다른 어떠한 작업도 처리할 수 없게 됩니다. 이 문제를 해결하기 위해 JavaScript는 이벤트 루프(Event Loop)와 이벤트 큐 (Event Queue)를 사용
4. 이벤트 루프 : 면접때에도 많이 나옴.
: 자바스크립트가 비동기적으로 프로그래밍 할 수 있도록 함
: 여러 이벤트들과 같은 비동기 작업들을 모아서 관리, 어떤 순서대로 실행해야하는지 도와주는 도구
; 자바스크립트 파일 만들기(구성 실행등) -> 호출스택이라고 하는 콜 스택에 저장되는데 콜스택에 들어가지 않고 비동기적인 작업처리가 필요한 경우 libuv 안에 있는 이벤트 루프가 이벤트 큐에 넣어줌.(여기에 해당하는 조건들: 파일이 전부 읽어졌을 때, 1초 뒤 수행, 등의 함수가 이벤트 큐에 있음) 이벤트 루프가 실행되며 조건이 완료된 함수가 있는지 계속 확인 .
- 호출 스택이 비어있고, 이벤트 큐에 작업이 있다면, 이벤트 큐의 작업을 호출 스택으로 이동하는 역할을 담당합니다.
- 이벤트 루프를 활용한다면, 자바스크립트는 시간이 오래 걸리는 작업을 이벤트 큐에 넣어 비동기적으로 처리하고, 그 동안 호출 스택에서 다른 작업들을 계속 처리할 수 있습니다.
참고자료 : https://www.korecmblog.com/blog/node-js-event-loop
예시 function firstFunction() {
console.log('firstFunction 입니다.');
secondFunction();
}
function secondFunction() {
// 2 초간 기다린다.
setTimeout(function () {
console.log('secondFunction 입니다.');
}, 2000);
}
firstFunction();
console.log('전역 코드 실행 중!');
// print: firstFunction 입니다.
// print: 전역 코드 실행 중!
/** 2 초간 기다린다. **/
// print: secondFunction 입니다.
위 예제 코드에서 firstFunction은 호출 스택에 **추가(push)**되고, 실행되며 ‘*firstFunction 입니다.’*를 콘솔에 출력하고 secondFunction을 호출 합니다. 그 다음 secondFunction은 호출 스택에 추가되고, setTimeout 함수를 실행합니다.
setTimeout은 비동기 함수이므로, JavaScript는 이 작업을 이벤트 큐에 넣고 secondFunction을 호출 스택에서 **제거(pop)**합니다. 그 다음 firstFunction도 호출 스택에서 제거하고, ‘전역 코드 실행 중!’을 콘솔에 출력합니다.
2초가 지난 후, ‘secondFunction 입니다.’를 출력하는 작업이 이벤트 큐에서 호출 스택으로 이동하고 실행됩니다. 이때 호출 스택은 비어 있기 때문에 이벤트 루프가 이 작업을 호출 스택으로 이동시킬 수 있었습니다. 이처럼, 이벤트 루프와 이벤트 큐를 사용함으로써 JavaScript는 비동기 작업을 처리할 수 있게된 것입니다.
IDE : 통합개발환경. 여러가지의 개발자 툴을 결합하여 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리할 수 있는 환경을 제공하는 소프트 웨어
REPL환경 -
- 일반적으로 "REPL 환경" 이라 함은 아래와 같이 설명할 수 있습니다.
- 입력 받은 코드를 **읽어(Read)**들여 메모리에 저장하고, **평가(Evaluate)**된 값을 **출력(Print)**합니다. 특정 신호를 입력받기 전까지 위의 과정을 **반복(Loop)**합니다.
- 쉽게 말하자면, 사용자가 입력한 코드의 결과를 즉시 확인할 수 있기 때문에 간단한 코드 문법을 테스트하는데 아주 적합한 개발 환경으로 볼 수 있습니다.
- 예를 들어, Node.js REPL 환경에서 console.log("Hello World")와 같은 코드를 입력하면 즉시 “Hello World”라는 결과를 출력받을 수 있습니다.
- Node.js는 REPL 환경을 제공하고 있으며, 우리는 그것을 쉽게 이용할 수 있습니다.
웹 브라우저의 콘솔과의 차이는?
웹 브라우저의 개발자 도구 콘솔도 REPL 환경이지만 Node.js REPL 환경과는 약간의 차이가 있습니다. 웹 브라우저의 콘솔은 Node.js가 제공하는 여러 API와 라이브러리를 사용할 수 없지만, 대신 웹 브라우저의 API를 이용하여 **DOM(Document Object Model)**을 제어할 수 있습니다.
즉, 웹 브라우저에서 사용자가 직접 HTML 요소를 생성하거나 변경하는 등의 작업을 할 수 있습니다.
Node.js REPL 환경은 백엔드 서버(Server)의 코드를 테스트하거나 실험해보는 데에 더 적합하고, 웹 브라우저 콘솔은 클라이언트(Client)의 코드를 작성하거나 테스트 하는데에 더 적합
REPL 환경 이용방법 : windows 커맨드 또는 git bash dufrh node입력후 엔터 => 노드의 repl환경으로 진입
; 나가기 하려면 ctrl c 두번 또는 ctrl d
vscode - 터미널 - node입력하면 콘솔 사용가능
깃(Git)은 프로그래밍 파일의 변경 사항을 추적하고, 여러 개발자들 간의 공동 작업을 조율하는 것을 도와주는 분산 버전 관리 시스템
: 버전관리, 협업도구로써의 기능