์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ ํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋๊ตฌ๋ก ํ๊ตฌํ๋ฉฐ, ๊ทธ ๊ธฐ๋ฅ, ํ๊ณ, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ์กฐ์์ ์ํ ์ค์ฉ์ ์ธ ์์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ: ์ ํ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ ๊ทผ๋ฒ
ECMAScript 2023์ ๋์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ดํฐ๋ ์ดํฐ ๋ฐ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ๋ค๋ฅธ ์ธ์ด์ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์์ ์ง์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ํจ์ํ ๋ฐ ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ์ดํฐ๋ ์ดํฐ ํฌํผ์ ๊ธฐ๋ฅ๊ณผ ํ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ์ค์ ์์ ๋ฅผ ํตํด ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๊ณ , ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ์ ๋ฏธ์น๋ ์ํฅ์ ๋ ผ์ํ ๊ฒ์ ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฌด์์ธ๊ฐ?
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ดํฐ๋ ์ดํฐ ๋ฐ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํ๋กํ ํ์
์์ ์ง์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋์
๋๋ค. ์ด๋ map, filter, reduce์ ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋์ ์ ์ฌํ๊ฒ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํ ์ฐ์ฐ์ ์ฐ๊ฒฐํ๋๋ก ์ค๊ณ๋์์ง๋ง, ์ ์ฌ์ ์ผ๋ก ๋ฌดํํ๊ฑฐ๋ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ์
์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ก๋ํ์ง ์๊ณ ๋ ์๋ํ ์ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค. ์ฃผ์ ํฌํผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
map: ์ดํฐ๋ ์ดํฐ์ ๊ฐ ์์๋ฅผ ๋ณํํฉ๋๋ค.filter: ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ์ ํํฉ๋๋ค.find: ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ฐํํฉ๋๋ค.some: ์ ์ด๋ ํ๋์ ์์๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํฉ๋๋ค.every: ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํฉ๋๋ค.reduce: ์์๋ค์ ๋จ์ผ ๊ฐ์ผ๋ก ๋์ ํฉ๋๋ค.toArray: ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
์ด๋ฌํ ํฌํผ๋ค์ ๋ ํจ์ํ์ ์ด๊ณ ์ ์ธ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ํนํ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ๋ค๋ฃฐ ๋ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ ์ฌ์ฉ์ ์ด์
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ ํต์ ์ธ ๋ฃจํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๋นํด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๊ฐ๊ฒฐ์ฑ: ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ฌ ๋ณํ ์์ ์ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๊ฐ๋ ์ฑ: ํจ์ํ ์คํ์ผ์ ์ฝ๋์ ๋ช ํ์ฑ์ ํฅ์์ํต๋๋ค.
- ์ง์ฐ ํ๊ฐ(Lazy Evaluation): ์ฐ์ฐ์ด ํ์ํ ๋๋ง ์ํ๋๋ฏ๋ก ์ ์ฌ์ ์ผ๋ก ๊ณ์ฐ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค. ์ด๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ ์ฌํ ๋์์ ํต์ฌ์ ์ธ ์ธก๋ฉด์ ๋๋ค.
- ํฉ์ฑ(Composition): ํฌํผ๋ค์ ํจ๊ป ์ฐ๊ฒฐํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ์ดํฐ๋ ์ดํฐ์ ํจ๊ป ์๋ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์์ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์
์์ 1: ์ซ์ ํํฐ๋ง ๋ฐ ๋งคํ
์ซ์ ์คํธ๋ฆผ์ด ์๊ณ , ์ฌ๊ธฐ์ ์ง์๋ฅผ ๊ฑธ๋ฌ๋ธ ๋ค์ ๋จ์ ํ์๋ฅผ ์ ๊ณฑํ๊ณ ์ถ์ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค.
function* generateNumbers(max) {
for (let i = 1; i <= max; i++) {
yield i;
}
}
const numbers = generateNumbers(10);
const squaredOdds = Array.from(numbers
.filter(n => n % 2 !== 0)
.map(n => n * n));
console.log(squaredOdds); // Output: [ 1, 9, 25, 49, 81 ]
์ด ์์ ๋ filter์ map์ ์ฐ๊ฒฐํ์ฌ ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ๋ณต์กํ ๋ณํ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. generateNumbers ํจ์๋ 1๋ถํฐ 10๊น์ง์ ์ซ์๋ฅผ ์์ฑํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ญ๋๋ค. filter ํฌํผ๋ ํ์๋ง ์ ํํ๊ณ , map ํฌํผ๋ ์ ํ๋ ๊ฐ ์ซ์๋ฅผ ์ ๊ณฑํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก Array.from์ ๊ฒฐ๊ณผ ์ดํฐ๋ ์ดํฐ๋ฅผ ์๋นํ์ฌ ์ฝ๊ฒ ๊ฒ์ฌํ ์ ์๋๋ก ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
์์ 2: ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์๋ ํจ๊ป ์๋ํ๋ฏ๋ก ๋คํธ์ํฌ ์์ฒญ์ด๋ ํ์ผ ์คํธ๋ฆผ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
asyn`c function* fetchUsers(url) {
let page = 1;
while (true) {
const response = await fetch(`${url}?page=${page}`);
if (!response.ok) {
break; // Stop if there's an error or no more pages
}
const data = await response.json();
if (data.length === 0) {
break; // Stop if the page is empty
}
for (const user of data) {
yield user;
}
page++;
}
}
async function processUsers() {
const users = fetchUsers('https://api.example.com/users');
const activeUserEmails = [];
for await (const user of users.filter(user => user.isActive).map(user => user.email)) {
activeUserEmails.push(user);
}
console.log(activeUserEmails);
}
processUsers();
`
์ด ์์ ์์ fetchUsers๋ ํ์ด์ง๋ค์ด์
๋ API๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์์
๋๋ค. filter ํฌํผ๋ ํ์ฑ ์ฌ์ฉ์๋ง ์ ํํ๊ณ , map ํฌํผ๋ ๊ทธ๋ค์ ์ด๋ฉ์ผ์ ์ถ์ถํฉ๋๋ค. ๊ฒฐ๊ณผ ์ดํฐ๋ ์ดํฐ๋ for await...of ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ด๋ฉ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋น๋ฉ๋๋ค. `Array.from`์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ง์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ๋ณตํด์ผ ํ๋ค๋ ์ ์ ์ ์ํ์ธ์.
์์ 3: ํ์ผ ๋ฐ์ดํฐ ์คํธ๋ฆผ ์์
๋์ฉ๋ ๋ก๊ทธ ํ์ผ์ ํ ์ค์ฉ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๊ฐํด ๋ด ์๋ค. ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ์ค์ ์ฝ์ ๋๋ง๋ค ์ฒ๋ฆฌํ์ฌ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
const fs = require('fs');
const readline = require('readline');
async function* readLines(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
yield line;
}
}
async function processLogFile(filePath) {
const logLines = readLines(filePath);
const errorMessages = [];
for await (const errorMessage of logLines.filter(line => line.includes('ERROR')).map(line => line.trim())){
errorMessages.push(errorMessage);
}
console.log('Error messages:', errorMessages);
}
// Example usage (assuming you have a 'logfile.txt')
processLogFile('logfile.txt');
์ด ์์ ๋ Node.js์ fs์ readline ๋ชจ๋์ ํ์ฉํ์ฌ ๋ก๊ทธ ํ์ผ์ ํ ์ค์ฉ ์ฝ์ต๋๋ค. readLines ํจ์๋ ํ์ผ์ ๊ฐ ์ค์ ์์ฑํ๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ญ๋๋ค. filter ํฌํผ๋ 'ERROR'๋ผ๋ ๋จ์ด๋ฅผ ํฌํจํ๋ ์ค์ ์ ํํ๊ณ , map ํฌํผ๋ ์๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ธ ์ค๋ฅ ๋ฉ์์ง๋ ์์ง๋์ด ํ์๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์ฒด ๋ก๊ทธ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒ์ ํผํ๋ฏ๋ก ๋งค์ฐ ํฐ ํ์ผ์ ์ ํฉํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ์ ํ๊ณ
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฐ์ดํฐ ์กฐ์์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ช ๊ฐ์ง ํ๊ณ๋ ์์ต๋๋ค:
- ์ ํ๋ ๊ธฐ๋ฅ: ์ ์ฉ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ์๋์ ์ผ๋ก ์ ์ ์์ ์ฐ์ฐ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, `flatMap`, `groupBy` ๋๋ ์๋์ ์ฐ์ฐ์ ํด๋นํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ ๋ถ์ฌ: ์ดํฐ๋ ์ดํฐ ํ์ดํ๋ผ์ธ ๋ด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ณต์กํ ์ ์์ผ๋ฉฐ ํฌํผ ์์ฒด์์ ์ง์ ์ง์ํ์ง ์์ต๋๋ค. ์ดํฐ๋ ์ดํฐ ์ฐ์ฐ์ try/catch ๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ผ ํ ๊ฒ์ ๋๋ค.
- ๋ถ๋ณ์ฑ ๋ฌธ์ : ๊ฐ๋ ์ ์ผ๋ก๋ ํจ์ํ์ด์ง๋ง, ๋ฐ๋ณต ์ค์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์์ค๋ฅผ ์์ ํ๋ฉด ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค.
- ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ: ์ง์ฐ ํ๊ฐ๋ ์ฅ์ ์ด์ง๋ง, ๊ณผ๋ํ ์ฐ์ฐ ์ฒด์ธ์ ์ฌ๋ฌ ์ค๊ฐ ์ดํฐ๋ ์ดํฐ ์์ฑ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ ์ ํ ๋ฒค์น๋งํน์ด ํ์์ ์ ๋๋ค.
- ๋๋ฒ๊น : ์ดํฐ๋ ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ํนํ ๋ณต์กํ ๋ณํ์ด๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํ์ค ๋๋ฒ๊น ๋๊ตฌ๋ ์ดํฐ๋ ์ดํฐ์ ์ํ์ ๋ํ ์ถฉ๋ถํ ๊ฐ์์ฑ์ ์ ๊ณตํ์ง ๋ชปํ ์ ์์ต๋๋ค.
- ์ทจ์: ์งํ ์ค์ธ ๋ฐ๋ณต ํ๋ก์ธ์ค๋ฅผ ์ทจ์ํ ์ ์๋ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ด๋ ์๋ฃํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ค๋ฃฐ ๋ ํนํ ์ค์ํฉ๋๋ค. ์์ ๋ง์ ์ทจ์ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํฌํผ์ ๋์
์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ํ์๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ์ ๋ถ์ถฉ๋ถํ ๊ฒฝ์ฐ, ๋ค์ ๋์์ ๊ณ ๋ คํด ๋ณด์ธ์:
- ๋ฐฐ์ด ๋ฉ์๋: ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ ์์ ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ,
map,filter,reduce์ ๊ฐ์ ์ ํต์ ์ธ ๋ฐฐ์ด ๋ฉ์๋๊ฐ ๋ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ผ ์ ์์ต๋๋ค. - RxJS (Reactive Extensions for JavaScript): ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๋ค์ํ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Highland.js: ๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ฌ์ฉ ํธ์์ฑ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์์น์ ์ค์ ์ ๋ก๋๋ค.
- Node.js ์คํธ๋ฆผ: Node.js์ ๋ด์ฅ ์คํธ๋ฆผ API๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋ํ ๋ ๋ฎ์ ์์ค์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉฐ, ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ํ ๋ ํฐ ์ ์ด๊ถ์ ๋ถ์ฌํฉ๋๋ค.
- ํธ๋์ค๋์(Transducers): ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ์๋์ง๋ง, ํธ๋์ค๋์๋ ๋ฐ์ดํฐ ๋ณํ์ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฉํ ์ ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ๋๋ค. Ramda์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํธ๋์ค๋์ ์ง์์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ง์ฐ ํ๊ฐ๋ผ๋ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ด๋ ๋ณต์กํ ๋ณํ์ ๋ค๋ฃฐ ๋๋ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฒด์ธ์ ์ฑ๋ฅ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ค์์ ์ ๋ ํด์ผ ํ ๋ช ๊ฐ์ง ํต์ฌ ์ฌํญ์ ๋๋ค:
- ์ดํฐ๋ ์ดํฐ ์์ฑ ์ค๋ฒํค๋: ๊ฐ ์ฒด์ธ๋ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์๋ก์ด ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ๊ณผ๋ํ ์ฒด์ด๋์ ์ด๋ฌํ ๊ฐ์ฒด์ ๋ฐ๋ณต์ ์ธ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ก ์ธํด ๋์ ๋๋ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์ค๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์ผ๋ถ ์ฐ์ฐ, ํนํ `Array.from`๊ณผ ๊ฒฐํฉ๋ ๋, ์ฒ๋ฆฌ๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ๋ฐฐ์ด๋ก ๊ตฌ์ฒดํํ์ฌ ์ง์ฐ ํ๊ฐ์ ์ด์ ์ ์์ํ ์ ์์ต๋๋ค.
- ๋จ๋ฝ ํ๊ฐ(Short-circuiting): ๋ชจ๋ ํฌํผ๊ฐ ๋จ๋ฝ ํ๊ฐ๋ฅผ ์ง์ํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, `find`๋ ์ผ์นํ๋ ์์๋ฅผ ์ฐพ๋ ์ฆ์ ๋ฐ๋ณต์ ์ค๋จํฉ๋๋ค. `some`๊ณผ `every`๋ ๊ฐ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋จ๋ฝ ํ๊ฐ๋ฅผ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ `map`๊ณผ `filter`๋ ํญ์ ์ ์ฒด ์ ๋ ฅ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฐ์ฐ์ ๋ณต์ก์ฑ: `map`, `filter`, `reduce`์ ๊ฐ์ ํฌํผ์ ์ ๋ฌ๋๋ ํจ์์ ๊ณ์ฐ ๋น์ฉ์ ์ ์ฒด ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ฌํ ํจ์๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋น๋๊ธฐ ์ฐ์ฐ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ์ฐ์ฐ์ ๋น๋๊ธฐ์ ํน์ฑ์ผ๋ก ์ธํด ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํต๋๋ค. ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ํผํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ฐ์ฐ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์ต์ ํ ์ ๋ต
- ๋ฒค์น๋งํฌ: ๋ฒค์น๋งํน ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฒด์ธ์ ์ฑ๋ฅ์ ์ธก์ ํ์ธ์. ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ์ธ์. `Benchmark.js`์ ๊ฐ์ ๋๊ตฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฒด์ด๋ ์ค์ด๊ธฐ: ๊ฐ๋ฅํ ๋๋ง๋ค ์ฌ๋ฌ ์ฐ์ฐ์ ๋จ์ผ ํฌํผ ํธ์ถ๋ก ๊ฒฐํฉํ์ฌ ์ค๊ฐ ์ดํฐ๋ ์ดํฐ์ ์๋ฅผ ์ค์ด์ธ์. ์๋ฅผ ๋ค์ด, `iterator.filter(...).map(...)` ๋์ ํํฐ๋ง๊ณผ ๋งคํ ๋ก์ง์ ๊ฒฐํฉํ ๋จ์ผ `map` ์ฐ์ฐ์ ๊ณ ๋ คํ์ธ์.
- ๋ถํ์ํ ๊ตฌ์ฒดํ ํผํ๊ธฐ: `Array.from`์ ์ ์ฒด ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ ๋ก ๋ฐฐ์ด๋ก ๊ตฌ์ฒดํํ๋ฏ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ฌ์ฉ์ ํผํ์ธ์. ์์๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ `for...of` ๋ฃจํ ๋๋ (๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ๊ฒฝ์ฐ) `for await...of` ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ฝ๋ฐฑ ํจ์ ์ต์ ํ: ์ดํฐ๋ ์ดํฐ ํฌํผ์ ์ ๋ฌ๋๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ฐ๋ฅํ ํ ํจ์จ์ ์ธ์ง ํ์ธํ์ธ์. ์ด๋ฌํ ํจ์ ๋ด์์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ์ ํผํ์ธ์.
- ๋์ ๊ณ ๋ ค: ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ, ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ ๋์ ์ฑ๋ฅ ํน์ฑ์ ์ ๊ณตํ ์ ์๋ ์ ํต์ ์ธ ๋ฃจํ๋ ์ ์ฉ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ์ธ์.
์ค์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์์
์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ ์ฉํจ์ด ์ ์ฆ๋์์ต๋๋ค:
- ๋ฐ์ดํฐ ๋ณํ ํ์ดํ๋ผ์ธ: API, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ํ์ผ๊ณผ ๊ฐ์ ๋ค์ํ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ , ๋ณํ ๋ฐ ๋ณด๊ฐํฉ๋๋ค.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ: ์ฌ์ฉ์ ์ํธ์์ฉ, ์ผ์ ๋ฐ์ดํฐ ๋๋ ์์คํ ๋ก๊ทธ๋ก๋ถํฐ์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋ถ์: ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์์ ์ ์๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ๋ํ ๊ณ์ฐ ๋ฐ ์ง๊ณ๋ฅผ ์ํํฉ๋๋ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๊ธ์ต ์์ฅ์ด๋ ์์ ๋ฏธ๋์ด ํผ๋์ ๊ฐ์ ์์ค๋ก๋ถํฐ์ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ETL (์ถ์ถ, ๋ณํ, ์ ์ฌ) ํ๋ก์ธ์ค: ๋ค์ํ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ , ์ํ๋ ํ์์ผ๋ก ๋ณํํ ํ, ๋์ ์์คํ ์ ์ ์ฌํ๋ ETL ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํฉ๋๋ค.
์์ : ์ ์์๊ฑฐ๋ ๋ฐ์ดํฐ ๋ถ์
์ธ๊ธฐ ์ํ๊ณผ ๊ณ ๊ฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์๋ณํ๊ธฐ ์ํด ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํด์ผ ํ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์๊ฐํด ๋ด ์๋ค. ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ฉฐ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ํตํด ์ ๊ทผ๋ฉ๋๋ค. ๋ค์ ์ฝ๋ ์ค๋ํซ์ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ถ์์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
async function* fetchOrdersFromDatabase() { /* ... */ }
async function analyzeOrders() {
const orders = fetchOrdersFromDatabase();
const productCounts = new Map();
for await (const order of orders) {
for (const item of order.items) {
const productName = item.name;
productCounts.set(productName, (productCounts.get(productName) || 0) + item.quantity);
}
}
const sortedProducts = Array.from(productCounts.entries())
.sort(([, countA], [, countB]) => countB - countA);
console.log('Top 10 Products:', sortedProducts.slice(0, 10));
}
analyzeOrders();
์ด ์์ ์์๋ ์ดํฐ๋ ์ดํฐ ํฌํผ๊ฐ ์ง์ ์ฌ์ฉ๋์ง๋ ์์์ง๋ง, ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ํตํด ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ์ฃผ๋ฌธ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์์๋ ๋ถ์์ ๊ฐํํ๊ธฐ ์ํด `map`, `filter`, `reduce` ํฌํผ๋ฅผ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
์ ์ญ์ ๊ณ ๋ ค์ฌํญ ๋ฐ ํ์งํ
์ ์ญ์ ์ธ ๋งฅ๋ฝ์์ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฌธํ์ ์ฐจ์ด์ ํ์งํ ์๊ตฌ์ฌํญ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ณ ๋ ค์ฌํญ์ ๋๋ค:
- ๋ ์ง ๋ฐ ์๊ฐ ํ์: ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ ์ง ๋ฐ ์๊ฐ ํ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋๋ก ํ์ธ์. `Intl`์ด๋ `Moment.js`์ ๊ฐ์ ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ง์ ์๊ฐ์ ์ ์ ํ๊ฒ ํฌ๋งทํ ํ์ธ์.
- ์ซ์ ํ์: `Intl.NumberFormat` API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ์ซ์๋ฅผ ํฌ๋งทํ ํ์ธ์. ์ฌ๊ธฐ์๋ ์์์ ๊ตฌ๋ถ ๊ธฐํธ, ์ฒ ๋จ์ ๊ตฌ๋ถ ๊ธฐํธ ๋ฐ ํตํ ๊ธฐํธ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋ฉ๋๋ค.
- ํตํ ๊ธฐํธ: ์ฌ์ฉ์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ํตํ ๊ธฐํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ์ธ์. `Intl.NumberFormat` API๋ฅผ ์ฌ์ฉํ์ฌ ํตํ ๊ฐ์ ์ ์ ํ๊ฒ ํฌ๋งทํ ํ์ธ์.
- ํ ์คํธ ๋ฐฉํฅ: ์๋์ด ๋ฐ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ ์ธ์ด์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ํ ์คํธ ๋ฐฉํฅ์ ์ธ์งํ์ธ์. UI์ ๋ฐ์ดํฐ ํํ์ด RTL ๋ ์ด์์๊ณผ ํธํ๋๋์ง ํ์ธํ์ธ์.
- ๋ฌธ์ ์ธ์ฝ๋ฉ: ๋ค๋ฅธ ์ธ์ด์ ๋ค์ํ ๋ฌธ์๋ฅผ ์ง์ํ๊ธฐ ์ํด UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ธ์.
- ๋ฒ์ญ ๋ฐ ํ์งํ: ๋ชจ๋ ์ฌ์ฉ์ ๋๋ฉด ํ ์คํธ๋ฅผ ์ฌ์ฉ์์ ์ธ์ด๋ก ๋ฒ์ญํ์ธ์. ํ์งํ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ญ์ ๊ด๋ฆฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ํ๊ฒ ํ์งํ๋์๋์ง ํ์ธํ์ธ์.
- ๋ฌธํ์ ๋ฏผ๊ฐ์ฑ: ๋ฌธํ์ ์ฐจ์ด๋ฅผ ์ ๋ ํ๊ณ ํน์ ๋ฌธํ์์ ๊ณต๊ฒฉ์ ์ด๊ฑฐ๋ ๋ถ์ ์ ํ ์ ์๋ ์ด๋ฏธ์ง, ์์ง ๋๋ ์ธ์ด ์ฌ์ฉ์ ํผํ์ธ์.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ ๋ฐ์ดํฐ ์กฐ์์ ์ํ ๊ฐ์น ์๋ ๋๊ตฌ๋ก, ํจ์ํ ๋ฐ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ ๊ณตํฉ๋๋ค. ์ ์ฉ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ฒดํ ์๋ ์์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์์ ์ง์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ํธ๋ฆฌํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ๋ก์ ํธ์์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๊ทธ ๊ธฐ๋ฅ๊ณผ ํ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ ๋ค๋ฃฐ ๋๋ ์ฝ๋๋ฅผ ๋ฒค์น๋งํนํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ฑ๋ฅ, ํ์ฅ์ฑ ๋ฐ ์ ์ญ์ ๊ณ ๋ ค์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ์ดํฐ๋ ์ดํฐ ํฌํผ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.