Node.js

JM·2022년 4월 2일
post-thumbnail

코드잇 사이트를 통해서 공부하면서 정리한 내용입니다!

자바스크립트를 코드잇에서 다 들었고 이제 node.js 수업을 들으려고 한다!
힘내서 다시 나아가보자!!

Node.js

Read Eval Print Loop(REPL)

터미널 창에서 직접 작성하는 것을 말한다.
코드가 리턴 값이 없는 경우 undefined가 출력된다.

R: 사용자가 입력한 내용을 읽고
E: 그 결과값을 구한 다음
P: 결과값을 출력
L: 이런 과정을 계속 반복하는 모드

모듈(module)

  • 전체를 이루는 부품 하나 하나
  • 자바스크립트 파일 하나를 모듈이라고 생각하면 된다.
  • 모듈들이 모여서 프로그램을 구성한다.

모듈 내부의 것을 외부에 공개하는 방법
1. 하나씩 exports로 공개
2. 하나의 객체로 만들고 module.exports로 객체를 통째로 공개

Anonymous Function 의 경우, Arrow Function을 쓰는 것을 권장하는 경우가 많다.


function add(a, b) {
	return a + b;
}

function minus(a, b) {
	return a - b;
}
// 하나씩 exports로 공개
exports.add = add;
// 아래와 같이 외부에서 사용할 이름을 변경할 수 있다.
exports.plus = add;
exports.minus = minus;

// 하나의 객체로 만들고 module.exports로 객체를 통째로 공개
// 이렇게 작성하면 여러 개를 한 번에 작성할 수 있다.
const calculate = {
	add: (a, b) => a + b,
  	minus: (a, b) => a - b,
}

module.exports = calculate;
// require 함수는 모듈 하나를 import 한다.
let m = require('./math-tool.js');

console.log(m.add(1, 3));

코어 모듈

  1. 내가 직접 만든 모듈
  2. 이미 만들어져 있는 모듈
    • 코어 모듈: 이미 노드 안에 포함되어 있는 모듈
    • 서드파티 모듈: 제 3자가 만든 것으로 공개저장소에서 제공하는 모듈
// 따로 저장경로를 표시할 필요가 없다!
const fs = require('fs');
const os = require('os');

// 지정 경로의 파일들 목록이 출력된다.
let file = fs.readdirSync('.');
console.log(file);

// new라는 파일을 만들 수 있다.
fs.writeFileSync('new', 'node testing');

// cpu의 정보를 확인할 수 있다.
console.log(os.cpus);

Node.js 에서 제공하는 API와 브라우저에서 제공하는 API 는 서로 다르다.

Node.js 는 UI 관련 API (X) / window, document (X) / 컴퓨터 제어 (O)
브라우저는 UI 관련 API (O) / window, document (O) / 컴퓨터 제어 (X)

node.js 는 크롬의 V8 엔진을 사용하고 있다.

특정 브라우저가 자바스크립트의 표준 문법 중에서 어디까지 지원하는지 확인하는게 중요!

서드파티(3rd party) 모듈

  • 다른 개발자나 회사들이 만들어서 인터넷상의 공개 저장소에서 제공하는 모듈
  • NPM(Node Package Manager)
    - npm install cowsay
    • package-rock.json 과 test.js 파일이 생성된다.
// cowsay 서드파티를 설치하고 실행
const cowsay = require('cowsay');

console.log(cowsay.say({
  test: "I love javascript",
}));

비동기

음식점 가게에서 주문을 먼저 쭉 받고 메뉴 전달하는 비동기 방법
하나의 주문 받고 음식이 나오는 동안 대기하다가 전달하는 동기 방법
특정 작업이 완료되었을 때 실행할 콜백을 등록해두고 바로 다음 코드로 실행을 넘기는 것

동기실행: 하나의 작업(주문 - 메뉴 전달) 메뉴가 전달 되기 전에는 다른 일들이 발생하지 않는다.

readFileSync -> 동기 실행
readFile -> 비동기 실행

프로세스 / 스레드

  • 프로세스: 하나의 실행 흐름
  • 스레드: 그 안에 있는 더 작은 단위의 실행 흐름
    프로세스 안에서 만들어낼 수 있는 '실행의 최소 단위'가 바로 스레드

크롬 브라우저는 '프로그램(program)' 으로
1. 하드디스크나 SSD에 저장되어 있는 프로그램의 내용을
2. 메모리(memory)에 올려서
3. CPU(Central Processing Unit)가 실행

메인 스레드는 CPU 수치 계산작업 및 네트워크로 들어오는 클라이언트의 요청을 받아들이고 응답하는 작업

Node.js 의 비동기 실행은 libuv 라는 라이브러리를 통해서 이루어진다.

CPU-intensive job(고화질 이미지 처리, 복잡한 시뮬레이션계산, 딥러닝 작업 등)에는 적합하지 않다.

이벤트

콜백 외에 비동기 프로그래밍을 하는 또다른 방법
이벤트란? 어떤 일이 발생했음을 알리는 신호

on(): 이벤트 핸들러를 설정하는 메소드(addListener 메소드와 같은 용도)
emit(): 인위적으로 이벤트를 발생시키기 위해 쓰는 메소드
once(): 이벤트 핸들러가 해당 이벤트에 대해서 딱 한 번만 반응해서 실행 되도록 한다.
listener(): 이벤트에 대한 이벤트 핸들러들을 출력해주는 메소드
off(): 이벤트 핸들러를 해제하는 메소드

const EventEmitter = require('events');

const myEmitter = new EventEmitter();
const myEmitter2 = new EventEmitter();

myEmitter.on('test', () => {
    console.log('Success!');
});

// 다른 객체에는 영향을 주지 않는다.
myEmitter2.on('test', () => {
    console.log('Success!');
});

myEmitter.emit('test');

off 메소드를 사용할 때 주의할 부분은 콜백함수를 특정 이름이 없는 경우 다른 콜백으로 간주하여 off 가 적용 되지 않는다.

// 아래 두 이벤트 핸들러는 서로 다른 것이다!
myEmitter.on('test', () => {
    console.log('Success!');
});

myEmitter.off('test', () => {
  console.log('Success!');
});

myEmiiter.emit('test'); // Success가 출력 된다.!!

off 를 적용하기 위해서는 아래 두 가지 방법이 있다.

const EventEmitter = require('events');

const myEmitter = new EventEmitter();

// 함수 표현식을 사용!
const callback = myEmitter.on('test', () => {
	console.log('Success');
});

// 배열을 사용
const Arr = [];

Arr[0] = () => {console.log('test')}
Arr[1] = () => {console.log('test')}

myEmitter.on('test', Arr[0]);
myEmitter.on('test', Arr[1]);

myEmitter.off('test', Arr[0]);
myEmitter.off('test', Arr[1]);

Event Loop는 콜백들의 실행조건을 확인하고, 실제로 콜백을 실행하는 조직
Event Loop는 특정 콜백의 실행 조건이 만족된 것을 확인하면 Queue라는 곳에 콜백(callback)들을 삽입한다. -> 자료구조를 공부해야 된다 ㅠㅠ

profile
초조해하지 말자! 나는 충분히 할 수 있다! 인생은 길다!

0개의 댓글