[Node.js 강의 정리] Call stack, Event Loop, EventEmitter, child_process, cluster, worker_threads 등에 관하여

2025. 6. 19. 23:00·Study/Node.js

얄코님의 '얄코의 Node.js (Korean ver.)' 강의를 듣고 정리한 내용입니다.

강의 링크: https://www.inflearn.com/course/%EC%96%84%EC%BD%94-node-js?srsltid=AfmBOopKCXPw7NK1HS79aeI2BufjFmy-iOHOM9eHCl2q_BVo1UNRMURr

 

얄코의 Node.js (Korean ver.) 강의 | 얄팍한 코딩사전 - 인프런

얄팍한 코딩사전 | , 🇰🇷 This course is designed for Korean-speaking learners. If you speak English, Japanese, Vietnamese, or any other language, please take t

www.inflearn.com

 


1. process

Node.js에서 기본으로 제공되는 전역 객체, 현재 실행 중인 Node.js 프로세스의 정보와 제어 제공

pid: 현재 실행 중인 Node.js 프로세스의 ID 반환

ppid: 현재 프로세스를 실행시킨 부모 프로세스의 ID 반환

version: 현재 사용 중인 Node.js의 버전 반환

version.v8: Node.js가 사용하는 V8 JavaScript 엔진의 버전 반환

arch: 현재 프로세스가 실행되는 CPU 아키텍처를 문자열로 반환

platform: Node.js가 실행되는 운영체제 반환

execPath: Node.js 실행 파일의 절대 경로 반환

cwd: 현재 작업 디렉토리의 절대 경로 반환

cpuUsage: 현재 프로세스의 CPU 사용량을 마이크로초 단위로 반환

memoryUsage: 현재 프로세스의 메모리 사용량을 바이트 단위로 반환


2. 환경변수(Environment Variable)

컴퓨터의 전체 시스템이나 특정 프로세스에, 실행중인 프로그램이 가져다 쓸 수 있는 값

process의 env 속성: 현재 실행 중인 Node.js 프로세스가 접근할 수 있는 환경 변수를 담고 있는 객체

→ 환경 변수의 이름을 키로 삼아 접근해서 값을 가져옴

터미널의 명령어로 설정할 수 있다

NODE_ENV = development PORT=3000 DB_HOST=localhost node index.js

위 명령어로는 터미널 세션에서 유지되지 않음

환경변수들이 해당 터미널 세션에서 유지되도록 하려면 export 등을 통해 여러 줄로 작성한 명령을 입력하면 된다

export NODE_ENV = development
export PORT = 3000
export DB_HOST = localhost
node index.js

→ 터미널 세션 한정 유지

환경변수를 프로젝트별로 영구 저장하려면 .env 파일을 만들어서 저장하자

dotenv로 불러올 수 있음(dotenv는 외부 라이브러리)

Node.js 실무에서는 관례적으로 NODE_ENV라는 환경변수가 사용됨

터미널에서 ‘node —env-file=.env index.js를 불러오면 dotenv 패키지 없이도 환경변수를 가져올 수 있음(Node.js 20.6 버전 이후)


2. global

브라우저 환경에서 스크립트의 최상위 스코프에 위치한 ‘this’는 전역 객체인 ‘window’를 가리킴

‘window’ → DOM, JavaScript 전역 변수, 브라우저 API에 접근할 수 있는 인터페이스를 제공하는 객체

globalThis → 환경에 상관없이 전역 객체를 가리키는 표준화된 속성

CommonJS 환경에서 최상위 ‘this’는 전역 객체 ‘global’을 가르키지 않음

→ module.exports 객체를 가리킴

→ 그 대신 globalThis가 global을 가리킴

→ CommonJS에서 var x를 선언하면, 모듈 스코프에 존재

CommonJS 환경에서 ‘function’ 키워드를 사용하는 일반 함수의 내부에서는 ‘this’가 ‘global’을 가리킴

화살표 함수는 ‘this’를 렉시컬 스코프에서 가져옴(해당 함수가 선언된 위치의 this를 그대로 사용)

ES Module 환경에서 최상위 스코프 ‘this’는 ‘undefined’

ES Module에서는 모듈이 캡슐화된 독립 스코프를 가지며, ‘this’가 특정 객체를 참조하지 않음

ES Module에서도 globalThis가 global을 가리킴

ES Module은 기본적으로 Strict Mode로 실행

→ Strict Mode에서 일반 함수를 일반 호출로 실행하면 ‘this’가 undefined로 설정

객체 메서드로 호출된 함수 내부의 this는 호출 방식에 따라 동적으로 결정

‘obj 객체의 메서드로 호출되면, ‘this’는 ‘obj’를 가리킨다.


3. console

브라우저와 Node.js의 console 객체는 대부분의 메서드들을 똑같이 가지고 있지만, 동작 환경이 다르기 때문에 내부적인 구현이 서로 다르다.

브라우저의 console 객체: Web API의 일부

Node.js의 console 객체: Node.js의 core 모듈 중 하나인 ‘console’ 모듈로 구현

console.log에서

%o: 객체를 간략한 형태로 출력

%O: 객체를 자세히 출력

%j: 객체를 JSON 문자열로 변환하여 출력

console.error - 에러 메시지 출력 (process.stderr 스트림으로 출력)

console.warn - 경고 메시지 출력 (process.stderr 스트림으로 출력)

console.info - 정보성 메시지 출력(process.stdout 스트림으로 출력)

console.debug - 디버그 메시지 출력 (process.stdout 스트림으로 출력)

참고: console.log - process.stdout 스트림으로 출력

console.time - 인자로 주어진 문자열을 이름으로 갖는 타이머 시작

console.timeEnd - 인자로 주어진 이름의 타이머를 종료하고 경과 시간 출력

console.count - 특정 함수의 호출 횟수를 추적

console.countReset - 인자로 주어진 레이블의 카운터를 0으로 초기화

console.trace - 자신이 호출된 함수로부터 시작하여 호출 경로를 역순으로 표시

console.assert - 첫번째 인자로 주어진 조건식이 틀렸을 때 두번째 인자로 주어진 메시지 출력

메시지 앞에 ANSI 코드를 붙여 색상 적용 후 출력하면 해당색으로 표시됨

const colors = {
    green: '\\x1b[32m',
    (...)
}

console.log(colors.green + ‘Success!’ + colors.reset);

실무에서는 Chalk라는 라이브러리 사용


4. Call Stack

함수를 사용할 때마다 그와 관련된 정보들이 쌓이는 곳

컴퓨터 프로그램이 어떤 함수를 실행하려면 이를 메모리에 올려야 함

여러 함수들이 연이어 다른 함수들을 호출하는 과정에서 다른 함수를 호출하는 함수는 호출되는 함수보다 먼저 실행 → 스택에 먼저 쌓임

스택이므로, 가장 나중에 실행되는 함수가, 가장 먼저 종료된다.

Call Stack에 올라온 항목들을 각각 ‘stack frame’이라 부르는데,

각 함수들의 스코프(해당 함수에서 접근 가능한 데이터들의 범위)가 포함되어 있다.

Console 탭에서 콜 스택을 살펴보면, 어떤 함수들이 어느 순서대로 호출되는 과정을 보며 어디에서 오류가 발생한 것인지 찾을 수 있음 → stack trace

프로그래밍 언어들에서 오류는 call stack에서 위에서 아래로 전파 → error bubbling


5. Event Loop

자바스크립트 프로그램이 Node.js 환경에서 동작하는 순서

 

1. JavaScript Code

코드가 실행되면 V8 엔진에 의해 파싱되고, 동기 작업은 즉시 처리, 비동기 작업은 하위 계층으로 전달

 

2. Call Stack

동기적인 작업이 Call Stack에서 실행

스택이 비워질 때까지 기다린 후 비동기 작업이 처리

 

3. Node.js API

파일 관련 작업, HTTP 요청, 타이머 등의 작업들을 libuv로 넘긴다

 

4. libuv

Node.js가 운영체제와 소통해서 빠르게 일을 처리하게 도와주는 도구

(다른 자바스크립트 환경들은 libuv를 쓰지 않고 자체적인 엔진 사용)

libuv가 파일 열기나 네트워크 요청 등을 운영체제에 요청한 다음 결과를 다시 Node.js에 전달

→ libuv에 의해 비동기 작업들이 백그라운드에서 처리

 

Thread Pool: 멀티쓰레딩으로 비동기 작업들이 처리되는 곳


Event loop 순서

1. Start

프로그램이 실행을 시작하며 이벤트 루프가 초기화

 

2. Execute Synchronous Code

자바스크립트의 동기적인 코드가 콜 스택에서 실행

 

3. Process MicroTasks

Promise의 then 메소드와, process의 nextTick 함수와 같은 마이크로태스크 처리

 

4. Timers Phase

setTimeout이나 setInterval로 설정된 타이머가 만료되었을 때 콜백 실행

 

5. Pending Phase

이전 사이클에서 처리되지 못한 작업들을 마저 처리 (드물게 처리)

 

6.Poll Phase

파일 읽기, 네트워크 응답 등 비동기 작업의 완료를 기다리고, 완료된 작업의 콜백을 실행

 

7. Check Phase

setImmediate 콜백을 실행하여 한 사이클을 마무리한 뒤 다시 4. Timer Phase로 돌아감

Event loop는 마이크로태스크와 각 페이즈를 체크하고, 더 이상 처리할 작업이 없으면 종료

 

메모리: 콜백 함수 자체가 저장되는 공간

태스크 큐: 콜백 함수를 실행할 때를 스케줄링하기 위한 대기열

 

process.nextTick: 작업을 nextTick으로 넘겨주면, 이 작업은 동기 코드들이 모두 실행된 다음 비동기적으로 진행(즉, 비동기 작업 중 가장 먼저 처리)

→ nextTick은 비동기 작업들 중 가장 최우선순위를 갖는 Microtask에 해당

 

setImmediate: 콜백을 등록하여, 이벤트 루프의 poll phase가 끝난 뒤 check phase에서 해당 콜백이 실행되도록 함


6. EventEmitter

프로그램 안에서 무언가 중요한 일이 일어났을 때, 다른 부분에 알려주는 역할 수행

(addEventListener, dispatchEvent와 비슷한 역할)

 

내장 모듈인 events로부터 가져오고, emitter 인스턴스를 만들어서 사용

 

on: 첫번째 인자로 주어진 문자열을 이름으로 갖는 이벤트를 등록

 

once: on과 역할은 같지만, 딱 한번만 실행

 

eventNames: emitter에 등록된 이벤트 이름들을 배열로 반환

 

emit: 등록된 이벤트를 발생할 때 실행

 

listeners: 인자로 전달된 이름의 이벤트에 할당된 리스너들을 반환

 

listenerCount: 해당 리스너들의 개수를 반환

 

off: 특정 이벤트 삭제

 

setMaxListeners: 하나의 이벤트에 대한 리스너의 최대 개수를 설정할 수 있는 메서드 (강제할 수는 없고, 경고가 뜸)

 

EventEmitter의 이벤트들에는 매개변수도 사용될 수 있다

 

EventEmitter에서 ‘error’ 이벤트에 리스너가 등록되어 있지 않으면, EventEmitter는 예외를 발생시키고 프로그램을 종료한다.

→ emitter에 ‘error’ 이벤트에 대한 리스너를 등록해야

 

EventEmitter를 확장한 커스텀 클래스를 만들었을 때, 이벤트 발생 시 수행할 일들은 클래스 밖에서 작성한다.

→ 클래스의 코드에서는 주어진 상황에서 이벤트를 발생시키기만 한다.

→ 이벤트 발생 로직과 이벤트 처리 로직을 분리함으로써, 모듈간의 느슨한 결합과 유연성 확보 가능


7. child_process

Node.js에서 별도의 프로세스를 생성하여 실행할 수 있도록 도와주는 모듈

→ 현재의 프로그램 내에서 다른 프로그램이나 시스템 명령어를 실행할 수 있도록 해줌

 

exec: 시스템 명령어를 실행하고 결과를 받아올 수 있는 함수

첫번째 인자: 시스템에서 실행할 명령어

두번째 인자: 오류 정보, 명령어의 실행 결과, 명령어 실행 중 표준 에러 출력을 갖는 콜백 함수

 

execFile: 셸을 거치지 않고 직접 명령을 실행

첫번째 인자: 실행 파일

두번째 인자: 옵션들

 

spawn: 새로운 프로세스를 생성하여 스트림 방식으로 실시간 데이터 처리

 

Node.js의 기본 process는 EventEmitter다.

‘exec’과 ‘execFile’ 함수들이 콜백으로 결과를 한 번에 받는 것과 달리, ‘spawn’은 스트림을 통해 실시간으로 데이터 처리

 

fork: spawn이 Node.js 전용으로 특화된 버전

객체의 send 메소드를 통해 자식 프로세스에 메시지를 전달할 수 있다. (자식 프로그램에서 process의 ‘message’ 이벤트를 통해 수신)

두 프로세스가 연결된 상태에서 어느 한 쪽이 종료되지 않으면, 다른 쪽도 종료되지 않음

 

// 부모 (index.js)

import { fork } from 'child_process';

const child = fork('child.js');

for(let i = 1; i <= 5; i++) {
	child.send(i) // 자식 프로세스 5개 생성
}

// 3초 후 자식 프로세스에게 exit라는 메시지를 보냄
setTimeout(() => {
	child.send('exit');
	// child.kill(); 부모 쪽에서 강제로 자식 프로세스를 종료
}, 3000);

// 부모 프로세스로 자녀가 보낸 메시지가 전달되어 출력
child.on('message', (msg) => {
	console.log(`Received: ${msg}`);
});

// 자식 프로세스가 종료될 때 close 이벤트 발생
child.on('close', (code) => {
	console.log(`Child exited (${code})`);
});

 

// 자식 (child.js)

// 부모로부터 exit 메시지가 오면 스스로를 종료
process.on('message', (num) => {
	if (num === 'exit') {
		process.exit(0);
	}
	
	// 자식 프로세스에서는 데이터로 전달된 각 숫자에 0.5를 곱한 초의 시간을 기다린 뒤 응답
	setTimeout(() => {
		process.send(`Waited ${num}s`);
	}, num * 500);
});

 


8. cluster

다중 코어를 활용하여 여러 워커 프로세스를 생성하고 관리할 수 있게 해주는 내장 모듈

내부적으로 child_process 모듈을 사용, fork 함수를 통해 워커 프로세스를 생성 후 통신

클러스터는 부모인 마스터 프로세스와 자식인 워커 프로세스의 코드를 한 곳에 작성 가능

 

import cluster from 'cluster';
import { cpus } from 'os';
import http from 'http';

// 실행 중인 프로세스가 마스터 프로세스라는 의미
if(cluster.isPrimary) {
	console.log(`Master Processs ${process.pid} is running`});
	
	// cpu 코어 수만큼 워커 프로세스를 만들어냄
	for (let i = 0; i < cpus().length; i++) {
		cluster.fork();
	}
} else {
// 워커 프로세스가 HTTP 서버를 생성하여 요청을 처리함
	http.createServer((req, res) => {
		res.writeHead(200);
		res.end('Hello from worker ' + process.pid);
	}).listen(8000);
}
	

 

import clust from 'cluster';
import os from 'os';

// 병렬로 사용 가능한 스레드 또는 코어의 수 확인
const numCPUs = os.availableParallelism();

if (cluster.isPrimary) {
    // 마스터(Primary) 프로세스에서 실행
    console.log(`Primary ${process.pid} is running`);
    
    // CPU 코어 수만큼 워커 프로세스 생성
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    
    // 각 워커로부터 메시지 수신 시 로그 출력
    for (const id in cluster.workers) {
        cluster.workers[id].on('message', (message) => {
            console.log(`Message from worker ${id}: ${message}`);
        });
    }
} else {
    // 워커 프로세스에서 마스터로 메시지 전송
    process.send(`Hello from worker ${process.pid}`);
}

 

실무에서는 cluster 모듈 기반으로 한 PM2 라이브러리를 사용하거나, 도커 컨테이너로 서버를 여러개 실행하는 방식 활용

 


9. worker_threads

JS 환경에서는 비동기 작업이 알아서 멀티스레딩 처리

→ CPU에 부담을 줄 수 있는 작업들은 직접 다른 스레드를 만들어 실행하면 좋다(이미지 편집, 대용량 데이터 압축 등)

// index.js
import { Worker } from 'worker_threads';

const worker = new Worker('./worker.js', { workerData: 1000000000 } );

worker.on('message', (message) => {
	console.log(`Received: ${message}`);
});

(...)

-------------------------------

// worker.js

// parentPort: 메인 스레드와 통신할 수 있는 창구
// workerData: 메인 쪽에서 Worker의 생성자에 두 번째 객체를 통해 실어보낸 데이터
import { parentPort, workerData } from 'worker_threads';

function heavyCalc(num) {
	// 무거운 작업
}

const result = heavyCalc(workerData);

// 메인 쪽에서 워커의 'message' 이벤트를 통해 전달
parentPort.postMessage(result);
// index.js
import { Worker } from 'worker_threads';
const numbers = [1, 2, 3, 4, 5];

for (const num of numbers) {
	const worker = new Worker('./worker.js');
	
	// 생성한 워커의 인스턴스에 'postMessage' 메소드를 사용하여 데이터 전달
	worker.postMessage(num * 1000000000);
	
	worker.on('message', (message) => {
		console.log(`Received: ${message}`);
	});
	
	(...)
	
// worker.js
import { parentPort } from 'worker_threads';

function heavyCalc(num) {
	(...)
}

// 메인에서 전달된 데이터는 워커의 'parentPort'에서 'message' 이벤트를 통해 수신
parentPort.on('message', (num) => {
	const result = heavyCalc(num);
	parentPort.postMessage(result);
	// process.exit(0);
});

worker.terminate()로 메인 스레드에서 강제 종료 가능 → 정상적으로 종료되지 않았다는 메시지 출력

워커 스레드에서 parentPort.close();로 워커 종료 가능 (주어진 작업을 마친 후)

 

Atomic: 다른 스레드로부터의 간섭 없이 데이터를 다룰 수 있게 해주는 도구

 

thread pool: 스레드들을 재활용함으로써 효율을 높임

실무에서는 ‘Piscina’와 같은 외부 라이브러리를 통해 스레드 풀 사용

 


10. package.json

npm을 비롯한 패키지 관리 도구들이 이 파일을 보고 프로젝트를 어떻게 관리할지 결정
 

name: 프로젝트 이름

 

version: 프로젝트의 버전

 

description: 프로젝트가 뭘 하는지 간단히 설명하는 필드

 

main: 프로젝트의 진입점 지정(프로그램을 켤 때 가장 먼저 실행될 파일)

 

type: ‘module’로 작성되어 있으면 ESM 모드로 프로젝트가 실행

 

scripts: 단축 명령어 모음

 

keywords: 프로젝트의 해시태그(프로젝트를 검색할 때 도움이 되는 키워드)

 

author: 프로젝트 만든 사람의 정보(이름, 이메일)

 

license: 프로젝트의 사용 허가 조건 명시(MIT: 누구나 자유롭게 사용, 수정, 배포할 수 있는 오픈소스 라이선스)

 

dependencies: 프로젝트를 실행하는데 필요한 패키지들

 

devDependencies: 프로그램을 개발하는 과정 중에만 필요한 패키지들

 

Semantic Versioning (SemVer) : 소프트웨어 버전을 체계적으로 관리하기 위한 규칙

4.17.1 ← 4는 메이저, 17은 마이너, 1은 패치 번호

메이저: 큰 변화가 있을 때 높아짐 (이전 버전과 호환되지 않는 수정이 포함될 수 있음)

마이너: 새로운 기능이 추가됐지만, 기존 코드와 호환될 때 높아짐

패치 번호: 기능 추가 없이 안정성만 높아질 때 높아짐

 

^4.17.1 ← 메이저 버전은 고정, 마이너와 패치 업데이트를 허용 (^은 캐럿이라고 부름)

→ 4.17.1 이상, 5.0.0 미만의 버전이 받아짐

 

~5.12.3 ← 메이너와 마이너 버전은 고정하고, 패치 업데이트만 허용

→ 5.12.3 이상, 5.13.0 미만의 버전을 활용

 

5.12.3 ← 5.12.3 버전만 사용한다는 의미

 

>=4.17.20 <5.0.0 ← 4.17.20 이상, 5.0.0 미만의 버전 사용

 

*: 해당 패키지의 최신 버전을 사용

 

26.6.3 || 27.0.0 ← 둘 중 하나 사용

 

peerDependencies: npm에 의해 자동으로 설치되지 않음

→ 어떤 패키지가 필요하다는 것을 명시만 해줌

 

optionalDependencies: 있으면 좋지만 없어도 되는 패키지

→ npm install 시 설치가 시도되지만, 설치가 실패하더라도 에러 무시

 
bundledDependencies: npm에 패키지를 배포할 때 여기 포함된 패키지도 같이 묶어 내보내라는 의미
 
overrides: 특정 패키지가 또 다른 패키지에 의존할 때, 그 하위 의존성의 버전을 강제로 지정할 때 사용

11. npm

Node.js에서 기본으로 제공되는 패키지 매니저
 

npm -v : npm의 버전 번호 출력

npm init: 질문들에 답하면 package.json 생성

npm init -y: 모든 질문에 yes라고 답변하고 package.json 생성

 

npmjs.com에서 Node.js 패키지들을 찾아볼 수 있다

 

 

package-lock.json: ‘npm install’로 설치된 모든 패키지와 그 의존성들의 정확한 버전을 기록해둔 설치 내역서

→ packages의 빈 문자열 항목은 package.json의 정보가 요약되어 있음

→ resolved에는 패키지가 어디서 다운로드되었는지 인터넷 위치가 기록됨

→ integrity는 파일 무결성을 확인하는 해시값

 
‘npm list -g —depth=0’ 명령어로 글로벌로 설치된 패키지 확인 가능

npm ci: 락파일의 내역을 정확하여 반영하여 패키지들 설치

 

npm update: 프로젝트에서 설치된 패키지를 최신 버전으로 업데이트 (뒤에 패키지 이름 붙일 수 있음)

 

npm outdated: 설치된 패키지 중 최신보다 오래된 것이 있는지 확인

 

npm uninstall: 패키지 삭제

 

(sudo) npm cache clean —force: 캐시를 비워줌

 

npm doctor: npm 버전, 레지스트리 연결, 캐시 상태 등을 점검해서 문제가 있으면 알려줌

 

npm audit: 프로젝트 패키지에서 보안 취약점을 찾아줌

npm 공식 사이트에서 라이브러리를 출시하고 싶다면

터미널에 ‘npm login’ 입력

로그인 후 ‘npm info 이름’ 명령어로 프로젝트와 이름이 같은 것이 있는지 확인

‘npm publish’로 패키지 업로드

‘npm unpublish 이름 (—force)’ 명령어로 npm에서 패키지 제거 가능

 

npx: 패키지를 설치하지 않고 바로 실행하거나, 로컬에 설치된 패키지를 쉽게 실행할 수 있게 해줌

→ npm install과의 차이: 캐시 등의 공간에 임시적으로 다운로드


12. testing

Node.js에는 내장 테스트 러너인 test module 존재

assert: 테스트 결과를 검증하는데 사용하는 모듈

 

test('add(2, 3) => 5', () => {
	assert.strictEqual(add(2, 3), 5);
});

 

테스트를 실행할 때 ‘node —test’ 명령어를 입력한다
그룹으로 묶어서 테스트도 가능
test('grouped test', async (t) => {
	await t.test('add(1, 2) =>3', async () => {
		assert.strictEqual((add(1, 2), 3);
	});
	
	await t.test('add(10, -5) => 15', async () => {
		assert.strictEqual(add(10, -5), 5);
	});
});
​
​
 

test.beforeEach: 각 테스트가 실행되기 전 호출

 

test.afterEach: 테스트가 실행된 후 호출

 

test.skip: 해당 테스트의 이름만 출력하고, 테스트를 실행하지는 않음

 

test.todo: 테스트 코드 구현x, 설명만 적을 때 사용하는 함수

 

test.only: ‘node —test —test-only’ 명령어를 입력하면 only 함수로 작성된 것만 실행

 

Mocha: 가장 오래되고 널리 쓰이는 테스트 프레임워크 (assertion 라이브러리인 Chai와 함께 조합해서 사용, Common JS에 적합)

Jest: 올인원 테스트 솔루션(Common JS, ESM 지원, React와 잘 맞음)

Vitest: Vite 생태계를 위한 최신 테스트 러너(ESM, TypeScript에 더 강력한 호환성)

저작자표시 비영리 변경금지 (새창열림)

'Study > Node.js' 카테고리의 다른 글

[Node.js 강의 정리] 파일 시스템, TCP/UDP, HTTP, 버퍼와 스트림, 각종 모듈에 관하여  (0) 2025.06.19
[Node.js 강의 정리] Node.js, REPL, Promise, async/await, Module, Nodemon에 관하여  (0) 2025.06.19
'Study/Node.js' 카테고리의 다른 글
  • [Node.js 강의 정리] 파일 시스템, TCP/UDP, HTTP, 버퍼와 스트림, 각종 모듈에 관하여
  • [Node.js 강의 정리] Node.js, REPL, Promise, async/await, Module, Nodemon에 관하여
퀵차분
퀵차분
Web Developer 🥐
  • 퀵차분
    QC's Devlog
    퀵차분
  • 전체
    오늘
    어제
    • 분류 전체보기 (177)
      • Frontend (31)
      • Fedify (4)
      • Study (42)
        • NestJS (2)
        • Node.js (3)
        • Modern JS Deep Dive (13)
        • SQL (1)
        • Network (1)
        • 프롬프트 엔지니어링 (4)
        • 인공지능 (9)
        • 시스템프로그래밍 (11)
        • 선형대수학 (1)
      • Intern (4)
      • KUIT (21)
      • Algorithm (48)
        • Baekjoon(C++) (26)
        • Programmers(JavaScript) (22)
      • 우아한테크코스(프리코스) (4)
      • Project (9)
        • crohasang_page (2)
        • PROlog (4)
        • Nomadcoder (2)
      • 생각 (4)
      • Event (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    next.js
    타입스크립트
    프론트엔드
    react
    프로그래머스
    알고리즘
    백준
    프로그래머스 자바스크립트
    음악추천
    리액트
    typescript
    인공지능
    KUIT
    HTML
    시스템프로그래밍
    자바스크립트
    fedify
    javascript
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
퀵차분
[Node.js 강의 정리] Call stack, Event Loop, EventEmitter, child_process, cluster, worker_threads 등에 관하여
상단으로

티스토리툴바