코드잇 사이트를 통해서 공부하면서 정리한 내용입니다!
자바스크립트를 코드잇에서 다 들었고 이제 node.js 수업을 들으려고 한다!
힘내서 다시 나아가보자!!
터미널 창에서 직접 작성하는 것을 말한다.
코드가 리턴 값이 없는 경우 undefined가 출력된다.
R: 사용자가 입력한 내용을 읽고
E: 그 결과값을 구한 다음
P: 결과값을 출력
L: 이런 과정을 계속 반복하는 모드
모듈 내부의 것을 외부에 공개하는 방법
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));
// 따로 저장경로를 표시할 필요가 없다!
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 엔진을 사용하고 있다.
특정 브라우저가 자바스크립트의 표준 문법 중에서 어디까지 지원하는지 확인하는게 중요!
// 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)들을 삽입한다. -> 자료구조를 공부해야 된다 ㅠㅠ