Node.js 초급

Yongjun Park·2022년 9월 15일
0

2022 OSAM 해커톤

목록 보기
5/11

2022 OSAM 해커톤 사전 온라인 교육에서 배운 내용입니다.
모르는 내용만 발췌하여 정리한 것이기 때문에 내용의 연결성이 부족한 점 양해 부탁드립니다.

모듈을 불러오는 방법

CommonJS 형식

// function.js
function helloWorld() {
	console.log("Hello World");
}

module.exports = {
	sayHelloWorld: HelloWorld;
};

// hello.js
const { sayHelloWorld } = require("./function.js");

sayHelloWorld();

ES Module 형식 - .mjs 확장자 사용

// function.mjs
export function helloWorld() {
	console.log("Hello World");
}

// hello.mjs
import { helloWorld } from "./function.mjs";

helloWorld();

ES Module 형식 - package.json에 명시 (.mjs를 안 쓸 수 있다)

// package.json
{
	"type": "module"
}

// function.js
export function helloWorld() {
	console.log("Hello World");
}

// hello.js
import { helloWorld } from "./function.mjs";

helloWorld();

fs (File System API)

fs Callback Style

const fs = require("fs");

const content = "Hello World";

fs.writeFile("./hello.txt", content, (err) => {
	if (err) {
		console.error(err);
		return;
	}

	fs.readFile("./hello.txt", "utf8", (err, data) => {
		if (err) {
			console.error(err);
			return;
		}

		console.log(data);
	});
});

fs Sync Style

const fs = require("fs");

const content = "Hello World";

try {
	fs.writeFileSync("./hello.txt", content);
} catch (err) {
	console.error(err);
	return;
}

try {
	const data = fs.readFileSync("./hello.txt", "utf8");
	console.log(data);
} catch (err) {
	console.error(err);
	return;
}

fs Async Style 👍

const fs = require("fs/promises");

const content = "Hello World";

async function helloWorld() {
	try {
		await fs.writeFile("./hello.txt", content);

		const data = await fs.readFile("./hello.txt", {encoding: "utf8"});

		console.log(data);
	} catch (err) {
		console.log(err);
	}
}

cross-env 모듈을 활용한 환경변수 사용

npm install cross-env
// package.json
{
	"scripts": {
		// 여기서 fs는 스크립트명. 명령어를 작성한다.
		"fs": "cross-env FILE_PATH=./hello.txt node fs.js
	},
	"dependencies": {
		"cross-env": "^7.0.3"
	}
}

// fs.js
// ./hello.txt를 process.env.FILE_PATH로 변경한다. 
node fs.js # (X)
npm run fs # (O) package.json에서 fs라는 스크립트를 찾아 실행한다. 

npm 명령어

  • npm init : package.json 생성
  • npm install [package][@version]
    • -g 옵션 : 글로벌 패키지에 추가되어, 다른 프로젝트도 이 모듈을 쓸 수 있도록
    • —save, —save-dev

npm install --save-dev를 쓰는 이유

  • npm run [scripts] : package.json의 scripts에서 탐색하여 스크립트 실행
    • npm start(=npm run start) : scripts에 start가 없다면 node server.js
    • npm restart : npm stop && npm start

Node.js 디버깅

Chrome Inspect

// package.json
{
	"scripts": {
		// 여기서 fs는 스크립트명. 명령어를 작성한다.
		"fs": "cross-env FILE_PATH=./hello.txt node fs.js,
		"debug": "cross-env FILE_PATH=./hello.txt node --inspect-brk fs.js
	},
	"dependencies": {
		"cross-env": "^7.0.3"
	}
}

// fs.js
debugger; // 원하는 중단점에 입력
  • npm run debug로 실행한 뒤, chrome://inspect 에서 서버가 돌아가는 ip:port를 찾으면 디버깅 모드로 들어갈 수 있다.

VSCode 디버거

  • 방법 1. VSCode의 package.json을 보면 디버그 버튼이 있음.
  • 방법 2. 왼쪽의 Debug 탭에서 create a launch.json file
{
	"version": "0.2.8",
	"configuration": [
		{
			"name": "Launch via NPM",
			"request": "launch", 
			"runtimeArgs": ["run-script", "fs"] // debug -> fs
			"runtimeExecutable": "npm",
			...
		}
	]
}

Node.js로 서버를 구축하는데, Single Thread라고?

과거 Tomcat은 Multi Thread(using thread pool)을 사용하였다. 그러나,

  1. 실제 병렬적으로 처리할 수 있는 Client의 수가 Thread Pool의 Thread 수밖에 안됨. 더 많이 오면 결국에는 느려짐. 불필요한 컨텍스트 스위칭만 하는 꼴.
  2. Client에 할당된 Thread는 I/O 작업(쿼리 호출, 파일 입출력)이 있으면 Non-block이더라도 하는 일이 없으니까 쉬게 됨.

Node.js는 Single Thread에다가 Async & Non-blocking I/O를 함으로써, 불필요한 컨텍스트 스위칭도 없고 쉬는 시간도 없는 효율적인 서버 구축을 가능하도록 함.

Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기

동기&비동기 vs 블로킹&논블로킹

👩‍💻 동기&비동기 / 블로킹&논블로킹 💯 완벽 이해하기

  • 동기/비동기 : 함수를 호출한 뒤엔, 결과값을 받을 때까지 아무것도 못하고 기다려야 하는가?
  • 블로킹/논블로킹 : 함수가 호출되면 하던 작업이 끊기는가? 아니면 백그라운드에서 신경 안쓰이게 돌아가는가.
  • 동기-블로킹, 비동기-논블로킹이 많이 쓰이지만 가끔 동기-논블로킹도 쓰임. (하던 작업이 끊기진 않지만 계속해서 그 함수가 끝났는지 물어봐야됨)
profile
추상화되었던 기술을 밑단까지 이해했을 때의 쾌감을 잊지 못합니다

0개의 댓글