[TIL] Day25
[SEB FE] Day25
๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ JS ๋ฐํ์
fs.readFile
: ๋ก์ปฌ์ ์กด์ฌํ๋ ํ์ผ์ ๋ด์ฉ ์ ์ฒด๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ์ด์ดpath
[, options
], callback
)path
: ํ์ผ ์ด๋ฆ (4๊ฐ์ง ํ์
๊ฐ๋ฅ - <string>
| <Buffer>
| <URL>
| <integer>
fs.readFile('/etc/passwd', ..., ...)
options
: ๋ฃ์ ์๋, ๋ฃ์ง ์์ ์๋ ์์ (๋ฌธ์์ด
| ๊ฐ์ฒด
ํํ ๊ฐ๋ฅ)let options ={
encoding: 'utf-8', // utf-8 ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก
flag: 'r' // ์ฝ๊ธฐ
}
fs.readFile('/etc/passwd', options, ...)
callback
: ์ฝ๋ฐฑ ํจ์ ์ ๋ฌ. ํ์ผ์ ์ฝ๊ณ ๋ ํ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ํจ์err
| data
)err
: ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด err
= null
data
: ํ์ผ ๋ด์ฉ (๋ฌธ์์ด | Buffer ๊ฐ์ฒด๊ฐ ์ ๋ฌ)
fs.readFile('test.txt', 'utf8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
fs.writeFile
: ํ์ผ ์ ์ฅํ ๋const fs = require('fs'); // file system module(fs) ๋ถ๋ฌ์ค๊ธฐ
3rd-party module
(์๋ ํํฐ ๋ชจ๋): ํด๋น ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ built-in ๋ชจ๋์ด ์๋ ๋ชจ๋ ์ธ๋ถ ๋ชจ๋// 3rd-party module download
npm install underscore
// ๋ชจ๋ ์ฌ์ฉ
const _ = require('underscore');
callback
,Promise
,async/await
๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ํ์ด ํ๋
โฐย new Promise()
๋ฅผ ํตํด ์์ฑํ Promise ์ธ์คํด์ค์ ์กด์ฌํ๋ ๋ฉ์๋
.then()
: ํ๋ก๋ฏธ์ค ์ดํ์ ์ฝ๋ฐฑ ๋ฐํ.catch()
: ํ๋ก๋ฏธ์ค ๊ฑฐ๋ถ์ ์ฝ๋ฐฑ ๋ฐํ.finally()
: ํ๋ก๋ฏธ์ค์ ์ดํ/๊ฑฐ๋ถ ์ฌ๋ถ์ ์๊ด์์ด ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ ํญ์ ํธ์ถโฐย ํ๋ก๋ฏธ์ค 3๊ฐ์ง ์ํ
Pending
(๋๊ธฐ): ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ
new Promise();
Fulfilled
(์ดํ): ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ํ
new Promise(function(resolve, reject) {
resolve();
});
Rejected
(๊ฑฐ๋ถ): ์ฐ์ฐ์ด ์คํจํ ์ํ
new Promise(function(resolve, reject) {
reject();
});
โฐย await
ํค์๋ ๋ค์์ ๋ฑ์ฅํ๋ ํจ์ ์คํ์ Promise
ํ์
์ ๋ฆฌํดํ ๊ฒฝ์ฐ์๋ง ์๋ฏธ๊ฐ ์์
callback
,Promise
,async/await
๋ฅผ ํ์ฉํ์ฌfs module
์ ์ฌ์ฉํด๋ณด๋ ํ์ด ํ๋
fs module
์ callback
์ ํตํด ํ์ผ ์ ๋ณด ์ฝ์ด์ค๊ธฐ
// fs module ๋ถ์ด์ค๊ธฐ
const fs = require('fs');
const getDataFromFile = function (filePath, callback) {
// 'utf8' encoding ํ์ง ์์ผ๋ฉด ํ๊ธ ๊นจ์ง ํ์ ๋ฐ์
fs.readFile(filePath, "utf8", (err, data) => {
if (err) { // ์๋ฌ๋ ๊ฒฝ์ฐ
callback(err, null); // ์๋ฌ ๋ถ๋ฌ์ด
} else { // ์๋ฌ๋์ง ์์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ
callback(null, data); // ํ์ผ ์ ๋ณด ์ฝ์ด์ค๊ธฐ
}
});
};
module.exports = {
getDataFromFile,
};
fs module
์ Promise
์ ํตํด ํ์ผ ์ ๋ณด ์ฝ์ด์ค๊ธฐ
const fs = require("fs");
const getDataFromFilePromise = (filePath) => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, "utf8", (err, data) => {
if (err) {
reject(err);
} else { // ์๋ฌ๊ฐ ๋์ง ์์ ๊ฒฝ์ฐ resolve ๋ฉ์๋ ์คํ -> ํ์ผ ์ ๋ณด ์ฝ์ด์ด
resolve(data);
}
});
});
};
2๊ฐ์ json ํ์ผ์ ๋ถ๋ฌ์จ ํ, ํฉ์ณ์ ๋ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฐฐ์ด ์ถ๋ ฅ
const path = require("path");
const { getDataFromFilePromise } = require("./02_promiseConstructor");
const user1Path = path.join(__dirname, "files/user1.json");
const user2Path = path.join(__dirname, "files/user2.json");
const readAllUsersChaining = () => {
let result = []; // ๋น ๋ฐฐ์ด ์ ์ธ
return getDataFromFilePromise(user1Path) // ์ฒซ๋ฒ์งธ ํ์ผ ์ ๋ณด ๊ฐ์ ธ์์
.then((data) => {
let data1 = JSON.parse(data); // json ํํ๋ก ๋ณํ
result.push(data1); // ๋น ๋ฐฐ๋ณ์ ์ฒซ๋ฒ์งธ ํ์ผ ๊ฐ์ฒด ๋ฃ์ด์ค
return getDataFromFilePromise(user2Path); // ๋๋ฒ์งธ ํ์ผ ์ ๋ณด ๊ฐ์ ธ์์
})
.then((data) => {
let data2 = JSON.parse(data); // json ํํ๋ก ๋ณํ
result.push(data2); // ์ฒซ๋ฒ์งธ ํ์ผ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ๋ฐฐ์ด์ ๋๋ฒ์งธ ํ์ผ ๊ฐ์ฒด ๋ฃ์ด์ค
return result; // ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ ํ์ผ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ ๋ฐฐ์ด ๋ฐํ
});
};
// JSON.parse() ์ ์ ํ์ผ ์ ๋ณด์๋ key&value ๋ชจ๋ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋์ด ์์
// JSON.parse() ํ์ ํ์ผ ๊ฐ์ฒด์ key๋ฅผ ๊ฐ์ธ๊ณ ์๋ ""์ด ์ ๊ฑฐ๋ ํํ๋ก ๋ณํํด์ค
Promise.all()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ 3๋ฒ์งธ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ ๊ฐ๋๋ก ๊ตฌํ
const readAllUsers = () => {
return Promise.all([ // ์ ๋ฌ์ธ์๋ฅผ ๋ฐฐ์ด ํํ๋ก ๋ฐ์
getDataFromFilePromise(user1Path),
getDataFromFilePromise(user2Path),
]).then((data) => data.map((el) => JSON.parse(el)));
};
โฐย Promise.all()
- ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ดํํ๊ฑฐ๋, ํ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋ ๋๊น์ง ๋๊ธฐํ๋ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํ
- ๋์์ 2๊ฐ ์ด์์ Promise ์์ฒญ์ ํ๊บผ๋ฒ์ ์คํํ๋ ํจ์
- Promise.all์ ์ ๋ฌ์ธ์๋ ๋ฐฐ์ด ํํ
Promise.all
์ ์ ๋ฌ์ธ์์ ๋ฐฐ์ด์ด ์ ๋ฌ๋๋ค๋ฉด, ์์ ์์๋Promise.all
์ Promise ์์์ ์์Promise.all
์ ์ ๋ฌ๋๋Promise
๋ ํ๋๋ผ๋ ๊ฑฐ๋ถ๋๋ ์๊ฐ ๋ชจ๋ ์์ฒญ์ด ๊ฑฐ๋ถ๋จ
๐ ๋ชจ๋Promise
์์ฒญ์ด ๊ฑฐ๋ถ๋๋ฉด์.catch
๋ฅผ ๋ฐ๋ผ๊ฐ.
async/await
์ฌ์ฉํ์ฌ ์์ ๊ฐ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ๊ตฌํ
const readAllUsersAsyncAwait = async () => {
let result = [];
let user1 = await getDataFromFilePromise(user1Path);
let user2 = await getDataFromFilePromise(user2Path);
let data1 = JSON.parse(user1);
let data2 = JSON.parse(user2);
result.push(data1, data2);
return result;
};