๐3์ฅ(2) ํค์๋๐
fs๋ชจ๋์ CRUD
๋๊ธฐ๋ฉ์๋
๋น๋๊ธฐ ๋ฉ์๋
๋๊ธฐ-๋ธ๋กํน ๋ฐฉ์๊ณผ ๋น๋๊ธฐ-๋ ผ๋ธ๋กํน ๋ฐฉ์
Buffer
Stream
3.6 ํ์ผ ์์คํ ์ ๊ทผํ๊ธฐ
fs ๋ชจ๋ : ํ์ผ ์์คํ ์ ๊ทผ ๋ชจ๋ (ํ์ผ ์์ฑ, ์ญ์ , ์ฝ๊ธฐ, ์ฐ๊ธฐ | ํด๋ ์์ฑ, ์ญ์ ). ์ฝ๋ฐฑ ํ์ ๋ชจ๋
์น ๋ธ๋ผ์ฐ์ ์ ์ฐจ์ด์ : ์น์์๋ ํ์ผ ์์คํ ์ ๊ทผ ๋๋ถ๋ถ ๊ธ์ง
์๋์ ๋ ๊ฐ์ง ํ์ผ์ ํตํด fs ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ ์ตํ๊ธฐ (์ฝ๊ธฐ):
// readme.txt
์ง์ ์ฝ๊ฑฐ๋ผ
// readFile.js
const fs = require('fs');
fs.readFile('./readme1.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data);
console.log(data.toString());
});
๋ ํ์ผ์ ์์ฑํ๊ณ js๋ฅผ ์คํํ๋ฉด, ํฐ๋ฏธ๋์์ ์๋์ ๊ฐ์ ๋ด์ฉ์ด ๋์จ๋ค.
์์ js ํ์ผ์ ์ค๋ช ํ์๋ฉด,
1) ๋ชจ๋์ ๋ถ๋ฅด๊ณ ,
2) ์ฝ์ ํ์ผ์ ๊ฒฝ๋ก(์ฝ์ ๊ธฐ์ค)๋ฅผ ์ง์ ํ๋ค.
3) ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฉ์๋ ์ธ์๋ก ๊ฐ์ด ๋ฃ๋๋ค
4) ์ฝ๋ฐฑ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์๋ฌ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค.
์์ ํฐ๋ฏธ๋์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ ๊ฒฝ์ฐ.
๋ฒํผ : readFile์ ๊ฒฐ๊ณผ๋ฌผ ์ ๊ณต ํ์. ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ. ๋ฌธ์์ด๋ก ๋ณํํด์ผ ์ฌ๋์ด ์ฝ์ ์ ์์. ์ปดํจํฐ๋ง๋ค ๋ค๋ฆ.
ํ๋ก๋ฏธ์ค ํ์์ผ๋ก ๋ฐ๊พผ fs ๋ชจ๋ :
const fs = require('fs').promises;
fs.readFile('./readme.txt')
.then((data) => {
console.log(data);
console.log(data.toString());
})
.catch((err) => {
console.error(err);
});
* promises ์์ฑ์ ๋ถ๋ฌ์จ๋ค.
* . ๋ง์นจํ๋ฅผ ํ์ฉํ๋ค
์๋์ ํ์ผ์ ํตํด fs ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ ์ตํ๊ธฐ (์์ฑ, ์ฐ๊ธฐ):
const fs = require('fs');
fs.writeFile('./writeme.txt', '๊ธ์ด ์
๋ ฅ๋ฉ๋๋ค', (err) => {
if (err) {
throw err;
}
fs.readFile('./writeme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data.toString());
});
});
์คํํ๋ฉด ํฐ๋ฏธ๋์ ์๋์ ๊ฐ์ ์ถ๋ ฅ๊ฐ ํ์ธ ๊ฐ๋ฅ
์ค์ ๋ก writeme.txt ํ์ผ ์์ฑ, ์ฝ๊ธฐ ๊ฐ๋ฅ.
3.6.1 ๋๊ธฐ ๋ฉ์๋์ ๋น๋๊ธฐ ๋ฉ์๋
๋๊ธฐ ๋ฐฉ์ : fs ๋ชจ๋, readFileSync, writeFileSync ๋ฑ ~Sync ๋ฉ์๋ (์ด๊ธฐํํ ๊ฒฝ์ฐ)
๋น๋๊ธฐ ๋ฐฉ์ : setTimeout, process.nextTick ๋ฑ์ ๋๋ถ๋ถ
์๋์ ์์ ๋ฅผ ํตํ ๋น๋๊ธฐ ๋ฉ์๋ ๋ฐฉ์ ๊ด์ฐฐ:
// readme2.txt
์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ด๋ณด์ธ์.
// async.js
const fs = require('fs');
console.log('์์');
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1๋ฒ', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('2๋ฒ', data.toString());
});
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('3๋ฒ', data.toString());
});
console.log('๋');
์์ ํ์ผ ์คํ ๊ฒฐ๊ณผ
๋ฐ๋ณต ์คํ ๋๋ง๋ค 3-5 ๋ฒ์งธ ์ค ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง
์คํ ์์:
1) ๋ฐฑ๊ทธ๋ผ์ด๋์ ํด๋น ํ์ผ ์ฝ๊ธฐ ์์ฒญ
2) ๋ค์ ์์ ์ผ๋ก ๋์ด๊ฐ๊ธฐ
3) ๋์ค์ ์ฝ๊ธฐ๊ฐ ์๋ฃ, ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๋ฉ์ธ ์ค๋ ๋์ ์๋ฆผ (๋ฐฑ๊ทธ๋ผ์ด๋๋ ์ธ ๊ฐ๋ฅผ ๊ฑฐ์ ๋์์ ์คํ)
4) ๋ฉ์ธ ์ค๋ ๋๋ ๊ทธ๋ ๋ฑ๋กํ ์ฝ๋ฐฑ ํจ์ ์คํ
์ฅ์ :
I/O ์์ฒญ์ด ๋ง์ด ๋ค์ด์๋ ๋ฉ์ธ ์ค๋ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์์ฒญ์ฒ๋ฆฌ๋ฅผ ์์, ์ดํ ์๋ก์ด ์์ฒญ ๊ณ์ ๋ฐ์.
***NOTE***
๋ ธ๋์ ๊ฒฝ์ฐ, ๋๊ธฐ-๋ธ๋กํน ๋ฐฉ์๊ณผ ๋น๋๊ธฐ-๋ ผ๋ธ๋กํน ๋ฐฉ์์ด ๋๋ถ๋ถ. ๋๋จธ์ง๋ ๊ฑฐ์ ์์.
๋๊ธฐ ๋ฐฉ์์ ์ด์ฉํด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๊ณ ์์๋๋ก ์ถ๋ ฅํ ๋ ์ฝ๋ :
// sync.js
const fs = require('fs');
console.log('์์');
let data = fs.readFileSync('./readme2.txt');
console.log('1๋ฒ', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('2๋ฒ', data.toString());
data = fs.readFileSync('./readme2.txt');
console.log('3๋ฒ', data.toString());
console.log('๋');
์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ ๋ฐ๋ณต์ ๋ฌ๋ผ์ง๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์ฝ๋์์ ์ฐจ์ด์ :
๋น๋๊ธฐ ๋ฐฉ์์ ์ด์ฉํด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๊ณ ์์๋๋ก ์ถ๋ ฅํ ๋ ์ฝ๋ :
// asyncOrder.js
const fs = require('fs');
console.log('์์');
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('1๋ฒ', data.toString());
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('2๋ฒ', data.toString());
fs.readFile('./readme2.txt', (err, data) => {
if (err) {
throw err;
}
console.log('3๋ฒ', data.toString());
console.log('๋');
});
});
});
readFile ์ฝ๋ฐฑ ๋ค์์ '}'๋ก ๋ซ๊ธฐ ์ , readFile์ ์ ๋ ฅ.
์ฝ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋๋ก, ๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ ๋์ ๊ฒฐ๊ณผ๋ ๋์ผ.
* ๋จ์ : ์ฝ๋ฐฑ ์ง์ฅ ๋ฐ์
์์ ๋จ์ ์ asyn/await์ ํ๋ก๋ฏธ์ค๋ฅผ ์ด์ฉํด ์ด๋ ์ ๋ ํด๊ฒฐํ ๋น๋๊ธฐ ์ฝ๋๋ ์๋์ ๊ฐ์.
// asyncOrderPromise.js
const fs = require('fs').promises;
console.log('์์');
fs.readFile('./readme2.txt')
.then((data) => {
console.log('1๋ฒ', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('2๋ฒ', data.toString());
return fs.readFile('./readme2.txt');
})
.then((data) => {
console.log('3๋ฒ', data.toString());
console.log('๋');
})
.catch((err) => {
console.error(err);
});
์คํ ๊ฒฐ๊ณผ๋ ์์ ์ฌ๋ก์ ๋์ผํจ.
* ์ฅ์ : ๋น๋๊ธฐ, ํ๋ก๋ฏธ์ค ๋ฐฉ๋ฒ ์์ฑ, ์ฝ๋ฐฑ ์ง์ฅ ํด๊ฒฐ
3.6.2 ๋ฒํผ์ ์คํธ๋ฆผ ์ดํดํ๊ธฐ
๋ฒํผ์คํธ๋ฆผ์ ๋ด์ฉ์ ์ฌ๋์ด์์๋ณด๋ ค๋ฉด string์ผ๋ก ๋ฐ๊ฟ์ผ ํ๋ ์ด์ ๊ฐ ๋ญ๊น?
-> data ๊ฐ ๋ฒํผ์ด๊ธฐ ๋๋ฌธ!
ํ์ผ ์ฝ๊ธฐ ์ฐ๊ธฐ ๋ฐฉ์ :
1) ๋ฒํผ ์ด์ฉ
์์์ ์ฌ์ํ ์ ์์ ๋ ๊น์ง ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๋ ๋์
2) ์คํธ๋ฆผ ์ด์ฉ
์ ์ก ์ปดํจํฐ์์ ์์ ์ปดํจํฐ๋ก ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ธ์ฉ ์ ์ก
* ์คํธ๋ฆผ ๊ณผ์ ์์ ๋ฒํผ ์ด์ฉ ๊ฐ๋ฅ(๋๋ฌด ๋๋ฆฐ ์ ์ก ์๋ ๋ณด์ ๋ฑ)
๋ ธ๋์ ํ์ผ ์ฝ๊ธฐ:
ํ์ผ์ ์ฝ์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ ํฌ๊ธฐ๋งํผ์ ๊ณต๊ฐ ๋ง๋ จ
ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
์ฌ์ฉ์๊ฐ ํด๋น ๋ฐ์ดํฐ ์กฐ์
๋ ธ๋์ ๋ฒํผ์ ์คํธ๋ฆผ:
1) ๋ฒํผ : readFile ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฝ์ ํ์ผ์ ํ์.
๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ. ์๋ณธ ๋ฐ์ดํฐ๊ฐ ์ ์ก ์ ์ ์ด๋ ๊ณต๊ฐ์ ๋ด๊ฒจ์์ ๋, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ผ๊ณ ํ๋ค
2) ์คํธ๋ฆผ :
Buffer class : ๋ฒํผ๋ฅผ ์ง์ ๋ค๋ฃจ๋ ํด๋์ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฉ์๋ ์ ๊ณต
const buffer = Buffer.from('์ ๋ฅผ ๋ฒํผ๋ก ๋ฐ๊ฟ๋ณด์ธ์');
console.log('from():', buffer);
console.log('length:', buffer.length);
console.log('toString():', buffer.toString());
const array = [Buffer.from('๋์ '), Buffer.from('๋์ '), Buffer.from('๋์ด์ฐ๊ธฐ')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());
const buffer3 = Buffer.alloc(5);
console.log('alloc():', buffer3);
์ฝ์ ๊ฒฐ๊ณผ
* ๋จ์ : ํ์ผ์ ์ฉ๋์ ๋ง์ถฐ์ ํด๋น ํฌ๊ธฐ์ ๋ฒํผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด์ผ ํจ. ๋์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ. (์๋ฒ ๋ฑ)
* ๋จ์ : ๋ชจ๋ ๋ด์ฉ์ ๋ฒํผ์ ๋ค ์์ฑํ ํ ๋ค์ ๋์์ผ๋ก ์งํ. ๋งค๋ฒ ์ ์ฒด ์ฉ๋์ ๋ฒํผ ์ฒ๋ฆฌ๊ฐ ํ์ํด ์๊ฐ ์์
Buffer ํด๊ฒฐ : ์คํธ๋ฆผ
-> ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ๋ง๋ค๊ธฐ
-> ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ์ ๊ฑธ์ณ ๋๋ ๋ณด๋ด๊ธฐ
(๋ฒํผ) 100mb ํ์ผ ์ ์ก -> ๋ฉ๋ชจ๋ฆฌ 100mb ํ๋ณด -> ๋ฒํผ๋ก 100mb ์ฎ๊น
(์คํธ๋ฆผ) 100bm ํ์ผ์ 1mb๋ก 100๋ฒ ๋๋ ์ ์ก -> ๋ฉ๋ชจ๋ฆฌ ๊ฐ๊ฐ 1mb ํ๋ณด -> ๋ฒํผ๋ก 1mb ์ฎ๊น -> ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ๊ฐ 1mb ํ๋ณด -> ๋ฒํผ๋ก 1mb ์ฎ๊น -> ..... " 100๋ฒ ๋ฐ๋ณต"
createReadStream์ ์์ :
// readme3.txt
์ ๋ ์กฐ๊ธ์ฉ ์กฐ๊ธ์ฉ ๋๋ ์ ์ ๋ฌ๋ฉ๋๋ค. ๋๋ ์ง ์กฐ๊ฐ์ chunk๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
const fs = require('fs');
const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });
const data = [];
readStream.on('data', (chunk) => {
data.push(chunk);
console.log('data :', chunk, chunk.length);
});
readStream.on('end', () => {
console.log('end :', Buffer.concat(data).toString());
});
readStream.on('error', (err) => {
console.log('error :', err);
});
์ฝ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ
์ถ์ฒ: ์กฐํ์, ใNode.js ๊ต๊ณผ์ใ ๊ฐ์ ํ 3ํ, ๊ธธ๋ฒ(2022), 3-6์ฅ.
[๋ ธ๋ 2] 6์ฅ. ์ต์คํ๋ ์ค ์น ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2023.11.10 |
---|---|
[๋ ธ๋ 2] 5์ฅ. ํจํค์ง ๋งค๋์ (0) | 2023.11.03 |
[๋ ธ๋ 2] 4์ฅ. http ๋ชจ๋๋ก ์๋ฒ ๋ง๋ค๊ธฐ (0) | 2023.11.03 |
[๋ ธ๋ 2] 3์ฅ. ๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ (1) (1) | 2023.10.06 |
[๋ ธ๋ 2] 2์ฅ. ์์๋ฌ์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2023.09.29 |