Iterator Helperλ₯Ό νμ©νμ¬ JavaScriptμμ νμ΄νλΌμΈ ν¨μ¨μ±μ κ·ΉλννμΈμ. ES2023μ map, filter, reduce κΈ°λ₯μ΄ μ μ μ ν리μΌμ΄μ μ μ§μ° νκ°, λ©λͺ¨λ¦¬ μ΅μ ν, λ°μ΄ν° μ€νΈλ¦Ό μ²λ¦¬ ν₯μμ μ΄λ»κ² λλμ§ νμ ν©λλ€.
JavaScript μ΄ν°λ μ΄ν° ν¬νΌ μ€νΈλ¦Ό μ΅μ ν λꡬ: μ΅μ κ°λ°μμ νμ΄νλΌμΈ ν¨μ¨μ± ν₯μ
\n\nκΈλ³νλ κΈλ‘λ² μννΈμ¨μ΄ κ°λ° νκ²½μμ λ°μ΄ν° μ€νΈλ¦Όμ ν¨μ¨μ μΈ μ²λ¦¬λ λ§€μ° μ€μν©λλ€. κΈμ΅ κΈ°κ΄μ μ€μκ° λΆμ λμ보λλΆν° μ μμκ±°λ νλ«νΌμ λκ·λͺ¨ λ°μ΄ν° λ³ν, IoT μ₯μΉμ κ²½λ μ²λ¦¬κΉμ§, μ μΈκ³ κ°λ°μλ€μ λ°μ΄ν° νμ΄νλΌμΈμ μ΅μ νν λ°©λ²μ λμμμ΄ λͺ¨μν©λλ€. 보νΈμ μΈ μΈμ΄μΈ JavaScriptλ μ΄λ¬ν μꡬλ₯Ό μΆ©μ‘±νκΈ° μν΄ μ§μμ μΌλ‘ ν₯μλμμ΅λλ€. ECMAScript 2023 (ES2023)μ μ΄ν°λ μ΄ν° ν¬νΌκ° λμ λλ©΄μ, μ΄ν°λ¬λΈ λ°μ΄ν°λ₯Ό μ‘°μνκΈ° μν κ°λ ₯νκ³ μ μΈμ μ΄λ©° ν¨μ¨μ μΈ λꡬλ₯Ό μ 곡νλ©° μ€μν λ°μ μ μ΄λ£¨μμ΅λλ€. μ΄ μ’ ν© κ°μ΄λλ μ΄ν°λ μ΄ν° ν¬νΌκ° μ΄λ»κ² μ€νΈλ¦Ό μ΅μ ν λꡬ μν μ νμ¬ νμ΄νλΌμΈ ν¨μ¨μ±μ λμ΄κ³ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μ΄λ©° κΆκ·Ήμ μΌλ‘ κ°λ°μλ€μ΄ μ μΈκ³μ μΌλ‘ λ μ±λ₯μ΄ λ°μ΄λκ³ μ μ§ κ΄λ¦¬νκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μ§μνλμ§ νꡬν κ²μ λλ€.
\n\nJavaScriptμμ ν¨μ¨μ μΈ λ°μ΄ν° νμ΄νλΌμΈμ λν κΈλ‘λ² μꡬ
\n\nκ·λͺ¨λ λλ©μΈμ κ΄κ³μμ΄ μ΅μ μ ν리μΌμ΄μ μ λ³Έμ§μ μΌλ‘ λ°μ΄ν° κΈ°λ°μ λλ€. μ격 APIμμ μ¬μ©μ νλ‘νμ κ°μ Έμ€κ±°λ, μΌμ λ°μ΄ν°λ₯Ό μ²λ¦¬νκ±°λ, νμλ₯Ό μν΄ λ³΅μ‘ν JSON ꡬ쑰λ₯Ό λ³ννλ λ± λ°μ΄ν° νλ¦μ μ§μμ μ΄λ©° μ’ μ’ μλΉν©λλ€. μ ν΅μ μΈ JavaScript λ°°μ΄ λ©μλλ λ§€μ° μ μ©νμ§λ§, νΉν λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό λ€λ£¨κ±°λ μ¬λ¬ μμ μ μ°κ²°ν λ μ±λ₯ λ³λͺ© νμκ³Ό λ©λͺ¨λ¦¬ μλΉ μ¦κ°λ₯Ό μ΄λν μ μμ΅λλ€.
\n\nμ±λ₯ λ° μλ΅μ±μ λν μ¦κ°νλ μꡬ
\nμ μΈκ³ μ¬μ©μλ€μ μ ν리μΌμ΄μ μ΄ λΉ λ₯΄κ³ , λ°μμ±μ΄ μ’μΌλ©°, ν¨μ¨μ μ΄κΈ°λ₯Ό κΈ°λν©λλ€. λλ¦° UI, μ§μ°λ λ°μ΄ν° λ λλ§ λλ κ³Όλν 리μμ€ μλΉλ μ¬μ©μ κ²½νμ ν¬κ² μ νμμΌ μ°Έμ¬ λ° μ±νλ₯ κ°μλ‘ μ΄μ΄μ§ μ μμ΅λλ€. κ°λ°μλ€μ λλμμ κ³ μ κ΄μ¬μ λ€νΈμν¬λΆν° μ격 μ§μμ λλ¦° μ°κ²°μ μ΄λ₯΄κΈ°κΉμ§ λ€μν μ₯μΉ λ° λ€νΈμν¬ μ‘°κ±΄μμ μννκ² μλνλ κ³ λλ‘ μ΅μ νλ μ루μ μ μ 곡ν΄μΌ νλ€λ λμμλ μλ°μ λ°κ³ μμ΅λλ€.
\n\nμ ν΅μ μΈ λ°λ³΅ λ©μλμ λ¬Έμ μ
\nμΌλ°μ μΈ μλ리μ€λ₯Ό μκ°ν΄ λ΄
μλ€. λκ·λͺ¨ κ°μ²΄ λ°°μ΄μ νν°λ§νκ³ , λ¨μ κ°μ²΄λ₯Ό λ³νν λ€μ, μ΄λ₯Ό μ§κ³ν΄μΌ ν©λλ€. .filter() λ° .map()κ³Ό κ°μ μ ν΅μ μΈ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ©΄ κ° μμ
λ§λ€ μ€κ° λ°°μ΄μ΄ μμ±λλ κ²½μ°κ° λ§μ΅λλ€. μ΄ μ κ·Ό λ°©μμ μμ λ°μ΄ν° μΈνΈμμλ κ°λ
μ±μ΄ μ’κ³ κ΄μ©μ μ΄μ§λ§, λκ·λͺ¨ λ°μ΄ν° μ€νΈλ¦Όμ μ μ©λ λλ μ±λ₯ λ° λ©λͺ¨λ¦¬ μλͺ¨μ μμΈμ΄ λ μ μμ΅λλ€. κ° μ€κ° λ°°μ΄μ λ©λͺ¨λ¦¬λ₯Ό μλΉνλ©°, μ΅μ’
κ²°κ³Όμ μΌλΆλ§ νμνλλΌλ κ° λ¨κ³λ§λ€ μ 체 λ°μ΄ν° μΈνΈλ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€. μ΄λ¬ν "μ¦μ(eager)" νκ°λ λ©λͺ¨λ¦¬ μ μ½μ΄ μλ νκ²½μ΄λ 무νν λ°μ΄ν° μ€νΈλ¦Όμ μ²λ¦¬ν λ νΉν λ¬Έμ κ° λ μ μμ΅λλ€.
JavaScriptμ μ΄ν°λ μ΄ν°μ μ΄ν°λ¬λΈ μ΄ν΄
\n\nμ΄ν°λ μ΄ν° ν¬νΌμ λν΄ μμΈν μμ보기 μ μ, JavaScriptμ μ΄ν°λ μ΄ν°μ μ΄ν°λ¬λΈμ κΈ°λ³Έ κ°λ μ νμ νλ κ²μ΄ μ€μν©λλ€. μ΄λ€μ λ°μ΄ν° μ€νΈλ¦Όμ΄ ν¨μ¨μ μΌλ‘ μ²λ¦¬λλ λ°©μμ νμμ μ λλ€.
\n\nμ΄ν°λ¬λΈμ΄λ?
\nμ΄ν°λ¬λΈμ μ€μ€λ‘λ₯Ό λ°λ³΅(iterate)ν μ μλ λ°©λ²μ μ μνλ κ°μ²΄μ
λλ€. JavaScriptμμλ Array, String, Map, Set, NodeListλ₯Ό ν¬ν¨νμ¬ λ§μ λ΄μ₯ νμ
μ΄ μ΄ν°λ¬λΈμ
λλ€. κ°μ²΄κ° μ΄ν°λ¬λΈμ΄λΌλ κ²μ λ°λ³΅ νλ‘ν μ½μ ꡬννλ€λ μλ―Έμ΄λ©°, μ΄λ μ΄ν°λ μ΄ν°λ₯Ό λ°ννλ [Symbol.iterator]λ₯Ό ν΅ν΄ μ κ·Όν μ μλ λ©μλλ₯Ό κ°μ§κ³ μμμ λ»ν©λλ€.
μ΄ν°λ¬λΈμ μμ:
\nconst myArray = [1, 2, 3]; // λ°°μ΄μ μ΄ν°λ¬λΈμ
λλ€
μ΄ν°λ μ΄ν°λ?
\nμ΄ν°λ μ΄ν°λ 컬λ μ
μμ νλͺ©μ ν λ²μ νλμ© μ‘μΈμ€νλ λ°©λ²μ μκ³ μμΌλ©°, ν΄λΉ μνμ€ λ΄μμ νμ¬ μμΉλ₯Ό μΆμ νλ κ°μ²΄μ
λλ€. μ΄ν°λ μ΄ν°λ λ κ°μ§ μμ±μ κ°μ§ κ°μ²΄λ₯Ό λ°ννλ .next() λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€. μ΄ μμ±λ€μ value(μνμ€μ λ€μ νλͺ©)μ done(λ°λ³΅μ΄ μλ£λμλμ§ μ¬λΆλ₯Ό λνλ΄λ λΆλ¦¬μΈ κ°)μ
λλ€.
μ΄ν°λ μ΄ν° μΆλ ₯μ μμ:
\n{ value: 1, done: false }
{ value: undefined, done: true }
for...of 루ν: μ΄ν°λ¬λΈμ μλΉμ
\nfor...of 루νλ JavaScriptμμ μ΄ν°λ¬λΈμ μλΉνλ κ°μ₯ μΌλ°μ μΈ λ°©λ²μ
λλ€. μ΄ν°λ¬λΈμ [Symbol.iterator] λ©μλμ μ§μ μνΈμμ©νμ¬ μ΄ν°λ μ΄ν°λ₯Ό μ»κ³ , doneμ΄ trueκ° λ λκΉμ§ .next()λ₯Ό λ°λ³΅μ μΌλ‘ νΈμΆν©λλ€.
for...of μ¬μ© μμ:
const numbers = [10, 20, 30];
for (const num of numbers) {
console.log(num);
}
// μΆλ ₯: 10, 20, 30
μ΄ν°λ μ΄ν° ν¬νΌ (ES2023) μκ°
\n\nμ΄μ ES2023μ μΌλΆμΈ μ΄ν°λ μ΄ν° ν¬νΌ μ μμ Iterator.prototypeμ μ§μ μ νΈλ¦¬ν° λ©μλ μΈνΈλ₯Ό μ 곡νμ¬ μ΄ν°λ μ΄ν°μ κΈ°λ₯μ ν¬κ² νμ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ map, filter, reduceμ κ°μ μΌλ°μ μΈ ν¨μν νλ‘κ·Έλλ° ν¨ν΄μ λ¨Όμ λ°°μ΄λ‘ λ³ννμ§ μκ³ λ λͺ¨λ μ΄ν°λ¬λΈμ μ§μ μ μ©ν μ μμ΅λλ€. μ΄κ²μ΄ λ°λ‘ μ΄ν°λ μ΄ν° ν¬νΌμ "μ€νΈλ¦Ό μ΅μ ν" κΈ°λ₯μ ν΅μ¬μ
λλ€.
μ΄ν°λ μ΄ν° ν¬νΌλ 무μμΈκ°μ?
\nλ³Έμ§μ μΌλ‘ μ΄ν°λ μ΄ν° ν¬νΌλ λ°λ³΅ νλ‘ν μ½μ λ°λ₯΄λ λͺ¨λ κ°μ²΄μμ νΈμΆν μ μλ μλ‘μ΄ λ©μλ μΈνΈλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν λ©μλλ μ§μ°μ μΌλ‘ μλν©λλ€. μ¦, μ 체 컬λ μ μ 미리 μ²λ¦¬νκ³ μ€κ° 컬λ μ μ μμ±νλ λμ , μμ²μ΄ μμ λλ§λ€ μμλ₯Ό νλμ© μ²λ¦¬ν©λλ€. μ΄λ¬ν λ°μ΄ν° μ²λ¦¬μ "ν(pull)" λͺ¨λΈμ μ±λ₯μ μ€μν μλ리μ€μμ λ§€μ° ν¨μ¨μ μ λλ€.
\n\nν΄κ²°νλ λ¬Έμ : μ¦μ νκ° vs. μ§μ° νκ°
\nμ ν΅μ μΈ λ°°μ΄ λ©μλλ μ¦μ νκ°λ₯Ό μνν©λλ€. λ°°μ΄μμ .map()μ νΈμΆνλ©΄ λ³νλ μμλ₯Ό ν¬ν¨νλ μμ ν μλ‘μ΄ λ°°μ΄μ μ¦μ μμ±ν©λλ€. κ·Έλ° λ€μ ν΄λΉ κ²°κ³Όμ λν΄ .filter()λ₯Ό νΈμΆνλ©΄ λ λ€λ₯Έ μ λ°°μ΄μ΄ μμ±λ©λλ€. μ΄λ μμ λ°°μ΄μ μμ±νκ³ κ°λΉμ§ 컬λ μ
νλ μ€λ²ν€λλ‘ μΈν΄ λκ·λͺ¨ λ°μ΄ν° μΈνΈμμ λΉν¨μ¨μ μΌ μ μμ΅λλ€. μ΄μ λμ‘°μ μΌλ‘ μ΄ν°λ μ΄ν° ν¬νΌλ μ§μ° νκ°λ₯Ό μ¬μ©ν©λλ€. μ΄ν°λ μ΄ν° ν¬νΌλ μμ²μ΄ μμ λλ§ κ°μ κ³μ°νκ³ μμ±νμ¬ λΆνμν μ€κ° λ°μ΄ν° ꡬ쑰 μμ±μ λ°©μ§ν©λλ€.
μ΄ν°λ μ΄ν° ν¬νΌκ° λμ ν μ£Όμ λ©μλ
\nμ΄ν°λ μ΄ν° ν¬νΌ μ¬μμ λͺ κ°μ§ κ°λ ₯ν λ©μλλ₯Ό λμ ν©λλ€:
\n- \n
.map(mapperFunction): μ 곡λ ν¨μλ₯Ό μ¬μ©νμ¬ κ° μμλ₯Ό λ³ννκ³ , λ³νλ μμμ μ μ΄ν°λ μ΄ν°λ₯Ό μμ±ν©λλ€. \n .filter(predicateFunction): μ£Όμ΄μ§ 쑰건μ λ§μ‘±νλ μμλ₯Ό μ ννκ³ , νν°λ§λ μμμ μ μ΄ν°λ μ΄ν°λ₯Ό μμ±ν©λλ€. \n .take(count): μ΄ν°λ μ΄ν°μ μμλΆν° μ΅λcountκ°μ μμλ₯Ό μμ±ν©λλ€. \n .drop(count): μ²μcountκ°μ μμλ₯Ό 건λλ°κ³ λλ¨Έμ§λ₯Ό μμ±ν©λλ€. \n .flatMap(mapperFunction): κ° μμλ₯Ό μ΄ν°λ¬λΈμ λ§€ννκ³ κ²°κ³Όλ₯Ό λ¨μΌ μ΄ν°λ μ΄ν°λ‘ νννν©λλ€. \n .reduce(reducerFunction, initialValue): λμ°κΈ°μ κ° μμμ λν΄ ν¨μλ₯Ό μ μ©νμ¬ μ΄ν°λ μ΄ν°λ₯Ό λ¨μΌ κ°μΌλ‘ μ€μ λλ€. \n .toArray(): μ 체 μ΄ν°λ μ΄ν°λ₯Ό μλΉνκ³ μμ±λ λͺ¨λ μμλ₯Ό ν¬ν¨νλ λ°°μ΄μ λ°νν©λλ€. μ΄κ²μ μ¦μ(eager) ν°λ―Έλ μμ μ λλ€. \n .forEach(callback): κ° μμμ λν΄ μ 곡λ μ½λ°± ν¨μλ₯Ό ν λ² μ€νν©λλ€. μ΄κ²λ ν°λ―Έλ μμ μ λλ€. \n
μ΄ν°λ μ΄ν° ν¬νΌλ‘ ν¨μ¨μ μΈ λ°μ΄ν° νμ΄νλΌμΈ ꡬμΆ
\n\nμ΄μ μ΄λ¬ν λ©μλλ₯Ό ν¨κ» μ°κ²°νμ¬ κ³ λλ‘ ν¨μ¨μ μΈ λ°μ΄ν° μ²λ¦¬ νμ΄νλΌμΈμ ꡬμΆνλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. κ΅μ μ‘°μ§μ μΌλ°μ μΈ κ³Όμ μΈ κΈλ‘λ² IoT μ₯μΉ λ€νΈμν¬μμ μΌμ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ κ°μμ μλ리μ€λ₯Ό μ¬μ©νκ² μ΅λλ€.
\n\nλ³νμ μν .map(): λ°μ΄ν° νμ νμ€ν
\nμ μΈκ³ λ€μν IoT μ₯μΉμμ μμ¨ λλ νμ¨λ‘ μ¨λκ° λ³΄κ³ λ μ μλ μΌμ νλ κ°μ λ°λλ€κ³ μμν΄ λ΄ μλ€. λͺ¨λ μ¨λλ₯Ό μμ¨λ‘ νμ€ννκ³ μ²λ¦¬λ₯Ό μν΄ νμμ€ν¬νλ₯Ό μΆκ°ν΄μΌ ν©λλ€.
\n\nμ ν΅μ μΈ μ κ·Ό λ°©μ (μ¦μ):
\nconst sensorReadings = [
{ id: 'sensor-001', value: 72, unit: 'Fahrenheit' },
{ id: 'sensor-002', value: 25, unit: 'Celsius' },
{ id: 'sensor-003', value: 68, unit: 'Fahrenheit' },
// ... μ μ¬μ μΌλ‘ μμ² κ°μ νλ
κ°
];
const celsiusReadings = sensorReadings.map(reading => {
let tempInCelsius = reading.value;
if (reading.unit === 'Fahrenheit') {
tempInCelsius = (reading.value - 32) * 5 / 9;
}
return {
id: reading.id,
temperature: parseFloat(tempInCelsius.toFixed(2)),
unit: 'Celsius',
timestamp: new Date().toISOString()
};
});
// celsiusReadingsλ μλ‘μ΄ λ°°μ΄μ΄λ©°, μ μ¬μ μΌλ‘ ν΄ μ μμ΅λλ€.
μ΄ν°λ μ΄ν° ν¬νΌμ .map() μ¬μ© (μ§μ°):
// 'getSensorReadings()'κ° λΉλκΈ° μ΄ν°λ¬λΈ λλ νλ
κ°μ νμ€ μ΄ν°λ¬λΈμ λ°ννλ€κ³ κ°μ ν©λλ€
function* getSensorReadings() {
yield { id: 'sensor-001', value: 72, unit: 'Fahrenheit' };
yield { id: 'sensor-002', value: 25, unit: 'Celsius' };
yield { id: 'sensor-003', value: 68, unit: 'Fahrenheit' };
// μ€μ μλ리μ€μμλ λ°μ΄ν°λ² μ΄μ€ 컀μ λλ μ€νΈλ¦Όμμ λ°μ΄ν°λ₯Ό μ§μ°μ μΌλ‘ κ°μ Έμ¬ κ²μ
λλ€
}
const processedReadingsIterator = getSensorReadings()
.map(reading => {
let tempInCelsius = reading.value;
if (reading.unit === 'Fahrenheit') {
tempInCelsius = (reading.value - 32) * 5 / 9;
}
return {
id: reading.id,
temperature: parseFloat(tempInCelsius.toFixed(2)),
unit: 'Celsius',
timestamp: new Date().toISOString()
};
});
// processedReadingsIteratorλ μ΄ν°λ μ΄ν°μ΄λ©°, μμ§ μμ ν λ°°μ΄μ΄ μλλλ€.
// κ°μ for...of λλ .next()λ₯Ό ν΅ν΄ μμ²λ λλ§ κ³μ°λ©λλ€
for (const reading of processedReadingsIterator) {
console.log(reading);
}
μ νμ μν .filter(): μκ³κ° μλ³
\nμ΄μ μ μΈκ³μ μΌλ‘ μ μ§ λ³΄μ νμ΄λ νκ²½ λͺ¨λν°λ§ μμ€ν μ μ리기 μν΄ νΉμ μκ³κ°(μ: 30Β°C)μ μ΄κ³Όνλ μ¨λ νλ κ°λ§ νμνλ€κ³ κ°μ ν΄ λ΄ μλ€.
\n\nμ΄ν°λ μ΄ν° ν¬νΌμ .filter() μ¬μ©:
const highTempAlerts = processedReadingsIterator
.filter(reading => reading.temperature > 30);
// highTempAlertsλ λ λ€λ₯Έ μ΄ν°λ μ΄ν°μ
λλ€. μμ§ μ€κ° λ°°μ΄μ΄ μμ±λμ§ μμμ΅λλ€.
// μμλ 체μΈμ ν΅κ³Όνλ©΄μ μ§μ°μ μΌλ‘ νν°λ§λ©λλ€.
볡μ‘ν νμ΄νλΌμΈμ μν μ²΄μΈ μμ : μ 체 λ°μ΄ν° μ€νΈλ¦Ό λ³ν
\n.map()κ³Ό .filter()λ₯Ό κ²°ν©νλ©΄ ν°λ―Έλ μμ
μ΄ νΈμΆλ λκΉμ§ μ€κ° λ°°μ΄μ μμ±νμ§ μκ³ λ κ°λ ₯νκ³ ν¨μ¨μ μΈ λ°μ΄ν° νμ΄νλΌμΈμ ꡬμΆν μ μμ΅λλ€.
μ 체 νμ΄νλΌμΈ μμ:
\nconst criticalHighTempAlerts = getSensorReadings()
.map(reading => {
let tempInCelsius = reading.value;
if (reading.unit === 'Fahrenheit') {
tempInCelsius = (reading.value - 32) * 5 / 9;
}
return {
id: reading.id,
temperature: parseFloat(tempInCelsius.toFixed(2)),
unit: 'Celsius',
timestamp: new Date().toISOString()
};
})
.filter(reading => reading.temperature > 30);
// κ²°κ³Ό λ°λ³΅ λ° μΆλ ₯ (ν°λ―Έλ μμ
- κ°μ νλμ© κ°μ Έμ μ²λ¦¬λ©λλ€)
for (const alert of criticalHighTempAlerts) {
console.log('CRITICAL ALERT:', alert);
}
μ΄ μ 체 체μΈμ μλ‘μ΄ λ°°μ΄μ μ ν μμ±νμ§ μκ³ μλν©λλ€. κ° νλ
κ°μ map λ° filter λ¨κ³λ₯Ό μμ°¨μ μΌλ‘ μ²λ¦¬νλ©°, νν° μ‘°κ±΄μ λ§μ‘±νλ κ²½μ°μλ§ μλΉλ₯Ό μν΄ μμ±λ©λλ€. μ΄λ λκ·λͺ¨ λ°μ΄ν° μΈνΈμ λ©λͺ¨λ¦¬ μ¬μ©λμ κ·Ήμ μΌλ‘ μ€μ΄κ³ μ±λ₯μ ν₯μμν΅λλ€.
μ€μ²©λ λ°μ΄ν° ꡬ쑰λ₯Ό μν .flatMap(): 볡μ‘ν λ‘κ·Έ νλͺ© μμΆ ν΄μ
\nλλ‘λ νννν΄μΌ νλ μ€μ²©λ κ΅¬μ‘°λ‘ λ°μ΄ν°κ° λ€μ΄μ¬ μ μμ΅λλ€. κ° λ‘κ·Έμ λ°°μ΄ λ΄μ μ¬λ¬ μ΄λ²€νΈ μΈλΆ μ λ³΄κ° ν¬ν¨λ μ μλ λ€μν λ§μ΄ν¬λ‘μλΉμ€μ λ‘κ·Έ νλͺ©μ μμν΄ λ³΄μΈμ. κ° κ°λ³ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ €κ³ ν©λλ€.
\n\n.flatMap() μ¬μ© μμ:
const serviceLogs = [
{ service: 'AuthService', events: [{ type: 'LOGIN', user: 'alice' }, { type: 'LOGOUT', user: 'alice' }] },
{ service: 'PaymentService', events: [{ type: 'TRANSACTION', amount: 100 }, { type: 'REFUND', amount: 20 }] },
{ service: 'AuthService', events: [{ type: 'LOGIN', user: 'bob' }] }
];
function* getServiceLogs() {
yield { service: 'AuthService', events: [{ type: 'LOGIN', user: 'alice' }, { type: 'LOGOUT', user: 'alice' }] };
yield { service: 'PaymentService', events: [{ type: 'TRANSACTION', amount: 100 }, { type: 'REFUND', amount: 20 }] };
yield { service: 'AuthService', events: [{ type: 'LOGIN', user: 'bob' }] };
}
const allEventsIterator = getServiceLogs()
.flatMap(logEntry => logEntry.events.map(event => ({ ...event, service: logEntry.service })));
for (const event of allEventsIterator) {
console.log(event);
}
/* μμ μΆλ ₯:\n{ type: 'LOGIN', user: 'alice', service: 'AuthService' }\n{ type: 'LOGOUT', user: 'alice', service: 'AuthService' }\n{ type: 'TRANSACTION', amount: 100, service: 'PaymentService' }\n{ type: 'REFUND', amount: 20, service: 'PaymentService' }\n{ type: 'LOGIN', user: 'bob', service: 'AuthService' }\n*/
.flatMap()μ κ° λ‘κ·Έ νλͺ© λ΄μ events λ°°μ΄ νννλ₯Ό μ°μνκ² μ²λ¦¬νμ¬ κ°λ³ μ΄λ²€νΈμ λ¨μΌ μ€νΈλ¦Όμ μμ±νλ©°, μ΄ λͺ¨λ κ³Όμ μ μ§μ° νκ°λ₯Ό μ μ§ν©λλ€.
λΆλΆ μλΉλ₯Ό μν .take() λ° .drop(): κΈ΄κΈ μμ
μ°μ μμ μ§μ
\nλλ‘λ λ°μ΄ν°μ μΌλΆλ§ νμν λκ° μμ΅λλ€. μλ₯Ό λ€μ΄, μ²μ λͺ κ°μ μμλ§ νμνκ±°λ, μ²μ λͺ κ°λ₯Ό μ μΈν λͺ¨λ μμκ° νμν λμ
λλ€. .take()μ .drop()μ μ΄λ¬ν μλ리μ€μμ λ§€μ° μ μ©νλ©°, νΉν μ μ¬μ μΌλ‘ 무νν μ€νΈλ¦Όμ λ€λ£¨κ±°λ λͺ¨λ κ²μ κ°μ Έμ€μ§ μκ³ νμ΄μ§ λ§€κΉλ λ°μ΄ν°λ₯Ό νμν λ μ μ©ν©λλ€.
μμ: μ μ¬μ μΈ ν μ€νΈ λ°μ΄ν°λ₯Ό μ μΈν μ²μ 2κ°μ μ¬κ°ν κ²½κ³ λ₯Ό κ°μ Έμ΅λλ€:
\nconst firstTwoCriticalAlerts = getSensorReadings()
.drop(10) // μ²μ 10κ°μ νλ
κ°(μ: ν
μ€νΈ λλ κ΅μ λ°μ΄ν°)μ μ μΈν©λλ€
.map(reading => { /* ... μ΄μ κ³Ό λμΌν λ³ν ... */
let tempInCelsius = reading.value;
if (reading.unit === 'Fahrenheit') {
tempInCelsius = (reading.value - 32) * 5 / 9;
}
return {
id: reading.id,
temperature: parseFloat(tempInCelsius.toFixed(2)),
unit: 'Celsius',
timestamp: new Date().toISOString()
};
})
.filter(reading => reading.temperature > 30) // μ¬κ°ν μ¨λλ₯Ό νν°λ§ν©λλ€
.take(2); // μ²μ 2κ°μ μ¬κ°ν κ²½κ³ λ§ κ°μ Έμ΅λλ€
// λ κ°μ μ¬κ°ν κ²½κ³ λ§ μ²λ¦¬λκ³ μμ±λμ΄ μλΉν 리μμ€λ₯Ό μ μ½ν©λλ€.
for (const alert of firstTwoCriticalAlerts) {
console.log('URGENT ALERT:', alert);
}
μ§κ³λ₯Ό μν .reduce(): κΈλ‘λ² νλ§€ λ°μ΄ν° μμ½
\n.reduce() λ©μλλ₯Ό μ¬μ©νλ©΄ μ΄ν°λ μ΄ν°μ κ°μ λ¨μΌ κ²°κ³Όλ‘ μ§κ³ν μ μμ΅λλ€. μ΄λ μ€νΈλ¦¬λ° λ°μ΄ν°μμ ν©κ³, νκ· μ κ³μ°νκ±°λ μμ½ κ°μ²΄λ₯Ό ꡬμΆνλ λ° λ§€μ° μ μ©ν©λλ€.
μμ: νΈλμμ μ€νΈλ¦Όμμ νΉμ μ§μμ μ΄ νλ§€μ‘μ κ³μ°ν©λλ€:
\nfunction* getTransactions() {
yield { id: 'T001', region: 'APAC', amount: 150 };
yield { id: 'T002', region: 'EMEA', amount: 200 };
yield { id: 'T003', region: 'AMER', amount: 300 };
yield { id: 'T004', region: 'APAC', amount: 50 };
yield { id: 'T005', region: 'EMEA', amount: 120 };
}
const totalAPACSales = getTransactions()
.filter(transaction => transaction.region === 'APAC')
.reduce((sum, transaction) => sum + transaction.amount, 0);
console.log('Total APAC Sales:', totalAPACSales); // μΆλ ₯: Total APAC Sales: 200
μ¬κΈ°μ .filter() λ¨κ³λ APAC νΈλμμ
λ§ κ³ λ €νλλ‘ λ³΄μ₯νλ©°, .reduce()λ ν¨μ¨μ μΌλ‘ κΈμ‘μ ν©μ°ν©λλ€. .reduce()κ° μ΅μ’
κ°μ μμ±ν΄μΌ ν λκΉμ§ μ 체 νλ‘μΈμ€λ μ§μ°μ μΌλ‘ μ μ§λλ©°, νμν νΈλμμ
λ§ νμ΄νλΌμΈμ ν΅ν΄ κ°μ Έμ΅λλ€.
μ€νΈλ¦Ό μ΅μ ν: μ΄ν°λ μ΄ν° ν¬νΌκ° νμ΄νλΌμΈ ν¨μ¨μ±μ λμ΄λ λ°©λ²
\n\nμ΄ν°λ μ΄ν° ν¬νΌμ μ§μ ν νμ κ³ μ ν μ€κ³ μμΉμ μμΌλ©°, μ΄λ νΉν μ μΈκ³μ μΌλ‘ λΆμ°λ μ ν리μΌμ΄μ μμ μ€μν μ±λ₯ λ° ν¨μ¨μ± ν₯μμΌλ‘ μ§μ μ΄μ΄μ§λλ€.
\n\nμ§μ° νκ° λ° "ν(Pull)" λͺ¨λΈ
\nμ΄κ²μ μ΄ν°λ μ΄ν° ν¬νΌ ν¨μ¨μ±μ μ΄μμ
λλ€. λͺ¨λ λ°μ΄ν°λ₯Ό ν λ²μ μ²λ¦¬νλ λμ (μ¦μ νκ°), μ΄ν°λ μ΄ν° ν¬νΌλ μμ² μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν©λλ€. .map().filter().take()λ₯Ό 체μΈμΌλ‘ μ°κ²°ν λ, κ°μ λͺ
μμ μΌλ‘ μμ²ν λκΉμ§(μ: for...of 루νλ₯Ό μ¬μ©νκ±°λ .next()λ₯Ό νΈμΆνμ¬) μ€μ λ°μ΄ν° μ²λ¦¬λ λ°μνμ§ μμ΅λλ€. μ΄ "ν(pull)" λͺ¨λΈμ λ€μμ μλ―Έν©λλ€:
- \n
- νμν κ³μ°λ§ μνλ©λλ€: λ°±λ§ κ° νλͺ© μ€νΈλ¦Όμμ
.take(5)μμλ§ κ°μ Έμ€λ©΄, ν΄λΉ 5κ° μμ(λ° μ²΄μΈμ μ΄μ μμ)λ§ μ²λ¦¬λ©λλ€. λλ¨Έμ§ 999,995κ° μμλ μ ν 건λλ¦¬μ§ μμ΅λλ€. \n - μλ΅μ±: μ ν리μΌμ΄μ μ λΆλΆ κ²°κ³Όλ₯Ό ν¨μ¬ λ λΉ λ₯΄κ² μ²λ¦¬νκ³ νμνκΈ° μμνμ¬ μ¬μ©μμκ² μ²΄κ°λλ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. \n
μ€κ° λ°°μ΄ μμ± κ°μ
\nμμ λ Όμνλ―μ΄, μ ν΅μ μΈ λ°°μ΄ λ©μλλ κ° μ²΄μΈ μμ μ λν΄ μ λ°°μ΄μ μμ±ν©λλ€. λκ·λͺ¨ λ°μ΄ν° μΈνΈμ κ²½μ° μ΄λ λ€μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€:
\n- \n
- λ©λͺ¨λ¦¬ μ¬μ©λ μ¦κ°: μ¬λ¬ κ°μ λκ·λͺ¨ λ°°μ΄μ λμμ λ©λͺ¨λ¦¬μ μ μ§νλ©΄ μ¬μ© κ°λ₯ν 리μμ€κ° μμ§λ μ μμΌλ©°, νΉν ν΄λΌμ΄μΈνΈ μΈ‘ μ ν리μΌμ΄μ (λΈλΌμ°μ , λͺ¨λ°μΌ μ₯μΉ) λλ λ©λͺ¨λ¦¬ μ μ½μ΄ μλ μλ² νκ²½μμ κ·Έλ¬ν©λλ€. \n
- κ°λΉμ§ 컬λ μ μ€λ²ν€λ: JavaScript μμ§μ μ΄λ¬ν μμ λ°°μ΄μ μ 리νκΈ° μν΄ λ λ§μ λ Έλ ₯μ κΈ°μΈμ¬ μ μ¬μ μΈ μΌμ μ μ§ λ° μ±λ₯ μ νλ₯Ό μ΄λν μ μμ΅λλ€. \n
μ΄ν°λ μ΄ν° ν¬νΌλ μ΄ν°λ μ΄ν°μμ μ§μ μλν¨μΌλ‘μ¨ μ΄λ₯Ό λ°©μ§ν©λλ€. μ΄ν°λ μ΄ν° ν¬νΌλ κ° λ¨κ³μμ λ°μ΄ν°κ° μ 체 λ°°μ΄λ‘ ꡬ체νλμ§ μκ³ νλ₯΄λ λ¦°(lean)νκ³ κΈ°λ₯μ μΈ νμ΄νλΌμΈμ μ μ§ν©λλ€. μ΄κ²μ λκ·λͺ¨ λ°μ΄ν° μ²λ¦¬μμ νλλ₯Ό λ°κΎΈλ μμμ λλ€.
\n\nν₯μλ κ°λ μ± λ° μ μ§ λ³΄μμ±
\nμ±λ₯μμ μ΄μ μΈμλ μ΄ν°λ μ΄ν° ν¬νΌμ μ μΈμ νΉμ±μ μ½λ νμ§μ ν¬κ² ν₯μμν΅λλ€. .filter().map().reduce()μ κ°μ μ²΄μΈ μμ
μ λ°μ΄ν° λ³ν νλ‘μΈμ€μ λν μ€λͺ
μ²λΌ μ½νλλ€. μ΄λ νΉν λ€μν λ°°κ²½μ κ°μ§ κ°λ°μλ€μ΄ λͺ
ννκ³ λͺ¨νΈνμ§ μμ μ½λλ₯Ό μꡬνλ νλ ₯μ μΈ κΈλ‘λ² κ°λ° νμμ 볡μ‘ν νμ΄νλΌμΈμ μ΄ν΄νκ³ λλ²κ·Ένλ©° μ μ§ κ΄λ¦¬νκΈ° λ μ½κ² λ§λλλ€.
λΉλκΈ° μ΄ν°λ μ΄ν°μμ νΈνμ± (AsyncIterator.prototype)
\nμ€μνκ²λ, μ΄ν°λ μ΄ν° ν¬νΌ μ μμλ λΉλκΈ° μ΄ν°λ¬λΈμ λμΌν κ°λ ₯ν λ©μλλ₯Ό μ 곡νλ AsyncIterator.prototypeλ ν¬ν¨λμ΄ μμ΅λλ€. μ΄λ μκ°μ΄ μ§λ¨μ λ°λΌ λ°μ΄ν°κ° λμ°©νλ λ€νΈμν¬ μ€νΈλ¦Ό, λ°μ΄ν°λ² μ΄μ€ λλ νμΌ μμ€ν
μ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° νμμ μ
λλ€. μ΄λ¬ν ν΅μΌλ μ κ·Ό λ°©μμ λΆμ° μμ€ν
μμ νν μꡬλλ λκΈ° λ° λΉλκΈ° λ°μ΄ν° μμ€μμ μμ
μ λ¨μνν©λλ€.
AsyncIterator μμ:
\nasync function* fetchPages(baseUrl) {
let nextPage = baseUrl;
while (nextPage) {
const response = await fetch(nextPage);
const data = await response.json();
yield data.items; // data.itemsκ° νλͺ© λ°°μ΄μ΄λΌκ³ κ°μ ν©λλ€
nextPage = data.nextPageLink; // λ€μ νμ΄μ§ λ§ν¬(μλ κ²½μ°)λ₯Ό κ°μ Έμ΅λλ€
}
}
async function processProductData() {
const productsIterator = fetchPages('https://api.example.com/products')
.flatMap(pageItems => pageItems) // νμ΄μ§λ₯Ό κ°λ³ νλͺ©μΌλ‘ νννν©λλ€
.filter(product => product.price > 100)
.map(product => ({ id: product.id, name: product.name, taxRate: 0.15 }));
for await (const product of productsIterator) {
console.log('High-value product:', product);
}
}
processProductData();
μ΄ λΉλκΈ° νμ΄νλΌμΈμ λͺ¨λ μ νμ λμμ λ©λͺ¨λ¦¬μ λ‘λνμ§ μκ³ μ νμ νμ΄μ§λ³λ‘ μ²λ¦¬νκ³ νν°λ§ λ° λ§€νν©λλ€. μ΄λ λκ·λͺ¨ μΉ΄νλ‘κ·Έ λλ μ€μκ° λ°μ΄ν° νΌλμ λν μ€μν μ΅μ νμ λλ€.
\n\nμ°μ μ λ°μ μ€μ μ μ©
\n\nμ΄ν°λ μ΄ν° ν¬νΌμ μ΄μ μ μλ§μ μ°μ κ³Ό μ¬μ© μ¬λ‘μ κ±Έμ³ νμ₯λμ΄ μ§λ¦¬μ μμΉλ λΆλ¬Έμ κ΄κ³μμ΄ λͺ¨λ κ°λ°μμκ² κ·μ€ν λꡬμ λλ€.
\n\nμΉ κ°λ°: λ°μν UI λ° ν¨μ¨μ μΈ API λ°μ΄ν° μ²λ¦¬
\nν΄λΌμ΄μΈνΈ μΈ‘μμ μ΄ν°λ μ΄ν° ν¬νΌλ λ€μμ μ΅μ νν μ μμ΅λλ€:
\n- \n
- UI λ λλ§: κ°μνλ λͺ©λ‘ λλ 무ν μ€ν¬λ‘€ κ΅¬μ± μμμ λν λ°μ΄ν°λ₯Ό μ§μ°μ μΌλ‘ λ‘λνκ³ μ²λ¦¬νμ¬ μ΄κΈ° λ‘λ μκ°κ³Ό μλ΅μ±μ ν₯μμν΅λλ€. \n
- API λ°μ΄ν° λ³ν: REST λλ GraphQL APIμ λκ·λͺ¨ JSON μλ΅μ λ©λͺ¨λ¦¬ μλͺ¨ μμ΄ μ²λ¦¬νλ©°, νΉν λ°μ΄ν°μ μΌλΆλ§ νμν΄μΌ ν λ μ μ©ν©λλ€. \n
- μ΄λ²€νΈ μ€νΈλ¦Ό μ²λ¦¬: μ¬μ©μ μνΈ μμ© λλ μΉ μμΌ λ©μμ§ μνμ€λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬ν©λλ€. \n
λ°±μλ μλΉμ€: λμ μ²λ¦¬λ μμ² μ²λ¦¬ λ° λ‘κ·Έ λΆμ
\nNode.js λ°±μλ μλΉμ€μ κ²½μ° μ΄ν°λ μ΄ν° ν¬νΌλ λ€μμ μν΄ νμμ μ λλ€:
\n- \n
- λ°μ΄ν°λ² μ΄μ€ 컀μ μ²λ¦¬: λκ·λͺ¨ λ°μ΄ν°λ² μ΄μ€ κ²°κ³Ό μΈνΈλ₯Ό λ€λ£° λ μ΄ν°λ μ΄ν°λ μ 체 κ²°κ³Όλ₯Ό λ©λͺ¨λ¦¬μ λ‘λνμ§ μκ³ νμ νλμ© μ²λ¦¬ν μ μμ΅λλ€. \n
- νμΌ μ€νΈλ¦Ό μ²λ¦¬: κ³Όλν RAMμ μλΉνμ§ μκ³ λκ·λͺ¨ λ‘κ·Έ νμΌ λλ CSV λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ½κ³ λ³νν©λλ€. \n
- API κ²μ΄νΈμ¨μ΄ λ°μ΄ν° λ³ν: λ€μ΄μ€κ±°λ λκ°λ λ°μ΄ν° μ€νΈλ¦Όμ λ¦°(lean)νκ³ μ±λ₯μ΄ μ°μν λ°©μμΌλ‘ μμ ν©λλ€. \n
λ°μ΄ν° κ³Όν λ° λΆμ: μ€μκ° λ°μ΄ν° νμ΄νλΌμΈ
\nνΉμ λΉ λ°μ΄ν° λꡬλ₯Ό λ체νμ§λ μμ§λ§, JavaScript νκ²½ λ΄μμ μ€μ κ·λͺ¨μ λ°μ΄ν° μΈνΈ λλ μ€μκ° μ€νΈλ¦Ό μ²λ¦¬λ₯Ό μν΄ μ΄ν°λ μ΄ν° ν¬νΌλ λ€μμ κ°λ₯νκ² ν©λλ€:
\n- \n
- μ€μκ° λμ보λ μ λ°μ΄νΈ: κΈμ΅ μμ₯, μΌμ λ€νΈμν¬ λλ μμ λ―Έλμ΄ μΈκΈμ λν λ€μ΄μ€λ λ°μ΄ν° νΌλλ₯Ό μ²λ¦¬νμ¬ λμ보λλ₯Ό λμ μΌλ‘ μ λ°μ΄νΈν©λλ€. \n
- νΌμ² μμ§λμ΄λ§: μ 체 λ°μ΄ν° μΈνΈλ₯Ό ꡬ체ννμ§ μκ³ λ°μ΄ν° μνμ λ³ν λ° νν°λ₯Ό μ μ©ν©λλ€. \n
IoT λ° μ£μ§ μ»΄ν¨ν : 리μμ€ μ μ½μ΄ μλ νκ²½
\nIoT μ₯μΉ λλ μ£μ§ κ²μ΄νΈμ¨μ΄μ κ°μ΄ λ©λͺ¨λ¦¬ λ° CPU μ£ΌκΈ°κ° μ€μν νκ²½μμ μ΄ν°λ μ΄ν° ν¬νΌλ νΉν μ μ©ν©λλ€:
\n- \n
- μΌμ λ°μ΄ν° μ¬μ μ²λ¦¬: μμ μΌμ λ°μ΄ν°λ₯Ό ν΄λΌμ°λλ‘ λ³΄λ΄κΈ° μ μ νν°λ§, λ§€ν λ° μΆμνμ¬ λ€νΈμν¬ νΈλν½κ³Ό μ²λ¦¬ λΆνλ₯Ό μ΅μνν©λλ€. \n
- λ‘컬 λΆμ: λ§μ μμ λ°μ΄ν°λ₯Ό λ²νΌλ§νμ§ μκ³ μ₯μΉμμ κ²½λ λΆμ μμ μ μνν©λλ€. \n
λͺ¨λ² μ¬λ‘ λ° κ³ λ € μ¬ν
\n\nμ΄ν°λ μ΄ν° ν¬νΌλ₯Ό μμ ν νμ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€:
\n\nμ΄ν°λ μ΄ν° ν¬νΌ μ¬μ© μκΈ°
\n- \n
- λκ·λͺ¨ λ°μ΄ν° μΈνΈ: μ€κ° λ°°μ΄ μμ±μ΄ μ°λ €λλ μμ² λλ μλ°±λ§ κ°μ νλͺ© 컬λ μ μ λ€λ£° λ. \n
- 무ννκ±°λ μ μ¬μ μΌλ‘ 무νν μ€νΈλ¦Ό: λ€νΈμν¬ μμΌ, νμΌ λ¦¬λ λλ 무νν μμ νλͺ©μ μμ±ν μ μλ λ°μ΄ν°λ² μ΄μ€ 컀μμ λ°μ΄ν°λ₯Ό μ²λ¦¬ν λ. \n
- λ©λͺ¨λ¦¬ μ μ½μ΄ μλ νκ²½: ν΄λΌμ΄μΈνΈ μΈ‘ μ ν리μΌμ΄μ , IoT μ₯μΉ λλ μλ²λ¦¬μ€ ν¨μμμ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ€μν κ²½μ°. \n
- 볡μ‘ν μ²΄μΈ μμ
: μ¬λ¬
map,filter,flatMapμμ μ΄ μ²΄μΈμΌλ‘ μ°κ²°λμ΄ μ ν΅μ μΈ λ©μλμμ μ¬λ¬ μ€κ° λ°°μ΄μ΄ μμ±λ λ. \n
μκ³ κ³ μ λ ν¬κΈ°μ λ°°μ΄μ κ²½μ° μ±λ₯ μ°¨μ΄κ° λ―Έλ―Έν μ μμΌλ©°, λ¨μνλ₯Ό μν΄ μ ν΅μ μΈ λ°°μ΄ λ©μλμ μΉμν¨μ΄ μ νΈλ μ μμ΅λλ€.
\n\nμ±λ₯ λ²€μΉλ§νΉ
\nνμ νΉμ μ¬μ© μ¬λ‘λ₯Ό λ²€μΉλ§νΉνμμμ€. μ΄ν°λ μ΄ν° ν¬νΌλ μΌλ°μ μΌλ‘ λκ·λͺ¨ λ°μ΄ν° μΈνΈμ λν μ±λ₯ μ΄μ μ μ 곡νμ§λ§, μ νν μ΄μ μ λ°μ΄ν° ꡬ쑰, ν¨μ 볡μ‘μ± λ° JavaScript μμ§ μ΅μ νμ λ°λΌ λ¬λΌμ§ μ μμ΅λλ€. console.time() λλ μ μ© λ²€μΉλ§νΉ λΌμ΄λΈλ¬λ¦¬μ κ°μ λꡬλ λ³λͺ© νμμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
λΈλΌμ°μ λ° νκ²½ μ§μ (ν΄λ¦¬ν)
\nES2023 κΈ°λ₯μ΄λ―λ‘ μ΄ν°λ μ΄ν° ν¬νΌλ λͺ¨λ μ΄μ νκ²½μμ μ¦μ κΈ°λ³Έμ μΌλ‘ μ§μλμ§ μμ μ μμ΅λλ€. νΉν λ κ±°μ λΈλΌμ°μ μ§μμ΄ νμν νκ²½μμ λ λμ νΈνμ±μ μν΄μλ ν΄λ¦¬νμ΄ νμν μ μμ΅λλ€. core-jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ’
μ’
μλ‘μ΄ ECMAScript κΈ°λ₯μ λν ν΄λ¦¬νμ μ 곡νμ¬ μ½λκ° μ μΈκ³μ λ€μν μ¬μ©μ κΈ°λ°μμ μΌκ΄λκ² μ€νλλλ‘ λ³΄μ₯ν©λλ€.
κ°λ μ±κ³Ό μ±λ₯μ κ· ν
\nκ°λ ₯νκΈ°λ νμ§λ§, λͺ¨λ μμ λ°λ³΅μ λν΄ μ§λμΉκ² μ΅μ ννλ κ²μ μ μ€νκ² μ μ©νμ§ μμΌλ©΄ μ½λλ₯Ό λ 볡μ‘νκ² λ§λ€ μ μμ΅λλ€. ν¨μ¨μ± ν₯μμ΄ μ±νμ μ λΉννλ κ· νμ μν΄ λ Έλ ₯νμμμ€. μ΄ν°λ μ΄ν° ν¬νΌμ μ μΈμ νΉμ±μ μΌλ°μ μΌλ‘ κ°λ μ±μ ν₯μμν€μ§λ§, κΈ°λ³Έ μ§μ° νκ° λͺ¨λΈμ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
\n\nλ―Έλ μ λ§: JavaScript λ°μ΄ν° μ²λ¦¬μ λ―Έλ
\n\nμ΄ν°λ μ΄ν° ν¬νΌμ λμ μ JavaScriptμμ λ³΄λ€ ν¨μ¨μ μ΄κ³ νμ₯ κ°λ₯ν λ°μ΄ν° μ²λ¦¬λ₯Ό ν₯ν μ€μν λ¨κ³μ λλ€. μ΄λ μ€νΈλ¦Ό κΈ°λ° μ²λ¦¬ λ° λ¦¬μμ€ μ΅μ νλ₯Ό κ°μ‘°νλ μΉ νλ«νΌ κ°λ°μ κ΄λ²μν νΈλ λμ μΌμΉν©λλ€.
\n\nμΉ μ€νΈλ¦Ό APIμμ ν΅ν©
\nλ°μ΄ν° μ€νΈλ¦Ό(μ: λ€νΈμν¬ μμ², νμΌ μ λ‘λ)μ μ²λ¦¬νλ νμ€ λ°©λ²μ μ 곡νλ μΉ μ€νΈλ¦Ό APIλ μ΄λ―Έ μ΄ν°λ¬λΈκ³Ό ν¨κ» μλν©λλ€. μ΄ν°λ μ΄ν° ν¬νΌλ μΉ μ€νΈλ¦Όμ ν΅ν΄ νλ₯΄λ λ°μ΄ν°λ₯Ό λ³ννκ³ νν°λ§νλ μμ°μ€λ½κ³ κ°λ ₯ν λ°©λ²μ μ 곡νμ¬ λΈλΌμ°μ κΈ°λ° λ° Node.js μ ν리μΌμ΄μ μ΄ λ€νΈμν¬ λ¦¬μμ€μ μνΈ μμ©νκΈ° μν λμ± κ°λ ₯νκ³ ν¨μ¨μ μΈ νμ΄νλΌμΈμ μμ±ν©λλ€.
\n\nμΆκ° κ°μ μ μ μ¬λ ₯
\nJavaScript μνκ³κ° κ³μ λ°μ ν¨μ λ°λΌ λ°λ³΅ νλ‘ν μ½ λ° ν΄λΉ ν¬νΌμ λν μΆκ° κ°μ λ° μΆκ°λ₯Ό μμν μ μμ΅λλ€. μ±λ₯, λ©λͺ¨λ¦¬ ν¨μ¨μ± λ° κ°λ°μ μΈμ²΄ 곡νμ λν μ§μμ μΈ μ΄μ μ JavaScriptμ λ°μ΄ν° μ²λ¦¬κ° λμ± κ°λ ₯νκ³ μ κ·Ό κ°λ₯ν΄μ§ κ²μμ μλ―Έν©λλ€.
\n\nκ²°λ‘ : μ μΈκ³ κ°λ°μ μλ κ°ν
\n\nJavaScript μ΄ν°λ μ΄ν° ν¬νΌ μ€νΈλ¦Ό μ΅μ ν λꡬλ ECMAScript νμ€μ λν κ°λ ₯ν μΆκ° κΈ°λ₯μΌλ‘, κ°λ°μμκ² λ°μ΄ν° μ€νΈλ¦Όμ μ²λ¦¬νκΈ° μν κ²¬κ³ νκ³ μ μΈμ μ΄λ©° κ³ λλ‘ ν¨μ¨μ μΈ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ§μ° νκ°λ₯Ό μμ©νκ³ μ€κ° λ°μ΄ν° ꡬ쑰λ₯Ό μ΅μνν¨μΌλ‘μ¨ μ΄λ¬ν ν¬νΌλ κ°λ°μκ° λ μ±λ₯μ΄ λ°μ΄λκ³ λ©λͺ¨λ¦¬λ₯Ό λ μ¬μ©νλ©° μ μ§ κ΄λ¦¬νκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μ§μν©λλ€.
\n\nνλ‘μ νΈλ₯Ό μν μ€ν κ°λ₯ν ν΅μ°°λ ₯:
\n- \n
- λ³λͺ© νμ μλ³: νΉν μ±λ₯μ΄ μ€μν κ²½λ‘μμ λκ·λͺ¨ λ°°μ΄μ΄ λ°λ³΅μ μΌλ‘ νν°λ§, λ§€ν λλ λ³νλλ μ½λλ² μ΄μ€ μμμ μ°ΎμΌμμμ€. \n
- μ΄ν°λ μ΄ν° μ±ν: κ°λ₯νλ©΄ μ 체 λ°°μ΄μ 미리 μμ±νλ λμ μ΄ν°λ¬λΈ λ° μ λλ μ΄ν°λ₯Ό νμ©νμ¬ λ°μ΄ν° μ€νΈλ¦Όμ μμ±νμμμ€. \n
- μμ κ° μκ² μ²΄μΈ μ°κ²°: μ΄ν°λ μ΄ν° ν¬νΌμ
map(),filter(),flatMap(),take(),drop()μ νμ©νμ¬ λ¦°(lean)νκ³ ν¨μ¨μ μΈ νμ΄νλΌμΈμ ꡬμΆνμμμ€. \n - λΉλκΈ° μ΄ν°λ μ΄ν° κ³ λ €: λ€νΈμν¬ μμ² λλ νμΌ μ½κΈ°μ κ°μ I/O λ°μ΄λ μμ
μ κ²½μ°, λΉλΈλ‘νΉ λ° λ©λͺ¨λ¦¬ ν¨μ¨μ μΈ λ°μ΄ν° μ²λ¦¬λ₯Ό μν΄
AsyncIterator.prototypeμ νμνμμμ€. \n - μ΅μ μ 보 μ μ§: ECMAScript μ μ λ° λΈλΌμ°μ νΈνμ±μ μ£Όμλ₯Ό κΈ°μΈμ¬ μλ‘μ΄ κΈ°λ₯μ μν¬νλ‘μ μννκ² ν΅ν©νμμμ€. \n
μ΄ν°λ μ΄ν° ν¬νΌλ₯Ό κ°λ° κ΄νμ ν΅ν©ν¨μΌλ‘μ¨, λ ν¨μ¨μ μΈ JavaScriptλ₯Ό μμ±νλ κ²λΏλ§ μλλΌ μ μΈκ³ μ¬μ©μμκ² λ μ’κ³ , λΉ λ₯΄κ³ , μ§μ κ°λ₯ν λμ§νΈ κ²½νμ κΈ°μ¬νλ κ²μ λλ€. μ§κΈ λ°μ΄ν° νμ΄νλΌμΈ μ΅μ νλ₯Ό μμνκ³ μ ν리μΌμ΄μ μ μ μ¬λ ₯μ μ΅λν λ°ννμμμ€.