ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Gnoke Persist: Your Browser Has Short-Term Memory Loss. I Fixed It. ๐Ÿ‘Œ
Dev.toDev.to
Frontend

IndexedDB ๊ธฐ๋ฐ˜ WAL ํŒจํ„ด ๋„์ž…์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ฐ์ดํ„ฐ ํœ˜๋ฐœ์„ฑ ํ•ด๊ฒฐ

Gnoke Persist: Your Browser Has Short-Term Memory Loss. I Fixed It. ๐Ÿ‘Œ

Ekong Ikpe2026๋…„ 5์›” 7์ผ3๋ถ„intermediate

Context

๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์˜ OS ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ์ •์ฑ…์— ๋”ฐ๋ฅธ ๋ธŒ๋ผ์šฐ์ € ํƒญ ๊ฐ•์ œ ์ข…๋ฃŒ์™€ ์ด๋กœ ์ธํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์†Œ์‹ค ๋ฌธ์ œ ๋ฐœ์ƒ. ๊ธฐ์กด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ State ๊ด€๋ฆฌ ๋ฐฉ์‹์ด ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ์œ ์ง€๋˜์ง€ ์•Š๋Š” ํœ˜๋ฐœ์„ฑ ๊ตฌ์กฐ์ธ ์ ์„ ํ•œ๊ณ„๋กœ ๋ถ„์„.

Technical Solution

  • Debounced listener ๊ธฐ๋ฐ˜ input ์ด๋ฒคํŠธ ๊ฐ์ง€๋ฅผ ํ†ตํ•œ Form State์˜ IndexedDB ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๊ตฌ์กฐ ์„ค๊ณ„
  • ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์ž‘์—… ์ „ IndexedDB์— ๋จผ์ € ๊ธฐ๋กํ•˜๋Š” Write-Ahead Logging(WAL) ์ „๋žต์„ ํ†ตํ•œ ์“ฐ๊ธฐ ๋‚ด๊ตฌ์„ฑ ํ™•๋ณด
  • FileSystemDirectoryHandle์„ IndexedDB์— ์ €์žฅํ•˜์—ฌ ๋ฆฌํ”„๋ ˆ์‹œ ํ›„์—๋„ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์œ ์ง€ํ•˜๋Š” Handle Re-acquisition ๋กœ์ง ๊ตฌํ˜„
  • visibilitychange ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์ง์ „ ์ตœ์ข… ์ƒํƒœ ๋™๊ธฐํ™” ์‹œ๋„
  • NotAllowedError ๋ฐœ์ƒ ์‹œ User Gesture๋ฅผ ํ†ตํ•ด ๊ถŒํ•œ์„ ์žฌํš๋“ํ•˜๊ณ  WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ Flushํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ ˆ์ด์–ด ๊ตฌ์ถ•
  • password, token ๋“ฑ ๋ฏผ๊ฐ ์ •๋ณด ํ•„๋“œ๋ฅผ ์ œ์™ธํ•˜๋Š” Privacy Filter ์ ์šฉ์„ ํ†ตํ•œ ๋ณด์•ˆ์„ฑ ์œ ์ง€

- ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด LocalStorage๋ณด๋‹ค ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•œ IndexedDB ๊ธฐ๋ฐ˜์˜ State Persistence ๊ฒ€ํ†  - ์™ธ๋ถ€ API๋‚˜ ๋””์Šคํฌ ์“ฐ๊ธฐ ์ž‘์—… ์‹œ crash ๋Œ€์‘์„ ์œ„ํ•ด Write-Ahead Logging ํŒจํ„ด ์ ์šฉ ๊ณ ๋ ค - ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์ƒ ์†Œ์‹ค๋˜๋Š” File Handle์˜ ์žฌํš๋“์„ ์œ„ํ•ด User Gesture ๊ธฐ๋ฐ˜์˜ ๊ถŒํ•œ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค ์„ค๊ณ„

์›๋ฌธ ์ฝ๊ธฐ