JavaScript
[JS중급] Node.js 기본 개념
염두리안
2024. 11. 24. 21:54
728x90
반응형
- REPL : 사용자가 입력한 내용을 읽고(Read), 그 결과값을 구한 다음(Eval), 결과값을 출력(Print), 이 과정을 반복(Loop) | 짧은 코드 테스트 시 유용
- 모듈이란? 전체를 이루는 부품 하나하나
- 경로에 파일 이름만 적어도 됨 | 모듈 경로는 정확히 적어야 함 | require함수가 리턴하는 객체는 상수로 대입하는게 좋음(let → const) | 변수, 객체, 함수 모두 공개 가능
// math-tools.js
function add(a, b){
return a + b;
}
// add함수를 외부로 공개
exports.add = add;
// main.js
// require(): 모듈을 로드하는 함수
let m = require('./math-tools');
console.log(m.add(1, 2)); // 3
- 모듈 안에 있는 것들을 하나씩 공개 → exports
공개하고 싶은 것들을 모은 객체를 외부에 공개 → module.exports
// math-tools.js
let calculator = {
PI: 3.14,
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
divide: (a, b) => a / b,
};
module.exports = calculator;
// main.js
const m = require('./math-tools');
console.log(m.PI);
console.log(m.add(1, 2));
- 모듈 : 각 브라우저가 최신 JS모듈을 지원하는지 확인하기
- 내가 만든 모듈
- 이미 만들어져 있는 모듈
- 코어 모듈 : node 안에 이미 포함되어 있는 모듈(설치시 바로 포함 가능) | Node.js API 공식 문서
- 서드파티 모듈 : 개발자/회사들이 만들어서 공개한 모듈(내장X) | 하나의 서드파티 모듈 설치 시 그것이 의존하는 다른 서드파티 모듈들도 계단식으로 모두 함께 설치 됨 | package-lock.json 파일엔 현재 작업 디렉토리 안에 설치된 서드 파티 모듈들의 이름, 버전 정보가 저장(dependencies 필드에 기재)
// 코어 모듈
// fs: 파일시스템 관련 모듈
const fs = require('fs');
// readdirSync: 파일리스트를 배열 형식으로 리턴
let filelist = fs.readdirSync('.');
console.log(filelist); // [ 'main.js', 'math-tools.js', 'test.js' ]
// writeFileSync: 파일 생성
fs.writeFileSync('new', 'hello Node.js!');
// os: 운영체제 관련 모듈
const os = require('os');
// cpu 정보 출력
console.log(os.cpus());
// 서드파티 모듈
// npm: Node Pakage Manager
>> npm install cowsay
// cowsay 모듈
const cowsay = require('cowsay');
console.log(cowsay.say({
text : '배고파',
}));
- 비동기 프로그래밍 : Node.js는 비동기 실행 중심의 실행환경이기에, 일반적으로 비동기 함수 사용
- 프로세스와 스레드: 프로세스는 하나의 실행 흐름, 스레드는 그 안에 있는 더 작은 단위의 실행 흐름
- 메인 스레드는 빠르게 처리할 수 있는 작업들을 혼자 처리하고, 오래 걸리는 작업은 다른 스레드에 맡김
- CPU intensive job : 고화질 이미지를 처리, 복잡한 수식 처리, 딥러닝 작업 등 CPU를 집중적으로사용하는 것... Node.js의 경우 CPU 수치 계산 작업을 메인 스레드가 처리하기 때문에, 성능 저하 요소가 됨(node.js에 적합하지 않음)
// 일반 코드(동기실행)
const fs = require('fs');
console.log('start');
// readFileSync(): 파일 내용을 읽어서 리턴하는 함수 | 동기실행 되는 부분
let content = fs.readFileSync('./new', 'utf-8');
console.log(content);
console.log('finish');
>> start
>> hello Node.js!
>> finish
// 바뀐 코드(비동기실행)
const fs = require('fs');
console.log('start');
// readFile이 'new'를 다 읽고 나면 그 다음 함수 실행 → 그 함수를 실행 않고 콜백 등록
fs.readFile = ('./new', 'utf-8', (error, data) => { // 비동기 실행 부분
console.log(data);
});
console.log('finish');
>> start
>> finish
>> hello Node.js!
- Node.js의 이벤트 : 어떤 일이 발생했음을 알리는 신호 | 코어 모듈의 많은 객체들이 EventEmitter의 객체임
- EventEmitter 사용법: 이벤트를 발생시키기 전에 콜백 함수 설정을 먼저 해야 함... on → emit | 하나의 이벤트에 대해 여러 콜백 설정 가능 | 이벤트를 발생시키고, 그 이벤트에 대한 콜백이 실행되는 현상은 하나의 EventEmitter 객체에서만 이뤄짐
- on메서드: 어떤 이벤트가 발생했을 때 실행할 콜백을 등록하는 함수
- emit메서드: 이벤트를 발생시킴
- once메서드: 해당 이벤트에 대해서 딱 한번만 반응
- listeners메서드: 특정 이벤트에 어떤 이벤트 핸들러가 설정됐는지 조회할 때
- off메서드: 이벤트 핸들러를 해제하는 메서드
const EventEmitter = require('events');
const myEmitter = new EventEmitter(); // 객체를 만들어서 사용
myEmitter.on('test', () => { // on메서드
console.log('Sueccess!');
});
myEmitter.emit('test'); // emit메서드
>> Sueccess!
myEmitter.once('test', () => { // once메서드
console.log('Success!');
});
myEmitter.emit('test');
myEmitter.emit('test');
>> Sueccess!
// off메서드
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
const callback = () => {
console.log('Success!');
};
myEmitter.on('test', callback);
myEmitter.off('test', callback);
myEmitter.emit('test');
// 하나의 이벤트에 여러 콜백 설정
myEmitter.on('test', () => {
console.log('1');
});
myEmitter.on('test', () => {
console.log('2');
});
myEmitter.on('test', () => {
console.log('3');
});
myEmitter.emit('test');
>> 1
>> 2
>> 3
console.log(myEmitter.listeners('test')); // listeners메서드
>>
[
[Function (anonymous)],
[Function (anonymous)],
[Function (anonymous)]
]
- 이벤트에 추가 정보 전달하기 : 그냥 인자를 추가해 주면 됨
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('test', (arg1, arg2, arg3) => {
console.log(arg1);
console.log(arg2);
console.log(arg3);
});
myEmitter.emit('test', 'apple', 'banana', 'pear');
>> apple
>> banana
>> pear
// 여러 정보를 담고 있는 객체로 전달
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
const obj = { type: 'text', data: 'Hello', date: '2024.11.24'}
myEmitter.on('test', (info) => {
console.log(info);
});
myEmitter.emit('test', obj);
>> { type: 'text', data: 'Hello', date: '2024.11.24' }
728x90
반응형