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())
}) // 실행 에러

끝!