3.5장 노드 내장 모듈 사용하기

노드는 웹 브라우저에서 사용되는 자바스크립트보다 더 많은 기능을 제공한다. 운영체제 정보에도 접근할 수 있고, 클라이언트가 요청한 주소에 대한 정보도 가져올 수 있다. 노드에서 이러한 기능을 하는 모듈을 제공한다. 이번 챕터에서는 버전과 상관없이 안정적이고 유용한 기능을 지닌 모듈 위주로 알아보자!

3.5.1 os
3.5.2 path
path.join('/a', '/b', 'c'); // 결과 : /a/b/c
path.join('/a', '/b', 'c'); // 결과 : /b/c
3.5.3 url
const url = require('url');
const { URL } = url;
const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx7sercate1=001001000#anchor');
console.log('new URL():', myURL);
console.log('url.format():', url.format(myURL));
new URL(): URL {
href: 'http://www.gi.lbut.co.kr/book/bookl_ist.aspx?sercate1 =001001 OOONanchor',
origin: 'http://www.gilbut.co.kr',
protocol: 'http:',
username: '',
password: '',
host: 'www.gilbut.co.kr',
hostname: 'www.gilbut.co.kr',
port:'',
pathname: '/book/bookList.aspx',
search: '?sercate1=001001000',
searchParams: URLSearchParams { 'sercatel' => '001001000' },
hash: '#anchor'
}
url.format(): http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor

콘솔

new URL(): URL {
href: ' http://www.gi.lbut.co.kr/book/bookl_ist.aspx?sercate1=001001 OOONanchor',
origin: 'http://www.gilbut.co.kr',
protocol: 'http:',
username: '',
password: '',
host: 'www.gilbut.co.kr',
hostname: 'www.gilbut.co.kr',
port:'',
pathname: '/book/bookList.aspx',
search: '?sercate1=001001000',
searchParams: URLSearchParams { 'sercatel' => '001001000' },
hash: '#anchor'
}
url.format(): http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor
3.5.7 worker_threads
const {
    Worker, isMainThread, parentPort,
} = require('worker threads');
if (isMainThread) { // 부모일 때
    const worker = new Worker(__filename); 
    worker.on('message', message => console.log('from worker', message)); 
    worker.on('exit', () => console.log('worker exit' )); worker.postMessage('ping');
} else { // 워커일 때
    parentPort.on('message', (value) => {
        console.log('from parent', value);
        parentPort.postMessage('pong');
        parentPort.close();
    });
}

콘솔

from parent ping
from worker pong
worker exit
const {
Worker, isMainThread, parentPort, workerData,
} = require('worker—threads');

if (isMainThread) {
    const threads = new Set();
    threads.add(new Worker(__filename, {
        workerData: { start: 1 },
    }));
    threads.add(new Worker(__filename, {
        workerData: { start: 2 },
    }));
    for (let worker of threads) {
        worker.on('message', message =〉 console.log('from worker', message)); 
        worker.on('exit', () => {
            threads.delete(worker);
            if (threads.size === 0) {
                console.log('job done');
            }
        });
    }
} else { // 워커일 때
    const data = workerData;
    parentPort.postMessage(data.start + 100);
}

콘솔

from worker 101
from worker 102
job done
const min = 2;
const max = 10000000;
const primes = [];
function findPrimes(start, range) {
    let isPrime = true;
    const end = start + range;
    for (let i = start; i 〈 end; i++) {
        for (let j = min; j 〈 Math.sqrt(end); j++) {
            if (i !== j && i % j === 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            primes.push(i);
        }
        isPrime = true;
    }
}
console.time('prime');
findPrimes(min, max);
console.timeEnd('prime');
console.log(primes.length);
prime: 8.745s
664579
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
const min = 2;
let primes = [];
function findPrimes(start, range) {
    let isPrime = true;
    const end = start + range;
    for (let i = start; i 〈 end; i++) {
        for (let j = min; j 〈 Math.sqrt(end); j++) {
            if (i !== j && i % j = 0) {
            isPrime = false;
            break;
            }
        }
        if (isPrime) {
            primes.push(i);
        }
        isPrime = true;
    }
}
if (isMainThread) {
    const max = 10000000;
    const threadCount = 8;
    const threads = new Set();
    const range = Math.floor((max - min) / threadCount);
    let start = min;
    console.time('prime');
    for (let i = 0; i < threadCount - 1; i++) {
        const wStart = start;
        threads.add(new Worker(_filename, { workerData: { start: wStart, range } }));
        start += range;
    }
    threads.add(new Worker(_filename, { workerData: { start, range: max - start } }));
    for (let worker of threads) {
        worker.on('error', (err) => {
            throw err;
        }); 
        worker.on('exit', () => {
            threads.delete(worker);
            if (threads.size === 0) {
                console.timeEnd('prime');
                console.log(primes.length);
            }
        }); 
        worker.on('message', (msg) => {
            primes = primes.concat(msg);
        });
    }
} else {
    findPrimes(workerData.start, workerData.range);
    parentPort.postMessage(primes);
}

콘솔

prime: 1.752s
664579
3.5.8 child_process
const exec = require('child_process').exec;
const process = exec('ls');
process.stdout.on('data', function(data) {
    console.log(data.toString());
});// 실행 결과
process.stderr.on('data', function(data) {
    console.error(data. toString());
}); // 실행 에러

끝!