Map์— ๋“œ๋””์–ด ์ƒ๊ธด getOrInsert: โ€œ์—†์œผ๋ฉด ๋„ฃ๊ณ , ์žˆ์œผ๋ฉด ๊บผ๋‚ด๊ธฐโ€

๐Ÿ“š
JavaScript
2026.02.15

๐Ÿ“š Overview

Map์„ ์“ฐ๋‹ค ๋ณด๋ฉด โ€œํ‚ค๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋„ฃ๊ณ , ๊ทธ ๊ฐ’์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•œ๋‹คโ€๋Š” ํŒจํ„ด์„ ๋์—†์ด ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ํŒจํ„ด์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๊ณ , ํŒ€๋งˆ๋‹ค ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง€๋ฉด์„œ ๊ฐ€๋…์„ฑ์ด ๋” ๋–จ์–ด์ง„๋‹ค.

Map.prototype.getOrInsert() / getOrInsertComputed() ๋Š” ์ด ๋ฐ˜๋ณต์„ ํ‘œ์ค€ API๋กœ ์ •๋ฆฌํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ECMAScript 2026 ์ŠคํŽ™์— ํฌํ•จ๋  ์˜ˆ์ •์ด๋ฉฐ, ์ด์ œ ์ถœ์‹œ๋ฅผ ์•ž๋‘” ์‹œ์ ์ด๋‹ค. ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ธ๋˜ ๋งŒํผ ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฃผ์˜์ , ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋„์ž…ํ•˜๋Š” ์š”๋ น์„ ์ •๋ฆฌํ•ด๋‘๋ ค ํ•œ๋‹ค.

โ€œ์—†์œผ๋ฉด ๋„ฃ๊ณ  ๊บผ๋‚ด๊ธฐโ€๋Š” ์‚ฌ์†Œํ•œ ๊ฐœ์„ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์„œ๋น„์Šค ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ€์žฅ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋ฐ˜๋ณต ์ค‘ ํ•˜๋‚˜๋‹ค.



1. Map์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค


๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ Map์„ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜๋‹ค. โ€œํ‚ค โ†’ ๊ฐ’โ€ ๊ด€๊ณ„๋ฅผ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌธ์ œ๋Š” ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๋ฃนํ•‘(์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ)์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋Œ€๊ฐœ ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

const groups = new Map();

function add(category, item) {
  if (!groups.has(category)) {
    groups.set(category, []);
  }

  groups.get(category).push(item);
}

์ด ํŒจํ„ด์˜ ๋ณธ์งˆ์€ ๋‹จ์ˆœํ•˜๋‹ค.

  • ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
  • ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ด์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ํ‘œํ˜„์€ ๋Š˜ ์žฅํ™ฉํ•˜๋‹ค. has โ†’ set โ†’ get์ด ํ•จ๊ป˜ ๋ฌถ์—ฌ ๋‹ค๋‹Œ๋‹ค.

์‹ค์ˆ˜๋„ ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค. set๋งŒ ํ•˜๊ณ  get์„ ๋นผ๋จน๊ฑฐ๋‚˜, if/else๊ฐ€ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜, ๊ธฐ๋ณธ๊ฐ’ ์ƒ์„ฑ์ด ๋น„์‹ธ๋„ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.



2. getOrInsert๋Š” โ€œ์˜๋„โ€๋ฅผ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๋“œ๋Ÿฌ๋‚ธ๋‹ค


ECMAScript 2026์—๋Š” ์•„๋ž˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

  • Map.prototype.getOrInsert(key, value)
  • Map.prototype.getOrInsertComputed(key, fn)
  • WeakMap.prototype.getOrInsert(key, value)
  • WeakMap.prototype.getOrInsertComputed(key, fn)

ํ•ต์‹ฌ ๋™์ž‘์€ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค.

  • ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ ๊ฐ’์„ ๋„ฃ๊ณ  ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๊ธฐ์กด ๊ฐ’์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.

getOrInsert() ๋Š” ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์˜๋ฏธ๋‹ค.

if (map.has(key)) {
  return map.get(key);
}

map.set(key, defaultValue);

return defaultValue;

์ด์ œ ๊ทธ๋ฃนํ•‘ ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๋‹ค.

const groups = new Map();

function add(category, item) {
  groups.getOrInsertComputed(category, () => []).push(item);
}

์กฐ๊ฑด๋ฌธ์ด ์‚ฌ๋ผ์ง€๊ณ , โ€œ์—†์œผ๋ฉด ์ƒ์„ฑํ•ด์„œ ๋„ฃ๋Š”๋‹คโ€๋Š” ์˜๋„๊ฐ€ ์ฝ”๋“œ์— ์ง์ ‘ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ฝ”๋“œ์˜ ๋ชฉ์ ์„ ๋” ๋นจ๋ฆฌ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.



3. getOrInsert์™€ getOrInsertComputed์˜ ์ฐจ์ด


๋‘ ๋ฉ”์„œ๋“œ๋Š” ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ, ์šฉ๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๊ฐˆ๋ฆฐ๋‹ค.

  • getOrInsert(key, value)

    const map = new Map();
    
    map.getOrInsert("mode", "dark");  // "dark"
    map.getOrInsert("mode", "light");  // "dark" (๊ธฐ์กด ๊ฐ’์ด ์žˆ์œผ๋ฏ€๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Œ)
    map.getOrInsert(key, expensive());  // ์ฃผ์˜ ํ•„์š”

    ์—ฌ๊ธฐ์„œ ๋™์ž‘์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. getOrInsert๋Š” โ€œํ‚ค๊ฐ€ ์—†์„ ๋•Œ ๊ฐ’์„ ์‚ฝ์ž…โ€ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ ์ธ์ž๋Š” ํ˜ธ์ถœ ์ „์— ํ‰๊ฐ€๋œ๋‹ค. ๋”ฐ๋ผ์„œ getOrInsert(key, expensive())๋Š” ํ‚ค๊ฐ€ ์žˆ์–ด๋„ expensive()๊ฐ€ ์‹คํ–‰๋œ๋‹ค. expensive()๊ฐ€ ๊ฐ’์ด ๋น„์‹ผ ํ•จ์ˆ˜๋ผ๋ฉด, ์ง€์—ฐ ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—” getOrInsertComputed(key, fn)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


  • getOrInsertComputed(key, fn)

    map.getOrInsertComputed("config", () => loadBigConfig());

    getOrInsertComputed๋Š” ํ‚ค๊ฐ€ ์—†์„ ๋•Œ๋งŒ fn์„ ์‹คํ–‰ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ ์ƒ์„ฑ์ด ๋น„์‹ธ๊ฑฐ๋‚˜(ํŒŒ์ผ ์ฝ๊ธฐ, ํŒŒ์‹ฑ, ํฐ ๊ฐ์ฒด ์ƒ์„ฑ) ๋ถ€์ž‘์šฉ์ด ์žˆ์œผ๋ฉด(๋กœ๊ทธ ๋‚จ๊น€, ์™ธ๋ถ€ ํ˜ธ์ถœ) getOrInsertComputed()๋ฅผ ์“ฐ๋Š” ํŽธ์ด ๋งž๋‹ค.



4. ๋ฐ”๋กœ ์“ฐ๋Š” ์˜ˆ์ œ 2๊ฐ€์ง€


4-1. ๊ทธ๋ฃนํ•‘(๋ฉ€ํ‹ฐ๋งต)

const groups = new Map();

function add(category, item) {
  groups.getOrInsertComputed(category, () => []).push(item);
}

add("db", "PostgreSQL");
add("db", "Redis");
add("lang", "JavaScript");

console.log(groups.get("db")); // ["PostgreSQL", "Redis"]

โ€œ์—†์œผ๋ฉด ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ์žˆ์œผ๋ฉด ๊ธฐ์กด ๋ฐฐ์—ด์„ ์“ฐ๊ณ , ๋ฐ”๋กœ pushํ•œ๋‹คโ€๊ฐ€ ํ•œ ์ค„๋กœ ํ‘œํ˜„๋œ๋‹ค.



4-2. ์นด์šดํ„ฐ/์ง‘๊ณ„ ๋งŒ๋“ค๊ธฐ

const counts = new Map();

function hit(key) {
  counts.set(key, counts.getOrInsert(key, 0) + 1);
}

hit("login");
hit("login");
hit("purchase");

console.log(counts.get("login")); // 2

์ด ํŒจํ„ด์€ ๊ฐ์ข… ์ง‘๊ณ„(์ด๋ฒคํŠธ ์ง‘๊ณ„, ์ƒํƒœ ์นด์šดํŒ…)์— ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.



5. ์ฃผ์˜์ ์ด ์žˆ๋‹ค

์ด ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ, ์ž์ฃผ ๋ฐŸ๋Š” ํ•จ์ •์ด ์กด์žฌํ•œ๋‹ค.

  • getOrInsert(key, []) ๋Š” โ€œ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑโ€์ด ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋‹ค

    map.getOrInsert(key, []).push(value);  // ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋‹ค.
    map.getOrInsertComputed(key, () => []).push(value);

    ํ‚ค๊ฐ€ ์ด๋ฏธ ์žˆ์–ด๋„ []๋Š” ํ˜ธ์ถœ ์‹œ์ ๋งˆ๋‹ค ์ƒ์„ฑ๋œ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„๋„ ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์€ ๋‚จ๋Š”๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ์•„๋ž˜๊ฐ€ ์ •๋‹ต์ด๋‹ค.


  • โ€œํ‚ค๊ฐ€ ์—†๋Š” ๊ฒƒโ€๊ณผ โ€œ๊ฐ’์ด undefined ์ธ ๊ฒƒโ€์€ ๋‹ค๋ฅด๋‹ค

    Map์€ ๊ฐ’์œผ๋กœ undefined๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ํŒจํ„ด์€ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

    map.set("a", undefined);
    
    // ์ด ํŒจํ„ด์€ "undefined๋ฉด default"๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.
    // ๊ทธ๋Ÿฐ๋ฐ "ํ‚ค๋Š” ์žˆ์ง€๋งŒ ๊ฐ’์ด undefined"์ธ ๊ฒฝ์šฐ๊นŒ์ง€ default๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฐ๋‹ค.
    map.set("a", map.get("a") ?? "default");

    getOrInsert()๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ โ€œํ‚ค ์กด์žฌ ์—ฌ๋ถ€โ€ ๋กœ ํŒ๋‹จํ•˜๋ฏ€๋กœ ์ด ์ ์„ ์ฃผ์˜ํ•˜์ž.

์ŠคํŽ™์— ํฌํ•จ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ Node ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋„์ž… ์ „์— ์ง€์› ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.



6. ์ตœ์‹  ์ŠคํŽ™์„ ๋ฏธ๋ฆฌ ์•Œ์•„๋ณด๋Š” ๋ฐฉ๋ฒ•


์ŠคํŽ™์„ ๊นŠ๊ฒŒ ํŒŒ๋Š” ๊ฒƒ๋ณด๋‹ค, โ€œ๋ณ€ํ™”์˜ ์‹ ํ˜ธโ€๋ฅผ ๋นจ๋ฆฌ ์žก๋Š” ํŽธ์ด ํšจ์œจ์ ์ด๋‹ค. ์•„๋ž˜ ๋ฃจํ‹ด๋งŒ ์ฑ™๊ฒจ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ƒˆ ๊ธฐ๋Šฅ์€ ๋†“์น˜์ง€ ์•Š๋Š”๋‹ค.

6-1. GitHub๋Š” โ€œ๊ด€์‹ฌ ํ‚ค์›Œ๋“œ๋งŒโ€ Star๋กœ ๋ชจ์•„๋‘”๋‹ค

GitHub๋Š” ์ŠคํŽ™ ๋ณ€ํ™”๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋ชจ์ด๋Š” ๊ณณ์ด๋‹ค. ๋‹ค๋งŒ ๋ชจ๋“  Discussion์„ ๋”ฐ๋ผ๊ฐ€๋ ค ํ•˜๋ฉด ๊ธˆ๋ฐฉ ์ง€์นœ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” โ€œ์ธ๋ฑ์Šค ์ €์žฅ์†Œ + ๊ด€์‹ฌ ์ œ์•ˆ ์ €์žฅ์†Œโ€๋งŒ Star๋กœ ๋ชจ์•„๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋จผ์ €, ๊ธฐ์ค€์ด ๋˜๋Š” ์ธ๋ฑ์Šค 2๊ฐœ๋งŒ ์žก์•„๋‘”๋‹ค.

  • tc39/proposals๋Š” ์ง„ํ–‰ ์ค‘์ธ ECMAScript ์ œ์•ˆ๋“ค์„ ์ถ”์ ํ•˜๋Š” ๋ชฉ๋ก์ด๋‹ค.
  • tc39/ecma262๋Š” ํ‘œ์ค€ ์ŠคํŽ™ ๋ณธ๋ฌธ์ด ๋ชจ์ด๋Š” ์ €์žฅ์†Œ์ด๋ฉฐ, ์ œ์•ˆ์€ proposals์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์•ˆ๋‚ด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  โ€œ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๊ธฐ๋Šฅโ€๋งŒ ์ถ”๊ฐ€๋กœ Starํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒˆ ๊ธ€์˜ ์ฃผ์ œ๋Š” ์•„๋ž˜ ์ €์žฅ์†Œ์—์„œ ์‹œ์ž‘ํ–ˆ๋‹ค.

tc39/proposal-upsert (๊ฒฐ๊ณผ์ ์œผ๋กœ getOrInsert / getOrInsertComputed๋กœ ์ •๋ฆฌ๋œ ์ œ์•ˆ)

GitHub๋Š” Starํ•œ ์ €์žฅ์†Œ๋ฅผ List๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์„ Spec Radar ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์จ์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์ŠคํŽ™ ๊ด€๋ จ ์ €์žฅ์†Œ๋งŒ ๋”ฐ๋กœ ๋ชจ์•„๋‘”๋‹ค. ์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์ƒ˜ํ”Œ๋กœ Starํ•ด์„œ Spec Radar ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด๋‘” ๊ตฌ์„ฑ ์˜ˆ์‹œ๋‹ค. (๊ด€์‹ฌ์‚ฌ์— ๋งž๊ฒŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.)

์ด ์ •๋„๋งŒ ๋ชจ์•„๋‘ฌ๋„ โ€œ์š”์ฆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€โ€ ๊ฐ์ด ์ƒ๊ธด๋‹ค.

์ถ”๊ฐ€๋กœ, ์•Œ๋ฆผ(Watch)์€ ์ตœ์†Œ๋กœ ์ผœ๋Š” ํŽธ์ด ๋‚ซ๋‹ค. ์•Œ๋ฆผ์ด ๋งŽ์•„์ง€๋ฉด ๊ฒฐ๊ตญ ๋‹ค ๊บผ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” Star + ๋ฆฌ์ŠคํŠธ๋กœ ์ •๋ฆฌํ•˜๊ณ , ์ •๋ง ๊ด€์‹ฌ ์žˆ๋Š” ์ €์žฅ์†Œ๋งŒ ์„ ๋ณ„์ ์œผ๋กœ Watchํ•œ๋‹ค.


6-2. ๊ฒฐ๊ตญ์€ ๋Ÿฐํƒ€์ž„ ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ๋ณธ๋‹ค

์ŠคํŽ™์— ๋“ค์–ด๊ฐ”๋‹ค๊ณ  ๋์ด ์•„๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ €/Node ๋ฆด๋ฆฌ์ฆˆ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ๊ฐ€ ์‹ค์ „์ด๋‹ค. ๋”ฐ๋ผ์„œ โ€œ๋‚ด๊ฐ€ ๋ฐฐํฌํ•˜๋Š” ๋Ÿฐํƒ€์ž„โ€์˜ ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ๊ฐ€๋” ํ›‘๋Š” ์Šต๊ด€์ด ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๋‹ค. ์ŠคํŽ™๋ณด๋‹ค ๋Ÿฐํƒ€์ž„์ด ๋” ํ˜„์‹ค์ด๋‹ค.



๐Ÿค” Understanding

Map.getOrInsert() ๋Š” ๊ฑฐ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์–ด๊ฐ€ ๊ฐ€๋Š” ๋ฐฉํ–ฅ์„ ๋˜๋ ทํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ€ํ™”๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณ„์†ํ•ด์„œ โ€œ๊ฐ€๋Šฅ์€ ํ–ˆ์ง€๋งŒ ๋Š˜ ์žฅํ™ฉํ–ˆ๋˜ ํŒจํ„ดโ€์„ ํ‘œ์ค€ API๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ณ  ์žˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•˜๋‹ค.

๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ES2024์˜ Object.groupBy / Map.groupBy ์—์„œ๋„ ๋А๊ผˆ๋‹ค.

Object.groupBy / Map.groupBy (ES2024)

๊ณผ๊ฑฐ์—๋Š” ๊ทธ๋ฃนํ•‘์„ ํ•˜๋ ค๋ฉด reduce๋กœ ๋ˆ„์  ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ pushํ•˜๋Š” ํ๋ฆ„์„ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ๋™์ž‘ ์ž์ฒด๋Š” ๋‹จ์ˆœํ–ˆ์ง€๋งŒ ํ‘œํ˜„์ด ๊ธธ๊ณ , ๊ตฌํ˜„ ๋ฐฉ์‹๋„ ํŒ€๋งˆ๋‹ค ๋‹ฌ๋ž๋‹ค. groupBy๊ฐ€ ๋“ค์–ด์˜ค๋ฉด์„œ โ€œ๊ทธ๋ฃนํ•‘์„ ํ•œ๋‹คโ€๋Š” ์˜๋„๊ฐ€ ์ฝ”๋“œ์— ์ง์ ‘ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ด๋ฒˆ getOrInsert๋„ ๊ฐ™์€ ๊ฒฐ์ด๋‹ค. has โ†’ set โ†’ get์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋Œ€์‹  โ€œ์—†์œผ๋ฉด ๋„ฃ๊ณ  ๊บผ๋‚ธ๋‹คโ€๋Š” ์˜๋„๊ฐ€ ํ•œ ์ค„๋กœ ๊ณ ์ •๋œ๋‹ค. ํŠนํžˆ getOrInsertComputed๋Š” ๊ธฐ๋ณธ๊ฐ’ ์ƒ์„ฑ ๋น„์šฉ๊นŒ์ง€ ์˜๋„์— ๋งž๊ฒŒ ์ง€์—ฐ์‹œํ‚ค๋ฉด์„œ, ์ฝ”๋“œ๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋ฅผ ๋” ์ •ํ™•ํžˆ ํ‘œํ˜„ํ•œ๋‹ค.

์ด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ๋งˆ์Œ์— ๋“ ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ์ „ํžˆ ์œ ์—ฐํ•œ ์–ธ์–ด์ด์ง€๋งŒ, ์ž์ฃผ ์“ฐ๋Š” ํŒจํ„ด์„ ํ‘œ์ค€ API๋กœ ์ •๋ฆฌํ•ด ์ฝ๋Š” ์‚ฌ๋žŒ ์ค‘์‹ฌ์˜ ์ฝ”๋“œ๋กœ ์œ ๋„ํ•˜๊ณ  ์žˆ๋‹ค. ๊ตฌํ˜„์„ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐ˜๋ณต๋˜๋Š” ์˜๋„๋ฅผ ๊ณตํ†ต ์–ธ์–ด๋กœ ์˜ฌ๋ ค์ฃผ๋Š” ๋ฐฉํ–ฅ์ด๋‹ค. groupBy์™€ getOrInsert๋Š” ๊ทธ ํ๋ฆ„์„ ์ž˜ ๋ณด์—ฌ์ฃผ๋Š” ํ•œ ์Œ์˜ ์‚ฌ๋ก€๋ผ ์ƒ๊ฐ๋œ๋‹ค.



Previous
์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์ ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๊ณ ๋ฏผํ•ด๋ดค์–ด์•ผ ํ•  ๊ฒƒ๋“ค
๐Ÿ“šBackend
2026.01.06