
์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ฉ์๋๋ฅผ ์๊ฐํฉ๋๋ค
์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ฉ์๋๋ฅผ ์๊ฐํฉ๋๋ค ๊ด๋ จ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ผ ํด๋, ECMAScript์ ์ด๋ค ๊ธฐ๋ฅ์ด ์๋ก ์ถ๊ฐ๋๊ณ ์๋์ง ์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋์ ๋๊ฒ ํ๋ คํ ๊ธฐ๋ฅ์ ์๋์ง๋ง, ํ์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ณตํด์ ์์ฑํ๋ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์งง๊ณ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊ฟ์ฃผ๋ ์๊ณ ์ค์ฉ์ ์ธ ๋ฉ์๋๋ค์ด ์ต๊ทผ ๋ช ๋ ์ฌ์ด ๊พธ์คํ ์ถ๊ฐ๋๊ณ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์์ ๋ง์ง๋ง ๊ฐ์ ๊บผ๋ผ ๋๋ง๋ค arr[arr.length -1]์ ์ฌ์ฉํ๋ค๋ฉด, ์ด์ ๋ arr.at(-1)์ฒ๋ผ ์กฐ๊ธ ๋ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ด ์๊ฒผ๊ณ , ๊ฐ์ฒด์ ์์ฑ์ด ์กด์ฌํ๋์ง ํ์ธํ ๋ ๋งค๋ฒ hasOwnProperty()๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด์ ๋ Object.hasOwn()์ด๋ผ๋ ํจ์ฌ ์์ ํ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.

์ด๋ฒ ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ต๊ทผ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ฐฐ์ด, ๊ฐ์ฒด, ํ๋ก๋ฏธ์ค(Promise) ๊ด๋ จ ๋ฉ์๋๋ค์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ฉ์๋๋ค์ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฐ๋ ์ฝ๋ ํจํด์ ๋ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ฟ๋ง ์๋๋ผ, ์ด์ ๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ ์ ๋ฌธ์์๊ฒ๋ ๋ง์ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ํ ๋ฆฌ์กํธ(React)๋ ๋ฅ์คํธjs(Next.js)๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค๋ ๋งค์ฐ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ด๋ผ๊ณ ํด์ ์ด๋ ต๊ฑฐ๋ ๋ถ๋ด์ค๋ฌ์ด ๊ฒ์ด ์๋๋ผ, ์คํ๋ ค ์ต์ํ ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ๋ผ๋ ์ ์ ํจ๊ป ๋๊ปด ๋ณด์๋ฉด ์ข๊ฒ ์ต๋๋ค.
๋ฐฐ์ด์ ๋ ์งง๊ณ , ๋ ๋ช ํํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๊ฐ์ฅ ์์ฃผ ๋ง์ฃผํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค ํ๋๋ ๋ฐ๋ก ๋ฐฐ์ด์ ๋๋ค. ๋ฐ๋ณต๋ฌธ, ์ ๋ ฌ, ํํฐ๋ง ๋ฑ ๋ค์ํ ์ํฉ์์ ๋ฑ์ฅํ๋ ๋งํผ, ๋ฐฐ์ด์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋๊ตฌ๊ฐ ๋ง์์๋ก ์์ฐ์ฑ๋ ์์ฐ์ค๋ฝ๊ฒ ๋์์ง๊ฒ ๋์ฃ . ์ต๊ทผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฐฐ์ด์ ๋ ์์ ํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ ์๋ก์ด ๋ฉ์๋๋ค์ด ๋ฑ์ฅํ๋๋ฐ์. ํ๋์ฉ ์ดํด๋ณผ๊ฒ์.
1. .at()
๋ฐฐ์ด์์ ํน์ ์์น์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ผ์ ๋งค์ฐ ํํ ์์
์
๋๋ค. ํนํ ๋ง์ง๋ง ์์๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์ค๋ซ๋์ arr[arr.length-1]
์ด๋ผ๋ ๋ฌธ๋ฒ์ ์ต์ํด์ ธ ์์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ๊ธธ์ด ๊ณ์ฐ์ด ํ์ํ๊ณ , ์ฝ๋ ์ฌ๋ ์
์ฅ์์๋ ์ฆ๊ฐ์ ์ผ๋ก โ๋ง์ง๋ง ์์๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ ์๋โ๊ฐ ๋ช
ํํ๊ฒ ๋๋ฌ๋์ง ์๋๋ค๋ ๋จ์ ์ด ์์์ฃ .
.at()
๋ฉ์๋๋ ์ด ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ๊ฒ ํด๊ฒฐํด ์ฃผ๋ ๋๊ตฌ์
๋๋ค. ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋ฐํํ๋ ์ด ๋ฉ์๋๋, ํนํ ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์์ ํฐ ์ฐจ๋ณ์ ์ ๊ฐ์ง๋๋ค. arr.at(-1)
์ด๋ผ๊ณ ์์ฑํ๋ฉด ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐ๋ก ์ป์ ์ ์๊ณ , arr.at(-2)
๋ผ๊ณ ์์ฑํ๋ฉด, ๋ค์์ ๋ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ๋ค์ ์์๋๋ก ๋ฐฐ์ด์ ์ ์ฅํด๋๊ณ , ๊ฐ์ฅ ์ต๊ทผ ํญ๋ชฉ๋ง ํ๋ฉด์ ํ์ํ๊ณ ์ถ์ ๋, .at(-1)
์ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์ง๊ด์ ์ธ ์ฝ๋๊ฐ ๋ฉ๋๋ค. ๋ํ ๋ฐฐ์ด์ด ๋น์ด ์๋ ๊ฒฝ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ undefined
๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์, ์กฐ๊ฑด๋ฌธ๊ณผ ํจ๊ป ์ฐ๋ฉด ์์ ํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
const fruits = ["apple", "banana", "grape"];
console.log(fruits.at(-1)) // grape
console.log(fruits.at(-2)) // banana
2. .groupBy()
๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์์ฃผ ํ๊ฒ ๋๋ ์์ ์ค ํ๋๋, ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ํญ๋ชฉ๋ค์ ๋ฌถ๋ ์ผ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์๊ธ์ ํ๊ทธ๋ณ๋ก ๊ตฌ๋ถํ๊ฑฐ๋, ์ฃผ๋ฌธ ๋ชฉ๋ก์ ๊ฒฐ์ ์ํ๋ณ๋ก ๋๋๊ฑฐ๋, ์ ์ ์ ๋ณด๋ฅผ ๋ฑ๊ธ๋ณ๋ก ๋ถ๋ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ์ต๋๋ค.
๊ธฐ์กด์๋ ์ด๋ฌํ ๋ถ๋ฅ ์์
์ ์๋์ ๊ฐ์ด reduce()
๋ก ์ง์ ๊ตฌํํ๊ฑฐ๋, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.

๋ฌผ๋ก ์ด ๋ฐฉ์๋ ์ ๋์ํ์ง๋ง, ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์๋๊ฐ ๋์ ์ ๋๋ฌ๋์ง ์๋๋ค๋ ๋จ์ ์ด ์์๋๋ฐ์, ์ด์ ๋ ECMAScript 2024์์ ์๋กญ๊ฒ ํ์ค์ผ๋ก ์ฑํ๋ Array.prototype.groupBy()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ๋ช
ํํ ์ฝ๋๋ก ๊ฐ์ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ๋ถ๋ฅ ๊ธฐ์ค์ด ๋๋ ํค๋ฅผ ๋ฐํํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์, ํด๋น ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ํญ๋ชฉ๋ค์ ์๋์ผ๋ก ๊ทธ๋ฃนํํด ๊ฐ์ฒด ํํ๋ก ๋ฐํํฉ๋๋ค.
const posts = [
{ id: 1, tag: "react", title: "useState ์์ ์ ๋ณต" },
{ id: 2, tag: "js", title: "ํด๋ก์ ์ฝ๊ฒ ์ดํดํ๊ธฐ" },
{ id: 3, tag: "react", title: "useEffect ํจํด" },
];
const groupedByTag = posts.groupBy(post => post.tag);
/*
{
react: [
{ id: 1, tag: "react", title: "useState ์์ ์ ๋ณต" },
{ id: 3, tag: "react", title: "useEffect ํจํด" }
],
js: [
{ id: 2, tag: "js", title: "ํด๋ก์ ์ฝ๊ฒ ์ดํดํ๊ธฐ" }
]
}
*/
์ด๋ ๊ฒ ์์ฑํ๋ฉด reduce()
๋ก ์๋ ์ฒ๋ฆฌํ๋ ๋ณต์กํ ๋ก์ง์ ๋จ ํ ์ค๋ก ๋์ฒดํ ์ ์๊ณ , ๊ฐ๋
์ฑ๋ ํจ์ฌ ์ข์์ง๋๋ค. groupBy()
๋ ํนํ ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์นดํ
๊ณ ๋ฆฌ๋ณ๋ก ๋ฌถ์ด ๋ฆฌ์คํธ๋ฅผ ๋๋ ๋ณด์ฌ์ฃผ๋ UI๋ฅผ ๋ง๋ค ๋ ์์ฃผ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ง๋ณ๋ก ํ ์ผ์ ๊ทธ๋ฃนํํ๊ฑฐ๋ ์ํ๊ฐ(status)์ ๋ฐ๋ผ ์ด์๋ฅผ ๋๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, ์ด ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
3 .toSorted()
๋ฐฐ์ด์ ์ ๋ ฌํ๋ ์์
์ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ๊ธฐ๋ณธ ์ค ๊ธฐ๋ณธ์ด์ฃ . ์ซ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ฑฐ๋, ํ
์คํธ๋ฅผ ์ํ๋ฒณ์์ผ๋ก ๋์ดํ๋ ๋ฑ์ ์์
์ ๊ฑฐ์ ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ํ์ํฉ๋๋ค. ๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ Array.prototype.sort()
๋ฅผ ์ฌ์ฉํด์ ์ ๋ ฌํด ์์๋๋ฐ์. ์ด ๋ฉ์๋๋ ์ ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋์์ ์๋ณธ ๋ฐฐ์ด์ ์ง์ ์์ ํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ํน์ง์ ์๋์น ์์ ๋ถ์์ฉ์ ์ผ์ผํฌ ์ ์์ด ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก toSorted()
์
๋๋ค. ์ด ๋ฉ์๋๋ ๊ธฐ์กด ๋ฐฐ์ด์ ๋ณ๊ฒฝํ์ง ์๊ณ , ์ ๋ ฌ๋ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ์ฆ, ์๋ณธ์ ๊ทธ๋๋ก ๋๊ณ ๋ณต์ฌ๋ณธ์ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ๋ถ๋ณ์ฑ์ ์ง์ผ์ผ ํ๋ ์ํฉ์์๋ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฐ์
๋๋ค.
const prices = [4000, 1000, 3000];
const sortedPrices = prices.toSorted((a, b) => a - b);
console.log(sortedPrices); // [1000, 3000, 4000]
console.log(prices); // [4000, 1000, 3000] (์๋ณธ์ ๊ทธ๋๋ก)
์ค๋ฌด์์ ์ํ ๊ฐ๊ฒฉ ๋ชฉ๋ก์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ฑฐ๋, ๊ธฐ๋ก์ ๋ ์ง ์์ผ๋ก ์ ๋ ฌํ ๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ฉด์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ์. ์ด๋ด ๋ ์ด๋ ๊ฒ toSorted()
๋ฅผ ํ์ฉํ๋ฉด slice().sort()
์ฒ๋ผ ์ฐํํ์ง ์๊ณ ๋ ๋์ฑ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๊ฐ์ฒด๋ฅผ ๋ ์์ ํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด๋ ๋งค์ฐ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฐ ์ ์ฐํจ ๋๋ถ์ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํํํ ์ ์์ง๋ง, ๋์์ ์๊ธฐ์น ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค. ์ต๊ทผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๊ฐ์ฒด๋ฅผ ๋์ฑ ๋ช
ํํ๊ณ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ก ๋ช ๊ฐ์ง ์ ์ฉํ ๋ฉ์๋๊ฐ ์๋ก ๋์
๋์์ต๋๋ค. ๊ทธ์ค์์๋ Object.hasOwn()
๊ณผ Object.groupBy()
๋ ๊ฐ์ฒด ๊ฒ์ฌ ๋ฐ ๋ฐ์ดํฐ ๋ถ๋ฅ ์์
์ ํฐ ๋์์ด ๋ฉ๋๋ค. ํ๋์ฉ ์ดํด๋ณผ๊ฒ์.
1. Object.hasOwn()
๊ฐ์ฒด์ ํน์ ์์ฑ์ด ์๋์ง๋ฅผ ํ์ธํ ๋ ํํ ์ฌ์ฉํ๋ ๋ฐฉ์์ obj.hasOwnProperty(key)
์
๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ์. hasOwnProperty()
๋ ๊ฐ์ฒด๊ฐ ์ง์ ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋๋ผ Object.prototype
์ผ๋ก๋ถํฐ ์์๋ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ฒด์ ํด๋น ํ๋กํ ํ์
์ ์ ๊ฑฐํ๊ฑฐ๋ ์์ฑ์ ๋ฎ์ด์ผ์ ๊ฒฝ์ฐ ์ ๋๋ก ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก Object.hasOwn()
์
๋๋ค. ์ด ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๊ฐ์ฒด๋ฅผ, ๋ ๋ฒ์งธ ์ธ์๋ก ์์ฑ ํค๋ฅผ ๋ฐ์, ํด๋น ํค๊ฐ ๊ทธ ๊ฐ์ฒด ์์ฒด์์ ์ง์ ์กด์ฌํ๋์ง๋ฅผ ์์ ํ๊ฒ ํ๋จํฉ๋๋ค. ํนํ Object.create(null)
๊ณผ ๊ฐ์ด ํ๋กํ ํ์
์ด ์๋ ์์ํ ๊ฐ์ฒด์์๋ ์์ธ ์์ด ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด ํต์ฌ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
const settings = Object.create(null);
settings.theme = "dark";
console.log(settings.hasOwnProperty); // undefined
console.log(Object.hasOwn(settings, "theme")); // true
์ฌ๊ธฐ์ Object.create(null)
์ ์ฌ์ฉํด ๋ง๋ settings
๊ฐ์ฒด๋ Object.prototype
์ ์์๋ฐ์ง ์์ต๋๋ค. ์ฆ, ์ผ๋ฐ ๊ฐ์ฒด์ฒ๋ผ .hasOwnProperty
๋ผ๋ ๋ฉ์๋๋ฅผ ๋ด์ฅํ๊ณ ์์ง ์์, settings.hasOwnProperty
๋ฅผ ํธ์ถํ๋ฉด undefined
๊ฐ ์ถ๋ ฅ๋๊ณ , ๋ง์ฝ ์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
ํ์ง๋ง Object.hasOwn(settings, 'theme')
์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ์์ด 'theme'๋ผ๋ ์์ฑ์ด settings
์ ์กด์ฌํ๋์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ Object.hasOwn()
์ ๋ชจ๋ ์ข
๋ฅ์ ๊ฐ์ฒด์ ๋ํด ์์ ํ๊ฒ ์์ฑ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ด๋ฏ๋ก, ์์ผ๋ก๋ hasOwnProperty()
๋ณด๋ค ์ด ๋ฉ์๋๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
2 Object.groupBy()
๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋๋๊ณ , ์ด๋ฅผ ๊ฐ์ฒด์ ํํ๋ก ์ ๋ฆฌํด์ ํ์ฉํด์ผ ํ๋ ์ํฉ์ ๋งค์ฐ ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์๊ธ์ ์์ฑ์ผ ๊ธฐ์ค์ผ๋ก ๋ฌถ๊ฑฐ๋, ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฑ๊ธ๋ณ๋ก ๊ตฌ๋ถํ๊ฑฐ๋, ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ ๋ฒจ๋ณ๋ก ๋ถ๋ฅํ๋ ๋ฑ์ ์์ ์ด ์์ฃ .
์ด๋ฌํ ์์
์ Object.groupBy()
๋ฅผ ์ฌ์ฉํ๋ฉด ํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ Array.prototype.groupBy()
์ ์ ์ฌํ ๋์์ ํ์ง๋ง, Object ๊ฐ์ฒด์ ์ ์ ๋ฉ์๋๋ก ์ ์๋์ด ์๋ค๋ ์ ์ด ๋ค๋ฆ
๋๋ค. ๋ ๋ฉ์๋ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ฐ ๊ฐ์ฒด ํํ๋ก ๋ฐํํ๋ฉฐ, ๊ทธ๋ฃนํ๋ ํค๋ ๋ฌธ์์ด๋ก ๋ณํ๋๊ธฐ ๋๋ฌธ์ JSON ์ง๋ ฌํ์ ์ ๋ฆฌํ๊ณ , UI ๋ ๋๋ง์ด๋ ์กฐ๊ฑด ๋ถ๊ธฐ์๋ ์ฝ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ ๋ฐ์ดํฐ๋ฅผ ํ๋
(grade
) ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๊ณ ์ถ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
const students = [
{ name: "ํ์ง", grade: 1 },
{ name: "๋ฏผ์", grade: 2 },
{ name: "์์ง", grade: 1 },
{ name: "์งํ", grade: 3 }
];
const groupedByGrade = Object.groupBy(students, student => student.grade);
/*
{
1: [
{ name: "ํ์ง", grade: 1 },
{ name: "์์ง", grade: 1 }
],
2: [
{ name: "๋ฏผ์", grade: 2 }
],
3: [
{ name: "์งํ", grade: 3 }
]
}
*/
์ด ๋ฉ์๋๋ ์ฌ์ฉ์ ๋ชฉ๋ก์ ์ญํ ๋ณ๋ก ๋ถ๋ฅํ๊ฑฐ๋, ์ํ ๋ฐ์ดํฐ๋ฅผ ์นดํ
๊ณ ๋ฆฌ๋ณ๋ก ์ ๋ฆฌํด์ผ ํ ๋์ฒ๋ผ, ํ๋ก ํธ์๋์์ ์์ฃผ ๋ง์ฃผ์น๋ UI ๊ตฌ์กฐ๋ฅผ ์์ฝ๊ฒ ๋ท๋ฐ์นจํ๋ ๋๊ตฌ๋ก ๋งค์ฐ ํจ๊ณผ์ ์
๋๋ค. ๊ธฐ์กด์๋ reduce()
๋ฅผ ์ด์ฉํด ๋น๊ต์ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๋ฉด, ์ด์ ๋ Object.groupBy()
ํ๋๋ก ์๋๊ฐ ๋ช
ํํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ํ๋ฆ์ ๋ ์ ์ฐํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ ์ธ์ด์
๋๋ค. ๋คํธ์ํฌ ์์ฒญ, ํ์ด๋จธ, ์ฌ์ฉ์ ์ธํฐ๋์
๋ฑ ๋๋ถ๋ถ์ ์์
์ด ๋น๋๊ธฐ ํ๋ฆ ์์์ ์ฒ๋ฆฌ๋์ฃ . ํ์ง๋ง ๋๋ก๋ ๋จ์ํ fetch()
ํธ์ถ๋ง์ผ๋ก ํด๊ฒฐ๋์ง ์๋ ๋ณต์กํ ํ๋ฆ์ด ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฌ์ฉ์ ํ๋์ ๊ธฐ๋ค๋ฆฌ๋ ๊ตฌ์กฐ ๋ฑ์
๋๋ค.

๊ธฐ์กด์๋ new Promise()
๋ฅผ ์์ฑํ๊ณ , ์ธ๋ถ์ resolve
๋ reject
๋ฅผ ๊บผ๋ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ด์์ง๋ง, ์ด ๋ฐฉ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์๋ก ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๊ณ , ์ ์ง๋ณด์๋ ์ด๋ ค์์ง ์ ์๋๋ฐ์. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฉ์๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. Promise.withResolvers()
์์์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฉ์๋๊ฐ ๋ฐ๋ก Promise.withResolvers()
์
๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด promise
, resolve
, reject
๋ฅผ ํ ๋ฒ์ ์ป์ ์ ์์ด์, ์ธ๋ถ์์ ๋น๋๊ธฐ ํ๋ฆ์ ์ง์ ์ ์ดํ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค. ํ์ง๋ง Promise.withResolvers()
๋ ํ์ฌ ECMAScript ํ์ค์๋ ํฌํจ๋์ด ์์ง ์์ผ๋ฉฐ, ์์ง ์ ์ ๋จ๊ณ์ ์๋ ์ํ์
๋๋ค. ์ผ๋ถ ํ๊ฒฝ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ๊ตฌ ๋ธ๋ผ์ฐ์ ๋ ๋ฐํ์์์๋ ์ง์ ๊ตฌํ์ด ํ์ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
const { promise, resolve } = Promise.withResolvers();
setTimeout(() => {
resolve("์๋ฃ๋์์ต๋๋ค!");
}, 1000);
promise.then(result => {
console.log(result); // "์๋ฃ๋์์ต๋๋ค!"
});
์ด๋ฌํ ๊ตฌ์กฐ๋ ํนํ ์ฌ์ฉ์ ์ก์ ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ํฉ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ฌ์ผ๋ง ๋ค์ ๋จ๊ณ๋ก ์งํ๋๋ ๋ชจ๋ฌ์ ์๊ฐํด ๋ณผ ์ ์๋๋ฐ์, ์์ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
function showConfirmModal() {
const { promise, resolve } = Promise.withResolvers();
openModal({ onConfirm: resolve }); // ํ์ธ ์ resolve ํธ์ถ
return promise;
}
async function handleDelete() {
const confirmed = await showConfirmModal();
if (confirmed) {
deleteItem();
}
}
๊ธฐ์กด์๋ ์ฝ๋ฐฑ ์ง์ฅ์ด ์๊ธฐ๊ฑฐ๋, ์ํ๋ฅผ ๋ณต์กํ๊ฒ ๊ตฌ์ฑํด์ผ ํ๋ ํ๋ฆ๋, ์์ ์ฝ๋์ ๊ฐ์ด Promise.withResolvers()
๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์ ์ธ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ์ดํด๋ณธ ๋ฉ์๋๋ค์ .at()
, Array.prototype.groupBy()
, .toSorted()
, Object.hasOwn()
, Object.groupBy()
, Promise.withResolvers()
์ฒ๋ผ ํฌ๊ณ ๋ณต์กํ ๊ธฐ๋ฅ์ด ์๋๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ๋ฐ๋ณตํ๋ ์ฝ๋, ์ฆ ๋ฐฐ์ด์์ ๊ฐ์ ๊บผ๋ด๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ฐ์ฒด ์์ฑ์ ํ์ธํ๊ณ , ๋น๋๊ธฐ ํ๋ฆ์ ๋ค๋ฃจ๋ ์์
์ ๋ ์์ ํ๊ณ ์ฝ๊ธฐ ์ข๊ฒ ๋ฐ๊ฟ์ฃผ๋ ์์ง๋ง ๊ฐ๋ ฅํ ๋๊ตฌ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์ ์๊ฐํ ๋ฉ์๋๋ค์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด๋ณด๋ค ๋ ์งง๊ณ ๋ช ํํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์๊ณ , ํ์ ์์๋ ์๋๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค. ํนํ React๋ Next.js๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ ์ํ ๋ถ๋ณ์ฑ๊ณผ ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ๋ง์, ์ด ๋ฉ์๋๋ค์ด ์ฃผ๋ ์ฅ์ ์ด ๋ ํฌ๊ฒ ๋๊ปด์ง ๊ฒ๋๋ค. ์ต์ ๋ฌธ๋ฒ์ด๋ผ๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ด๋ ต๊ฑฐ๋ ๋ฌด๊ฑฐ์ด ๊ฒ์ ์๋๋๋ค. ์คํ๋ ค ์ง๊ธ๊น์ง ๋ณต์กํ๊ฒ ํ๋ ๋ฌธ์ ๋ฅผ ๋ ๋จ์ํ๊ณ , ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋๋ ์ชฝ์ ๊ฐ๊น์ต๋๋ค. ์ด์ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์๋ ํ๋์ฉ ์ ์ฉํด ๋ณด๋ฉฐ, ๊ธฐ๋ฅ๋ค์ ์ตํ๋ณด์๊ธธ ์ถ์ฒํฉ๋๋ค.