JavaScript WeakRef์ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ํตํ ์๋ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์์๋ณด์ธ์. ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค.
JavaScript WeakRef ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ: ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ํ
ํ๋์ JavaScript ์ ํ๋ฆฌ์ผ์ด์
, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํต์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ํจ๊ณผ์ ์ด๊ธด ํ์ง๋ง ํญ์ ์์ธก ๊ฐ๋ฅํ๊ฑฐ๋ ํน์ ์ ํ๋ฆฌ์ผ์ด์
์๊ตฌ์ ์ต์ ํ๋์ด ์์ง๋ ์์ต๋๋ค. JavaScript์ ๋์
๋ WeakRef์ ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ ๊ฐ๋ฐ์์๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๊ณ ๋ฏธ์ธ ์กฐ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ค์ผ ์ ์๊ฒ ํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ค์ํ ๊ตญ์ ๊ฐ๋ฐ ์๋๋ฆฌ์ค์ ๊ด๋ จ๋ ์ค์ ์์ ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ํฌ๊ด์ ์ผ๋ก ํ์ํฉ๋๋ค.
JavaScript์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ดํดํ๊ธฐ
JavaScript๋ ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๊ธฐ ์ํด ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ ์ค์บํ์ฌ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๊ณ ํด์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ณผ์ ์ ๋น๊ฒฐ์ ์ ์ด์ด์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ธ์ ๋ฐ์ํ ์ง ์ ์ดํ๋ ๋ฐ ํ๊ณ๊ฐ ์์ต๋๋ค.
์ ํต์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ณผ์ :
- ์์ธก ๋ถ๊ฐ๋ฅ์ฑ: ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ๋ ์์ธกํ ์ ์์ด ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๊ฐํ ์ฐธ์กฐ: ์ ํต์ ์ธ ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ๋ฐํ๊ฒ ์ฌ์ฉ๋์ง ์๋๋ผ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ ๊ฒ์ ๋ง์ต๋๋ค. ์ด๋ ์ฐธ์กฐ๊ฐ ๋ถ์ฃผ์ํ๊ฒ ์ ์ง๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ ํ๋ ์ ์ด: ๊ฐ๋ฐ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์ ์ ์ดํ ์ ์์ด ์ต์ ํ ๋ ธ๋ ฅ์ ๋ฐฉํดํฉ๋๋ค.
์ด๋ฌํ ํ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํนํ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค:
- ๋์ฉ๋ ๋ฐ์ดํฐ์ : ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์บ์ฑํ๋ ์ ํ๋ฆฌ์ผ์ด์ (์: ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธ์ต ๋ชจ๋ธ๋ง ์ ํ๋ฆฌ์ผ์ด์ , ๊ณผํ ์๋ฎฌ๋ ์ด์ )์ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ํ ๊ด๋ฆฌ: ๋ณต์กํ ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)(์: ํ์ ๋ฌธ์ ํธ์ง๊ธฐ, ๋ณต์กํ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ)์ ๋ณต์กํ ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ๋ง๋ค์ด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํจ์จ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์์ต๋๋ค.
- ์ฅ๊ธฐ ์คํ ํ๋ก์ธ์ค: ์ฅ์๊ฐ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ (์: ๊ธ๋ก๋ฒ API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ , ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ)์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ ์ทจ์ฝํฉ๋๋ค.
WeakRef ์๊ฐ: ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฐฉํดํ์ง ์๊ณ ์ฐธ์กฐ ์ ์งํ๊ธฐ
WeakRef๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ ๊ฒ์ ๋ง์ง ์์ผ๋ฉด์ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ์
ํ์ง ์๊ณ ๊ฐ์ฒด์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค. WeakRef๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ฉด, WeakRef์ deref() ๋ฉ์๋๋ undefined๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์ ๊ฐ๋ :
- ์ฝํ ์ฐธ์กฐ(Weak References):
WeakRef๋ ๊ฐ์ฒด์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ์์ฑํ์ฌ, ํด๋น ๊ฐ์ฒด๊ฐ ๋ ์ด์ ๊ฐํ๊ฒ ์ฐธ์กฐ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์๋๋ก ํฉ๋๋ค. - `deref()` ๋ฉ์๋:
deref()๋ฉ์๋๋ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ์กด์ฌํ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉดundefined๋ฅผ ๋ฐํํฉ๋๋ค.
์์ : WeakRef ์ฌ์ฉํ๊ธฐ
```javascript // ์ผ๋ฐ ๊ฐ์ฒด ์์ฑ let myObject = { id: 1, name: "Example Data", description: "This is an example object." }; // ๊ฐ์ฒด์ ๋ํ WeakRef ์์ฑ let weakRef = new WeakRef(myObject); // WeakRef๋ฅผ ํตํด ๊ฐ์ฒด์ ์ ๊ทผ let retrievedObject = weakRef.deref(); console.log(retrievedObject); // ์ถ๋ ฅ: { id: 1, name: "Example Data", description: "This is an example object." } // ๊ฐ๋น์ง ์ปฌ๋ ์ ์๋ฎฌ๋ ์ด์ (์ค์ ๋ก๋ ๋น๊ฒฐ์ ์ ์) myObject = null; // ๊ฐํ ์ฐธ์กฐ ์ ๊ฑฐ // ์ ์ ํ, ๋ค์ ๊ฐ์ฒด์ ์ ๊ทผ ์๋ setTimeout(() => { let retrievedObjectAgain = weakRef.deref(); console.log(retrievedObjectAgain); // ์ถ๋ ฅ: undefined (๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ๊ฒฝ์ฐ) }, 1000); ```WeakRef์ ์ฌ์ฉ ์ฌ๋ก:
- ์บ์ฑ: ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ์๋์ผ๋ก ํญ๋ชฉ์ ์ ๊ฑฐํ๋ ์บ์๋ฅผ ๊ตฌํํฉ๋๋ค. URL์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๋ ๊ธ๋ก๋ฒ ์ด๋ฏธ์ง ์บ์ฑ ์๋น์ค๋ฅผ ์์ํด ๋ณด์ธ์.
WeakRef๋ฅผ ์ฌ์ฉํ๋ฉด, ์บ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ด์ ํ๋ฐํ๊ฒ ์ฌ์ฉ๋์ง ์๋ ์ด๋ฏธ์ง์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ฉด์๋ ํด๋น ์ด๋ฏธ์ง๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ ๊ฒ์ ๋ง์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์บ์๊ฐ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ์ง ์๊ณ , ์ฌ๋ฌ ์ง๋ฆฌ์ ์ง์ญ์ ๊ฑธ์ณ ๋ณํํ๋ ์ฌ์ฉ์ ์๊ตฌ์ ์๋์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. - ๊ฐ์ฒด ์๋ช
์ฃผ๊ธฐ ๊ด์ฐฐ: ๋๋ฒ๊น
์ด๋ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ํด ๊ฐ์ฒด ์์ฑ ๋ฐ ์๋ฉธ์ ์ถ์ ํฉ๋๋ค. ์์คํ
๋ชจ๋ํฐ๋ง ์ ํ๋ฆฌ์ผ์ด์
์
WeakRef๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ์์คํ ์ ์ค์ํ ๊ฐ์ฒด๋ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ๊ฐ์ฒด๊ฐ ์๊ธฐ์น ์๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ฉด, ๋ชจ๋ํฐ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๊ธฐ ์ํด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. - ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์์๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ญ๋๋ค. ๊ธ๋ก๋ฒ ๋คํธ์ํฌ์ ์ฌํ์ ์ฐ๊ฒฐ์ ๋ํ๋ด๋ ๋๊ท๋ชจ ๊ทธ๋ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋
WeakRef์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ๋นํ์ฑ ์ฌ์ฉ์๋ฅผ ๋ํ๋ด๋ ๋ ธ๋๋ ์ ์ฒด ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ์ ์์ด, ํ์ฑ ์ฌ์ฉ์์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์์ง ์์ผ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ ์ ์์ต๋๋ค.
ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ (FinalizationRegistry): ๊ฐ๋น์ง ์ปฌ๋ ์ ํ ์ฝ๋ ์คํํ๊ธฐ
FinalizationRegistry๋ฅผ ํตํด ๊ตฌํ๋ ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ ํ์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฆฌ์์ค ํด์ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์
๋ฐ์ดํธ์ ๊ฐ์ ์ ๋ฆฌ ์์
์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ด๋ฒคํธ์ ๋์ํ์ฌ ์ํํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋ :
- FinalizationRegistry: ๊ฐ์ฒด์ ํด๋น ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ๋ ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์๋ ๋ ์ง์คํธ๋ฆฌ์ ๋๋ค.
- `register()` ๋ฉ์๋: ๊ฐ์ฒด๋ฅผ ์ฝ๋ฐฑ ํจ์์ ํจ๊ป ๋ฑ๋กํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
- `unregister()` ๋ฉ์๋: ๋ฑ๋ก๋ ๊ฐ์ฒด์ ์ฐ๊ด๋ ์ฝ๋ฐฑ์ ๋ ์ง์คํธ๋ฆฌ์์ ์ ๊ฑฐํฉ๋๋ค.
์์ : FinalizationRegistry ์ฌ์ฉํ๊ธฐ
```javascript // FinalizationRegistry ์์ฑ const registry = new FinalizationRegistry( (heldValue) => { console.log('Object with heldValue ' + heldValue + ' was garbage collected.'); // ์ฌ๊ธฐ์ ์ ๋ฆฌ ์์ ์ํ, ์: ๋ฆฌ์์ค ํด์ } ); // ๊ฐ์ฒด ์์ฑ let myObject = { id: 1, name: "Example Data" }; // FinalizationRegistry์ ๊ฐ์ฒด ๋ฑ๋ก registry.register(myObject, myObject.id); // ๊ฐ์ฒด์ ๋ํ ๊ฐํ ์ฐธ์กฐ ์ ๊ฑฐ myObject = null; // ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋จ // ์ถ๋ ฅ: "Object with heldValue 1 was garbage collected." ```์ค์ ๊ณ ๋ ค์ฌํญ:
- ๋น๊ฒฐ์ ์ ํ์ด๋ฐ: ์ฝ๋ฐฑ ํจ์๋ ๋น๊ฒฐ์ ์ ์ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ์ ์คํ๋ฉ๋๋ค. ์ ํํ ํ์ด๋ฐ์ ์์กดํ์ง ๋ง์ธ์.
- ์ ๊ฐ์ฒด ์์ฑ ํผํ๊ธฐ: ์ฝ๋ฐฑ ํจ์ ๋ด์์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ํผํ์ธ์. ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐฉํดํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ์ ๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๋ฐฉํดํ์ง ์๋๋ก ์ฝ๋ฐฑ ํจ์ ๋ด์ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ ๊ตฌํํ์ธ์.
FinalizationRegistry์ ์ฌ์ฉ ์ฌ๋ก:
- ๋ฆฌ์์ค ๊ด๋ฆฌ: ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ ๋ ์ธ๋ถ ๋ฆฌ์์ค(์: ํ์ผ ํธ๋ค, ๋คํธ์ํฌ ์ฐ๊ฒฐ)๋ฅผ ํด์ ํฉ๋๋ค. ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ ๊ด๋ฆฌํ๋ ์์คํ
์ ์๊ฐํด ๋ณด์ธ์. ์ฐ๊ฒฐ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋,
FinalizationRegistry๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ซํ๋๋ก ๋ณด์ฅํ๊ณ , ๊ท์คํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ฉฐ, ๋ค๋ฅธ ์ง์ญ์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ ์ฐ๊ฒฐ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. - ์บ์ ๋ฌดํจํ: ์ฐ๊ด๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ ๋ ์บ์ ํญ๋ชฉ์ ๋ฌดํจํํฉ๋๋ค. CDN(์ฝํ
์ธ ์ ์ก ๋คํธ์ํฌ) ์บ์ฑ ์์คํ
์
FinalizationRegistry๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณธ ๋ฐ์ดํฐ ์์ค๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ ์ฝํ ์ธ ๋ฅผ ๋ฌดํจํํ ์ ์์ต๋๋ค. ์ด๋ CDN์ด ํญ์ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ต์ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋๋ก ๋ณด์ฅํฉ๋๋ค. - Weak Map ๋ฐ Weak Set: ์ ๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ฌ์ฉ์ ์ ์ weak map๊ณผ weak set์ ๊ตฌํํฉ๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ์ ์ธ์
์ ๊ด๋ฆฌํ๋ ์์คํ
์ weak map์ ์ฌ์ฉํ์ฌ ์ธ์
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ธ์
์ด ๋ง๋ฃ๋๊ณ ์ธ์
๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ฉด,
FinalizationRegistry๋ฅผ ์ฌ์ฉํ์ฌ ๋งต์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ , ์์คํ ์ด ๋ถํ์ํ ์ธ์ ์ ๋ณด๋ฅผ ์ ์งํ์ง ์๋๋ก ํ๋ฉฐ, ์ฌ๋ฌ ๊ตญ๊ฐ์ ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ WeakRef์ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ ๊ฒฐํฉํ๊ธฐ
WeakRef์ ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ฅผ ๊ฒฐํฉํ๋ฉด ๊ฐ๋ฐ์๋ ์ ๊ตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ๋ง๋ค ์ ์์ต๋๋ค. WeakRef๋ ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋ฐฉํดํ์ง ์๊ณ ๊ฐ์ฒด ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด์ฐฐํ ์ ์๊ฒ ํ๊ณ , ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ฐ์ ํ ์ ๋ฆฌ ์์
์ ์ํํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์์ : ์๋ ์ ๊ฑฐ ๋ฐ ๋ฆฌ์์ค ํด์ ๊ธฐ๋ฅ์ด ์๋ ์บ์ ๊ตฌํํ๊ธฐ
```javascript class Resource { constructor(id) { this.id = id; this.data = this.loadData(id); // ๋ฆฌ์์ค ๋ฐ์ดํฐ ๋ก๋ฉ ์๋ฎฌ๋ ์ด์ console.log(`Resource ${id} created.`); } loadData(id) { // ์ธ๋ถ ์์ค์์ ๋ฐ์ดํฐ ๋ก๋ฉ ์๋ฎฌ๋ ์ด์ console.log(`Loading data for resource ${id}...`); return `Data for resource ${id}`; // ํ๋ ์ด์คํ๋ ๋ฐ์ดํฐ } release() { console.log(`Releasing resource ${this.id}...`); // ๋ฆฌ์์ค ์ ๋ฆฌ ์ํ, ์: ํ์ผ ํธ๋ค ๋ซ๊ธฐ, ๋คํธ์ํฌ ์ฐ๊ฒฐ ํด์ } } class ResourceCache { constructor() { this.cache = new Map(); this.registry = new FinalizationRegistry((id) => { const weakRef = this.cache.get(id); if (weakRef) { const resource = weakRef.deref(); if (resource) { resource.release(); } this.cache.delete(id); console.log(`Resource ${id} evicted from cache.`); } }); } get(id) { const weakRef = this.cache.get(id); if (weakRef) { const resource = weakRef.deref(); if (resource) { console.log(`Resource ${id} retrieved from cache.`); return resource; } // ๋ฆฌ์์ค๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋จ this.cache.delete(id); } // ๋ฆฌ์์ค๊ฐ ์บ์์ ์์ผ๋ฏ๋ก ๋ก๋ํ๊ณ ์บ์ํจ const resource = new Resource(id); this.cache.set(id, new WeakRef(resource)); this.registry.register(resource, id); return resource; } } // ์ฌ์ฉ๋ฒ const cache = new ResourceCache(); let resource1 = cache.get(1); let resource2 = cache.get(2); resource1 = null; // resource1์ ๋ํ ๊ฐํ ์ฐธ์กฐ ์ ๊ฑฐ // ๊ฐ๋น์ง ์ปฌ๋ ์ ์๋ฎฌ๋ ์ด์ (์ค์ ๋ก๋ ๋น๊ฒฐ์ ์ ์) setTimeout(() => { console.log("Simulating garbage collection..."); // ์ด๋ ์์ ์ resource1์ ๋ํ FinalizationRegistry ์ฝ๋ฐฑ์ด ํธ์ถ๋ ๊ฒ์ }, 5000); ```์ด ์์ ์์ ResourceCache๋ WeakRef๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋๋ ๊ฒ์ ๋ง์ง ์์ผ๋ฉด์ ๋ฆฌ์์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค. FinalizationRegistry๋ ๋ฆฌ์์ค๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์
๋ ๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ ๋ฐ ์ฌ์ฉ๋์ด, ๋ฆฌ์์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฆฌ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด ํจํด์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ์ ๊ฐ์ด ๋ง์ ์์ ๋ฆฌ์์ค๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํนํ ์ ์ฉํฉ๋๋ค.
WeakRef ๋ฐ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
WeakRef์ ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์๊ปด์ ์ฌ์ฉํ๊ธฐ:
WeakRef์ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ณผ๋ํ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ ํต์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ด ๋ถ์ถฉ๋ถํ ๋๋ง ์ฌ์ฉํ์ธ์. - ์ํ ์ข
์์ฑ ํผํ๊ธฐ: ๊ฐ์ฒด ๊ฐ์ ์ํ ์ข
์์ฑ์ ํผํ๋๋ก ์ฃผ์ํ์ธ์. ์ด๋
WeakRef๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฐฉํดํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. - ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ: ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ ๋ ๋น๋๊ธฐ ์์ ์ ์ผ๋์ ๋์ธ์. ์ฝ๋ฐฑ ํจ์๊ฐ ๋น๋๊ธฐ ์์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๋๋ก ํ์ธ์. ์ฝ๋ฐฑ ๋ด์์ ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด async/await ๋๋ Promise๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ฒ ์ ํ๊ฒ ํ ์คํธํ๊ธฐ: ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ๊ฒ ํ ์คํธํ์ธ์. ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋นํจ์จ์ฑ์ ์๋ณํ์ธ์.
- ์ฝ๋ ๋ฌธ์ํํ๊ธฐ: ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋๋ก ์ฝ๋์
WeakRef์ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ ์ฌ์ฉ๋ฒ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ๊ต์ฐจ ๋ฌธํ์ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋์ฑ ์ค์ํด์ง๋๋ค. ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์๋ ๋ค์ํ ๋คํธ์ํฌ ์๋์ ์ฅ์น ์ฑ๋ฅ์ ๊ฐ์ง ์ ์์ต๋๋ค. ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๋ค์ํ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํํ๊ฒ ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ๋ค์ํ ์ฅ์น ์ฑ๋ฅ: ๊ฐ๋ฐ๋์๊ตญ์ ์ฌ์ฉ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ๊ตฌํ ์ฅ์น๋ฅผ ์ฌ์ฉํ๊ณ ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฅ์น์์ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ด ๋์ ์ง์ญ์์๋ ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์ ์บ์ฑํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
WeakRef์ ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ๋ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. - ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ : ๊ตญ๊ฐ๋ง๋ค ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ ์ด ์์ต๋๋ค. ํด๋ฆฐ์ ์ค์ผ์ค๋ฌ๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ ์ ํ๊ฒ ์ญ์ ๋๋๋ก ๋ณด์ฅํ์ฌ ์ ๋ฝ์ GDPR(์ผ๋ฐ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ ) ๋ฐ ๋ค๋ฅธ ์ง์ญ์ ์ ์ฌํ ๋ฒ๋ฅ ์ ์ค์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ธ๊ณํ ๋ฐ ํ์งํ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋, ์ธ๊ณํ ๋ฐ ํ์งํ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ธ์. ์ด๋ฏธ์ง๋ ํ ์คํธ์ ๊ฐ์ ํ์งํ๋ ๋ฆฌ์์ค๋ ์๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ชจ๋ ์ง์ญ์์ ์ ์๋ํ๋๋ก ํ๋ ค๋ฉด ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
๊ฒฐ๋ก
WeakRef์ ํด๋ฆฐ์
์ค์ผ์ค๋ฌ๋ JavaScript ์ธ์ด์ ์ถ๊ฐ๋ ๊ท์คํ ๊ธฐ๋ฅ์ผ๋ก, ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๊ณ ๋ฏธ์ธ ์กฐ์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ์ ๋ต์ ์ผ๋ก ์ ์ฉํจ์ผ๋ก์จ, ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ์ฑ๋ฅ ์ข๊ณ , ์ ๋ขฐํ ์ ์์ผ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์์น๋ ์ฅ์น ์ฑ๋ฅ์ ๊ด๊ณ์์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ํํ๊ณ ํจ์จ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. JavaScript๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ธ๊ณํ๋ ์ธ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ํ๋์ ์ด๊ณ ๊ฒฌ๊ณ ํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ผ ๊ฒ์
๋๋ค.