๋ ธ๋๋ os ๋ชจ๋์ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์ด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ผ๋ฐ์ ์ธ ์น ์๋น์ค๋ฅผ ์ ์ํ ๋๋ ์ฌ์ฉ ๋น๋๊ฐ ๋์ง ์์ง๋ง, ์ด์์ฒด์ ๋ณ๋ก ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ ๊ณตํ ๋ ์ ์ฉํ๋ค.
const os = require('os')
console.log('์ด์์ฒด์ ์ ๋ณด--------------------')
console.log('os.arch(): ', os.arch()) // ํ๋ก์ธ์ ์ํคํ
์ฒ ์ ๋ณด -> process.arch์ ๋์ผ
console.log('os.platform(): ', os.platform()) // ์ด์์ฒด์ ํ๋ซํผ ์ ๋ณด -> process.platform๊ณผ ๋์ผ
console.log('os.type(): ', os.type()) // ์ด์์ฒด์ ์ข
๋ฅ
console.log('os.uptime(): ', os.uptime()) // ์ด์์ฒด์ ๋ถํ
์ดํ ํ๋ฅธ ์๊ฐ
console.log('os.hostname(): ', os.hostname()) // ์ปดํจํฐ ์ด๋ฆ
console.log('os.release(): ', os.release()) // ์ด์์ฒด์ ์ ๋ฒ์
console.log('๊ฒฝ๋ก--------------------')
console.log('os.homedir(): ', os.homedir()) // ํ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก
console.log('os.tmpdir(): ', os.tmpdir()) // ์์ ํ์ผ ์ ์ฅ ๊ฒฝ๋ก
console.log('cpu ์ ๋ณด--------------------')
console.log('os.cpus(): ', os.cpus()) // ์ปดํจํฐ์ ์ฝ์ด ์ ๋ณด
console.log('os.cpus().length: ', os.cpus().length)
console.log('๋ฉ๋ชจ๋ฆฌ ์ ๋ณด--------------------')
console.log('os.freemem(): ', os.freemem()) // ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ
console.log('os.totalmem(): ', os.totalmem()) // ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฉ๋
ํด๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋์ด๋ค. ์ด์์ฒด์ ๋ณ๋ก ๊ฒฝ๋ก ๊ตฌ๋ถ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ path ๋ชจ๋์ด ํ์ํ๋ค.
path.join('/a', '/b', '/c') -> a/b/c (์๋๊ฒฝ๋ก๋ก ์ฒ๋ฆฌ)
path.resolve('/a', '/b', '/c') -> b/c (์ ๋๊ฒฝ๋ก๋ก ์ธ์ํด ์ ๊ฒฝ๋ก ๋ฌด์)
const path = require('path')
const string = __filename
console.log('paht.sep: ', path.sep) // ๊ฒฝ๋ก ๊ตฌ๋ถ์
console.log('path.delimiter: ', path.delimiter) // ํ๊ฒฝ ๋ณ์ ๊ตฌ๋ถ์(์๋ - ;, POSIZ - :)
console.log('--------------------')
console.log('path.dirname(): ', path.dirname(string)) // ํ์ผ์ด ์์นํ ํด๋ ๊ฒฝ๋ก
console.log('path.extname(): ', path.extname(string)) // ํ์ผ์ ํ์ฅ์
console.log('path.basename(): ', path.basename(string)) // ํ์ฅ์ ํฌํจํด์ ํ์ผ ์ด๋ฆ ํ์
console.log('path.basename - extname: ', path.basename(string, path.extname(string)))
console.log('--------------------')
console.log('path.parse(): ', path.parse(string)) // ํ์ผ ๊ฒฝ๋ก๋ฅผ root, dir, base, ext, name์ผ๋ก ๋ถ๋ฆฌ
console.log('path.format(): ', path.format({dir: 'C:\\users\\zerocho', name: 'path', ext: '.js'}))
// path.parse()ํ ๊ฐ์ฒด๋ฅผ ํ์ผ ๊ฒฝ๋ก๋ก ํฉ์นจ
console.log('path.normalize(): ', path.normalize('C://users\\\\zerocho\\\path.js')) // \, / ์ค์ํ์ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณ๊ฒฝ
console.log('--------------------')
console.log('path.isAbsolute(C:\\): ', path.isAbsolute('C:\\')) // ํ์ผ ๊ฒฝ๋ก๊ฐ ์ ๋๊ฒฝ๋ก๋ฉด true, ์๋๊ฒฝ๋ก๋ฉด false
console.log('path.isAbsolute(./home): ', path.isAbsolute('./home'))
console.log('--------------------')
console.log('path.relative(): ', path.relative('C:\\users\\zerocho\\path.js', 'C:\\'))
// ๊ฒฝ๋ก 2๊ฐ๋ฅผ ๋ฃ์ผ๋ฉด ์ฒซ ๋ฒ์งธ์์ ๋ ๋ฒ์งธ ๊ฒฝ๋ก๋ก ๊ฐ๋ ๋ฐฉ๋ฒ ์๋ฆผ
console.log('path.join(): ', path.join(__dirname, '..', '..', '/users', '.', '/zerocho')) // ์ฌ๋ฌ ์ธ์ ๋ฃ์ผ๋ฉด ํ๋์ ๊ฒฝ๋ก๋ก ํฉ์นจ
console.log('path.resolve(): ', path.resolve(__dirname, '..', 'users', '.', '/zerocho')) // join()๊ณผ ๋น์ท
์ธํฐ๋ท ์ฃผ์๋ฅผ ์ฝ๊ฒ ์กฐ์ํ๋๋ก ๋์์ฃผ๋ ๋ชจ๋ธ
username, password, origin, searchParams ์์ฑ์ WHATWG์๋ง ์กด์ฌ
search ๋ถ๋ถ์ searchParams๋ผ๋ ํน์ํ ๊ฐ์ฒด๋ก ๋ฐํํ๋ค. (search๋ ?๋ก ์์ํ๊ณ , ํค=๊ฐ ํํ๋ก ๋ฐ์ดํฐ ์ ๋ฌ)
const url = require('url')
const { URL } = url
const myURL = new URL('http://www.gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor')
console.log('new URL(): ', myURL)
console.log('url.format(): ', url.format(myURL))
- url.parse(์ฃผ์): ์ฃผ์๋ฅผ ๋ถํดํ๋ค. username๊ณผ password ๋์ 'auth' ์์ฑ, searchParams ๋์ 'query' ์กด์ฌ
- url.format(๊ฐ์ฒด): WHATWG์ ๊ธฐ์กด ๋ ธ๋์ url ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ, ๋ถํด๋์๋ url์ ์๋๋๋ก ์กฐ๋ฆฝ
const url = require('url')
const { URL } = url
const parsedUrl = url.parse('http://gilbut.co.kr/book/bookList.aspx?sercate1=001001000#anchor')
console.log('url.parse(): ', parsedUrl)
console.log('url.format(): ', url.format(parsedUrl))
host ๋ถ๋ถ ์์ด pathname ๋ถ๋ถ๋ง ์ค๋ ์ฃผ์์ธ ๊ฒฝ์ฐ (/book/bookList.apsx)
+ ์ด์ ๋ 4์ฅ์์ ๊ณต๋ถํด๋ณด๊ธฐ(์ฑ ์ ์์ผ๋ฉด ์ธํฐ๋ท ๊ฒ์)
๊ธฐ์กด ๋ ธ๋์ url์ ์ฌ์ฉํ ๋, search ๋ถ๋ถ์ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๊ฐ์ฒด๋ก ๋ง๋๋ ๋ชจ๋๋ก, ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด๋ก ๋ถํด๋๊ณ ๋ฌธ์์ด๋ก ์กฐ๋ฆฝ๋๋ฏ๋ก ํธ๋ฆฌํ๋ค.
๋ค์ํ ๋ฐฉ์์ ์ํธํ๋ฅผ ๋์์ฃผ๋ ๋ชจ๋
โ ๋จ๋ฐฉํฅ ์ํธํ
๋ณตํธํ ํ ์ ์๋ ์ํธํ ๋ฐฉ์์ผ๋ก, ํ ๋ฒ ์ํธํํ๋ฉด ์๋ ๋ฌธ์์ด์ ์ฐพ์ ์ ์๋ค. ์ํธํ๋ผ๊ณ ํํํ๋ ๋์ ํด์ ํจ์๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๋จ๋ฐฉํฅ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ก ํด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
* ํด์ ๊ธฐ๋ฒ: ์ด๋ ํ ๋ฌธ์์ด์ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ ๋ฐฉ์
โ ์๋ฐฉํฅ ์ํธํ
์ํธํ๋ ๋ฌธ์์ด์ ๋ณตํธํํ ์ ์์ผ๋ฉฐ, ํค(์ด์ )๊ฐ ์ฌ์ฉ๋๋ค. ๋ฐ๋ผ์ ๋์นญํ ์ํธํ์์ ์ํธ๋ฅผ ๋ณตํธํํ๋ ค๋ฉด ์ํธํํ ๋ ์ฌ์ฉํ ํค์ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๊ฐ์ข ํธ์ ๊ธฐ๋ฅ์ ๋ชจ์๋ ๋ชจ๋์ด๋ค.
๋ ธ๋์์ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
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()
})
}
/* isMainThread๋ฅผ ํตํด ํ์ฌ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋์ง, ์์ฑํ ์์ปค ์ค๋ ๋์์ ์คํ๋๋์ง ๊ตฌ๋ถ๋๋ค.
๋ฉ์ธ ์ค๋ ๋์์๋ new Worker๋ฅผ ํตํด ํ์ฌ ํ์ผ์ ์์ปค ์ค๋ ๋์์ ์คํ์ํค๊ณ ์๊ณ , ํ์ฌ ํ์ผ์ else
๋ถ๋ถ๋ง ์์ปค ์ค๋ ๋์์ ์คํ๋๋ค.
๋ฉ์ธ์์๋ worker.postMessage๋ก ์์ปค์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ณ , ์์ปค๋ parentPort.on('message')๋ก
๋ถ๋ชจ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ค. parentPort.postMessage๋ก ๋ถ๋ชจ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ , ๋ถ๋ชจ๋
worker.on('message')๋ก ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ค. */
// ์ฃผ์! worker์์ on ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋, ์ง์ ์์ปค๋ฅผ ์ข
๋ฃํด์ผ ํ๋ค.
+ ๋ ธ๋์์ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
๋ ธ๋์์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๊ณ ์ถ๊ฑฐ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ชจ๋์ด๋ค.
์ด ๋ชจ๋์ ํตํด ํ์ด์ฌ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์ ์ฝ๋๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ด๊ฐ์ ๋ฐ์ ์ ์๋ค.
โ ๋ชจ๋ ์ด๋ฆ์ด child_process์ธ ์ด์ ?
ํ์ฌ ๋ ธ๋ ํ๋ก์ธ์ค ์ธ์ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋์์ ๋ช ๋ น์ ์ํํ๊ณ , ๋ ธ๋ ํ๋ก์ธ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๊ธฐํ ๋ค์ํ ๋ชจ๋๋ค
fs ๋ชจ๋์ ํ์ผ ์์คํ ์ ์ ๊ทผํ๋ ๋ชจ๋์ด๋ค. ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์ญ์ ํ๊ณ , ์ฝ๊ฑฐ๋ ์ธ ์ ์๊ณ , ํด๋๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ง์ธ ์ ์๋ค.
โ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ
// readme.txt
์ ๋ฅผ ์ฝ์ด์ฃผ์ธ์.
// readFile.js
const fs = require('fs')
fs.readFile('./readme.txt', (err, data) => {
if (err) {
throw err
}
console.log(data)
console.log(data.toString())
})
fs ๋ชจ๋์ ๋ถ๋ฌ์จ ํ ์ฝ์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค. ์ด๋, ํ์ผ์ ๊ฒฝ๋ก๊ฐ ํ์ฌ ํ์ผ ๊ธฐ์ค์ด ์๋๋ผ node ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ์ฝ์ ๊ธฐ์ค์ด๋ผ๋ ์ ์ ์ ์ํด์ผ ํ๋ค.
readFile์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฒํผ(Buffer) ํ์์ผ๋ก ์ ๊ณต๋๋ค. ๋ฐ๋ผ์ toString()์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
โ ํ๋ก๋ฏธ์ค ๊ธฐ๋ฐ์ fs ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ
const fs = require('fs').promises
fs.readFile('./readme.txt')
.then((data) => {
console.log(data)
console.log(data.toString())
})
.catch((err) => {
console.error(err)
})
์์ฒญ๋ฐ์ ํจ์๊ฐ ์์ ์ ์๋ฃํ๋์ง๋ฅผ ์ฒดํฌํด์ ์์ฐจ์ ํ๋ฆ์ ์ฐจ์ด
์์ฒญ๋ฐ๋ ํจ์๊ฐ ์ ์ด๊ถ(ํจ์์คํ๊ถ)์ ์ธ์ ๋๊ฒจ์ฃผ๋๋์ ์ฐจ์ด
๋ ธ๋์์๋ ๋๋ถ๋ถ ๋๊ธฐ-๋ธ๋กํน ๋ฐฉ์๊ณผ ๋น๋๊ธฐ-๋ ผ ๋ธ๋กํน ๋ฐฉ์์ด ๋๋ถ๋ถ์ด๋ค.
โ ๋๊ธฐ ๋ฉ์๋์ ๋น๋๊ธฐ ๋ฉ์๋
๋น๋๊ธฐ ๋ฉ์๋๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ํด๋น ํ์ผ์ ์ฝ์ผ๋ผ๊ณ ๋ง ์์ฒญํ๊ณ ๋ค์ ์์ ์ผ๋ก ๋์ด๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๋ค์ ๋ฉ์ธ ์ค๋ ๋์ ์๋ฆฌ๊ณ , ๋ฉ์ธ ์ค๋ ๋๋ ๋ฑ๋ก๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ค. ์ด ๋ฐฉ์์ ์๋ฐฑ ๊ฐ์ I/O ์์ฒญ์ด ๋ค์ด์๋ ๋ฉ์ธ ์ค๋ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ฒญ์ ์์ํ๊ณ , ๋์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๊ฐ๊ฐ์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์๋ค๊ณ ์๋ฆฌ๋ฉด ๊ทธ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
โ ๋ฒํผ
๋ ธ๋๋ ํ์ผ์ ์ฝ์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ ํฌ๊ธฐ๋งํผ ๊ณต๊ฐ์ ๋ง๋ จํด๋๋ฉฐ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ค ์ฌ์ฉ์๊ฐ ์กฐ์ํ ์ ์๋๋ก ํ๋๋ฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ฒํผ๋ค.
โ ์คํธ๋ฆผ
๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋ ํ ์ฌ๋ฌ ๋ฒ์ผ๋ก ๋๋ ๋ณด๋ด๋ ๋ฐฉ์์ด ๋ฑ์ฅํ๋ค. ์ด๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ง๋ ๊ฒ์ด ์คํธ๋ฆผ์ด๋ค.
์คํธ๋ฆผ๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฒ์ 'ํ์ดํํ๋ค'๊ณ ํํํ๋ค.
์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์์ ๊ฐ์ ํฐ ํ์ผ์ ์ ์กํ ๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ค.
โ ์ค๋ ๋ํ
๋น๋๊ธฐ ๋ฉ์๋๋ ์ฌ๋ฌ ๋ฒ ์คํํด๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์์ ์ฒ๋ฆฌ๋๋๋ฐ, ์ค๋ ๋ํ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ค๋ ๋ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์๊ฐ 4๊ฐ๋ค.
on('data', ์ฝ๋ฐฑ) ๋๋ on('end', ์ฝ๋ฐฑ)์ ์ฌ์ฉํ๋๋ฐ, ์ด๊ฒ์ data๋ผ๋ ์ด๋ฒคํธ์ end๋ผ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋๋ก ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ ๊ฒ์ด๋ค.
๋ ธ๋์์ ์์ธ ์ฒ๋ฆฌ๋ ์ค์ํ๋ค. ๋ ธ๋์ ๋ฉ์ธ ์ค๋ ๋๋ ํ๋๋ฟ์ด๋ฏ๋ก ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋ฉด ์ ์ฒด ์๋ฒ๊ฐ ๋ฉ์ถ๋ค๋ ๋ป์ด๋ค. ๋ฐ๋ผ์ ์์ธ ์ฒ๋ฆฌ๋ ํ์๋ค.
โ try/catch๋ก ์๋ฌ ์ก๊ธฐ
setInterval(() => {
console.log('์์');
try {
throw new Error('์๋ฒ๋ฅผ ๊ณ ์ฅ๋ด์ฃผ๋ง!');
} catch (err) {
console.error(err);
}
}, 1000);
โ ๋ ธ๋ ์์ฒด์์ ์ก์์ฃผ๋ ์๋ฌ
const fs = require('fs');
setInterval(() => {
fs.unlink('./abcdefg.js', (err) => {
if (err) {
console.error(err);
}
});
}, 1000);
1.
const fs = require('fs').promises
fs.writeFile('./seol.txt', '์๋
ํ์ธ์. ์ ๋ ์ฝ๋์ ๊ธฐํํ์ฅ seol์
๋๋ค. ์ ๋ ์ง๊ธ ๋
ธ๋๋ฅผ ๊ณต๋ถํ๋ ์ค์
๋๋ค.')
.then(() => {
return fs.readFile('./seol.txt')
})
.then((data) => {
console.log(data.toString())
})
.catch((err) => {
console.error(err)
})
2.
setInterval(() => {
console.log('์์');
try {
throw new Error('๋ด ์ด๋ฆ์ seol, ์๋ฒ ๊ณ ์ฅ๋ด๋ฌ ์์ฃ .');
} catch (err) {
console.error(err);
}
}, 1000);
[Node.js] 5์ฅ ํจํค์ง ๋งค๋์ (0) | 2022.10.13 |
---|---|
[Node.js] 4์ฅ http ๋ชจ๋๋ก ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2022.10.06 |
[Node.js] 3์ฅ ๋ ธ๋ ๊ธฐ๋ฅ (0) | 2022.09.22 |
[Node.js] 2์ฅ ์์๋์ด์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2022.09.19 |
[Node.js] 1์ฅ ๋ ธ๋ ์์ํ๊ธฐ (0) | 2022.09.19 |