PWA(ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ)๋ฅผ ์ํ ์๋ฒฝํ ์คํ๋ผ์ธ ๊ฒฝํ์ ๊ตฌํํ์ธ์. PWA ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง, ๊ณ ๊ธ ๋๊ธฐํ ์ ๋ต, ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ๋ฅผ ํตํด ์ง์ ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ฃน๋๋ค.
ํ๋ฐํธ์๋ PWA ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋๊ธฐํ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ง์คํฐํ๊ธฐ
์ค๋๋ ์๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด์๋ ์ข ์ข ์ฐ๊ฒฐ์ด ๋์ด์ง๋ ์ธ์์์ ์ฌ์ฉ์๋ค์ ๋คํธ์ํฌ ์ํ์ ๊ด๊ณ์์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ด๊ณ ๋น ๋ฅด๋ฉฐ ํญ์ ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋๋ ๋ฐ๋ก ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA)์ด ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ฑ๊ณผ ๊ฐ์ ๊ฒฝํ์ ์ ๊ณตํ๋ฉฐ ์ถฉ์กฑ์ํค๊ณ ์ ํ๋ ๋ชฉํ์ ๋๋ค. PWA์ ํต์ฌ ์ฝ์ ์ค ํ๋๋ ์คํ๋ผ์ธ์์๋ ์๋ํ๋ ๋ฅ๋ ฅ์ผ๋ก, ์ฌ์ฉ์์ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋ถ์์ ํ ๋๋ ์ง์์ ์ธ ์ ์ฉ์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ฝ์์ ์งํค๊ธฐ ์ํด์๋ ์ ์ ์์ฐ์ ์บ์ฑํ๋ ๊ฒ ์ด์์ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ฆ, ์คํ๋ผ์ธ์ ์ ์ฅ๋ ๋์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋๊ธฐํํ๊ธฐ ์ํ ์ ๊ตํ ์ ๋ต์ด ์๊ตฌ๋ฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ ํ๋ฐํธ์๋ PWA ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋๊ธฐํ์ ํต์ฌ์ ์ธ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ์ ๋ณต์กํ ์ธ๊ณ๋ฅผ ์ฌ๋ ์๊ฒ ๋ค๋ฃน๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ๋ฐ ๊ธฐ์ ์ ํ๊ตฌํ๊ณ , ๋ค์ํ ๋๊ธฐํ ํจํด์ ๋ ผ์ํ๋ฉฐ, ๋ค์ํ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๋ณต์๋ ฅ ์๋ ์คํ๋ผ์ธ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
PWA ํ๋ช ๊ณผ ์คํ๋ผ์ธ ๋ฐ์ดํฐ์ ๊ณผ์
PWA๋ ์น๊ณผ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์ ์ ๊ฒฐํฉํ์ฌ ์น ๊ฐ๋ฐ์ ์ค๋ํ ๋์ฝ์ ์ด๋ฃจ์์ต๋๋ค. PWA๋ ๊ฒ์ ๊ฐ๋ฅํ๊ณ , ์ค์น ๊ฐ๋ฅํ๋ฉฐ, ๋งํฌ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๊ณ , ๋ฐ์ํ์ผ๋ก ์ด๋ค ํผ ํฉํฐ์๋ ์ ์ํฉ๋๋ค. ํ์ง๋ง ์๋ง๋ ๊ฐ์ฅ ํ์ ์ ์ธ ๊ธฐ๋ฅ์ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ผ ๊ฒ์ ๋๋ค.
PWA์ ์ฝ์: ์์ ์ฑ๊ณผ ์ฑ๋ฅ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ ๋, PWA์ ์คํ๋ผ์ธ ์๋ ๋ฅ๋ ฅ์ ๋จ์ํ ํธ์์ฑ์ ๋์ด ํ์์ ์ธ ๊ธฐ๋ฅ์ด ๋๊ธฐ๋ ํฉ๋๋ค. ๋ถ์์ ํ ์ธํฐ๋ท ์ธํ๋ผ๋ฅผ ๊ฐ์ง ์ง์ญ์ ์ฌ์ฉ์, ๋คํธ์ํฌ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๊ณ ๋ฅด์ง ์์ ์ง์ญ์ ํต๊ทผํ๋ ์ฌ๋๋ค, ๋๋ ๋จ์ํ ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฝํ๊ณ ์ ํ๋ ์ฌ๋๋ค์ ์๊ฐํด ๋ณด์ญ์์ค. ์คํ๋ผ์ธ ์ฐ์ (offline-first) PWA๋ ํต์ฌ ๊ธฐ๋ฅ์ด ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ์ฌ ์ฌ์ฉ์์ ๋ถํธํจ์ ์ค์ด๊ณ ์ฐธ์ฌ๋๋ฅผ ๋์ ๋๋ค. ์ด์ ์ ๋ก๋๋ ์ฝํ ์ธ ์ ์ ๊ทผํ๋ ๊ฒ๋ถํฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ๋ ๊ฒ๊น์ง, PWA๋ ์ฌ์ฉ์์๊ฒ ์ง์์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ์ฌ ์ ๋ขฐ์ ์ถฉ์ฑ๋๋ฅผ ์์ต๋๋ค.
๋จ์ํ ๊ฐ์ฉ์ฑ์ ๋์ด, ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ์ฒด๊ฐ ์ฑ๋ฅ์๋ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. ๋ก์ปฌ ์บ์์์ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ PWA๋ ์ฆ์ ๋ก๋๋ ์ ์์ด ๋ก๋ฉ ์คํผ๋๋ฅผ ์์ ๊ณ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค. ์ด๋ฌํ ๋ฐ์์ฑ์ ํ๋ ์น ๊ธฐ๋์น์ ์ด์์ ๋๋ค.
์คํ๋ผ์ธ์ ๊ณผ์ : ๋จ์ํ ์ฐ๊ฒฐ์ฑ ๊ทธ ์ด์
์ฅ์ ์ ๋ช ํํ์ง๋ง, ๊ฒฌ๊ณ ํ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ธธ์ ์ฌ๋ฌ ๊ณผ์ ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ์ฅ์ ๋ฌผ์ ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด ๋ก์ปฌ์, ๋๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ ๊ฒฐ๊ตญ ์ค์ ์๋ฒ ๋ฐ์ดํฐ์ ์ด๋ป๊ฒ ๋ณํฉ๋ ๊น์? ์ฌ๋ฌ ์ฌ์ฉ์ ๋๋ ๋์ผํ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์คํ๋ผ์ธ๊ณผ ์จ๋ผ์ธ ์ํ๋ก ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๋ฌํ ์๋๋ฆฌ์ค๋ ํจ๊ณผ์ ์ธ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ์ ์ค์์ฑ์ ์ฆ์ ๋ถ๊ฐ์ํต๋๋ค.
์ ๊ณํ๋ ๋๊ธฐํ ์ ๋ต์ด ์๋ค๋ฉด, ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ ์ถฉ๋, ์ฌ์ฉ์ ์์ ์์ค, ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก๋ ๋ง๊ฐ์ง ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ํ๋ฐํธ์๋ PWA ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋๊ธฐํ์ ๋ณต์ก์ฑ์ด ์ค์ ๋ก ๋๋ฌ๋๊ฒ ๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ ์ดํดํ๊ธฐ
๋๊ธฐํ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ๋ ์น ๋ธ๋ผ์ฐ์ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ ํ์ ๋ฐ์ดํฐ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ ์ฌ๋ฌ ๊ฐ๋ ฅํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
Web Storage (localStorage
, sessionStorage
)
- ์ค๋ช
: ๊ฐ๋จํ ํค-๊ฐ ์ ์คํ ๋ฆฌ์ง์
๋๋ค.
localStorage
๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋ ๋ฐ๋ฉด,sessionStorage
๋ ์ธ์ ์ด ๋๋๋ฉด ์ง์์ง๋๋ค. - ์ฌ์ฉ ์ฌ๋ก: ์ค์ํ์ง ์์ ์๋์ ๋ฐ์ดํฐ, ์ฌ์ฉ์ ์ค์ , ์ธ์ ํ ํฐ ๋๋ ๊ฐ๋จํ UI ์ํ ์ ์ฅ.
- ์ ํ ์ฌํญ:
- ๋๊ธฐ์ API๋ก, ๋๊ท๋ชจ ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.
- ์ ํ๋ ์ ์ฅ ์ฉ๋ (์ผ๋ฐ์ ์ผ๋ก ์ถ์ฒ๋น 5-10 MB).
- ๋ฌธ์์ด๋ง ์ ์ฅํ๋ฏ๋ก ๋ณต์กํ ๊ฐ์ฒด๋ ์๋์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํํด์ผ ํฉ๋๋ค.
- ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ด๋ ๋ณต์กํ ์ฟผ๋ฆฌ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
- ์๋น์ค ์์ปค(Service Worker)๊ฐ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.
IndexedDB
- ์ค๋ช : ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ์ ์์ค์ ํธ๋์ญ์ ๊ฐ์ฒด ์งํฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋๋ค. ํ์ผ/๋ธ๋กญ์ ํฌํจํ ๋๋์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ์์ด๋ฉฐ ๋ ผ๋ธ๋กํน(non-blocking)์ ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก: ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ , ์ฟผ๋ฆฌ๊ฐ ํ์ํ ์บ์๋ API ์๋ต, ๋๋ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ํ์ํ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๊ณผ ๊ฐ์ด ์๋นํ ์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์คํ๋ผ์ธ์ ์ ์ฅํ๊ธฐ ์ํ ์ฃผ์ ์ ํ์ง์ ๋๋ค.
- ์ฅ์ :
- ๋น๋๊ธฐ์ API (๋ ผ๋ธ๋กํน).
- ์์ ์ ์ธ ์์ ์ ์ํ ํธ๋์ญ์ ์ง์.
- ๋๋์ ๋ฐ์ดํฐ ์ ์ฅ ๊ฐ๋ฅ (๋ธ๋ผ์ฐ์ /๊ธฐ๊ธฐ์ ๋ฐ๋ผ ์๋ฐฑ MB ๋๋ GB ๋จ์๊น์ง ๊ฐ๋ฅ).
- ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํ ์ธ๋ฑ์ค ์ง์.
- ์๋น์ค ์์ปค๊ฐ ์ ๊ทผ ๊ฐ๋ฅ (๋ฉ์ธ ์ค๋ ๋ ํต์ ์ ๋ํ ์ผ๋ถ ๊ณ ๋ ค ์ฌํญ ์์).
- ๊ณ ๋ ค ์ฌํญ:
localStorage
์ ๋นํด API๊ฐ ์๋์ ์ผ๋ก ๋ณต์กํฉ๋๋ค.- ์ ์คํ ์คํค๋ง ๊ด๋ฆฌ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
Cache API (์๋น์ค ์์ปค๋ฅผ ํตํด)
- ์ค๋ช : ๋คํธ์ํฌ ์๋ต์ ์ํ ์บ์ ์คํ ๋ฆฌ์ง๋ฅผ ๋ ธ์ถํ์ฌ ์๋น์ค ์์ปค๊ฐ ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก: ์ ์ ์์ฐ(HTML, CSS, JavaScript, ์ด๋ฏธ์ง), ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ API ์๋ต, ๋๋ ์คํ๋ผ์ธ ์ ๊ทผ์ ์ํ ์ ์ฒด ํ์ด์ง ์บ์ฑ. ์คํ๋ผ์ธ ์ฐ์ ๊ฒฝํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ์ฅ์ :
- ๋คํธ์ํฌ ์์ฒญ ์บ์ฑ์ ์ํด ์ค๊ณ๋์์ต๋๋ค.
- ์๋น์ค ์์ปค์ ์ํด ๊ด๋ฆฌ๋์ด ๋คํธ์ํฌ ๊ฐ๋ก์ฑ๊ธฐ์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ์บ์๋ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํฉ๋๋ค.
- ์ ํ ์ฌํญ:
- ์ฃผ๋ก
Request
/Response
๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ, ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ฒ์ด ์๋๋๋ค. - ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ฏ๋ก ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ์ด ๋ถ์กฑํฉ๋๋ค.
- ์ฃผ๋ก
๊ธฐํ ์คํ ๋ฆฌ์ง ์ต์
- Web SQL Database (์ง์ ์ค๋จ): SQL๊ณผ ์ ์ฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด์ง๋ง W3C์ ์ํด ์ง์์ด ์ค๋จ๋์์ต๋๋ค. ์๋ก์ด ํ๋ก์ ํธ์์๋ ์ฌ์ฉ์ ํผํด์ผ ํฉ๋๋ค.
- File System Access API (์ ๊ท): ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์์ ๋ก์ปฌ ํ์ผ ์์คํ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ํด์ฃผ๋ ์คํ์ ์ธ API์ ๋๋ค. ์ด๋ ๋ก์ปฌ ๋ฐ์ดํฐ ์ง์์ฑ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ๋ฌธ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ์ง๋ง, ์์ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ์ปจํ ์คํธ์ ํ๋ก๋์ ์ฌ์ฉ์ ์ํด ๋๋ฆฌ ์ง์๋์ง๋ ์์ต๋๋ค.
๊ฒฌ๊ณ ํ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ๊ธฐ๋ฅ์ด ํ์ํ ๋๋ถ๋ถ์ PWA์๊ฒ๋ Cache API(์ ์ ์์ฐ ๋ฐ ๋ถ๋ณ API ์๋ต์ฉ)์ IndexedDB(๋์ , ๊ฐ๋ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ์ฉ)์ ์กฐํฉ์ด ํ์ค์ ์ด๊ณ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
ํต์ฌ ๋ฌธ์ : ์คํ๋ผ์ธ ์ฐ์ ํ๊ฒฝ์์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ
๋ฐ์ดํฐ๊ฐ ๋ก์ปฌ๊ณผ ์๊ฒฉ ์๋ฒ ์์ชฝ์ ์ ์ฅ๋๋ฉด, ๋ ๋ฒ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ ํํ๊ณ ์ต์ ์ํ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ ๊ณผ์ ๊ฐ ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ์ ๋ณธ์ง์ ๋๋ค.
"๋ฐ์ดํฐ ์ผ๊ด์ฑ"์ด๋ ๋ฌด์์ธ๊ฐ?
PWA์ ๋งฅ๋ฝ์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ํด๋ผ์ด์ธํธ(์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง)์ ๋ฐ์ดํฐ์ ์๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์ผ์นํ์ฌ ์ ๋ณด์ ์ง์คํ๊ณ ์ต์ ์ํ๋ฅผ ๋ฐ์ํ๋ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์์ ์๋ก์ด ์์ ์ ์์ฑํ ํ ๋์ค์ ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด, ๋ฐ์ดํฐ๊ฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ํด๋น ์์ ์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฑ๊ณต์ ์ผ๋ก ์ ์ก๋๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์๋ ๋ฐ์๋์ด์ผ ํฉ๋๋ค.
์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์คํ๋ผ์ธ์์ ์ํ๋ ์์ ์ ๊ฒฐ๊ตญ ์จ๋ผ์ธ์์ ์ํ๋ ๊ฒ๊ณผ ๋์ผํ ์ํ๋ก ์ด์ด์ ธ์ผ ํ๋ฉฐ, ๋ชจ๋ ์ฐจ์ด์ ์ ์ํํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
์คํ๋ผ์ธ ์ฐ์ ์ด ์ผ๊ด์ฑ์ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ด์
์คํ๋ผ์ธ ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณธ์ง ์์ฒด๊ฐ ๋ณต์ก์ฑ์ ์ผ๊ธฐํฉ๋๋ค:
- ์ต์ข ์ผ๊ด์ฑ(Eventual Consistency): ์์ ์ด ์ฆ์ ์๋ฒ์ ๋ฐ์๋๋ ์ ํต์ ์ธ ์จ๋ผ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฌ๋ฆฌ, ์คํ๋ผ์ธ ์ฐ์ ์์คํ ์ '์ต์ข ์ผ๊ด์ฑ' ๋ชจ๋ธ๋ก ์๋ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ผ์์ ์ผ๋ก ์ผ๊ด๋์ง ์์ ์ ์์ง๋ง, ์ฐ๊ฒฐ์ด ๋ค์ ์ค์ ๋๊ณ ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ฉด ๊ฒฐ๊ตญ ์ผ๊ด๋ ์ํ๋ก ์๋ ด๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋์์ฑ๊ณผ ์ถฉ๋: ์ฌ๋ฌ ์ฌ์ฉ์(๋๋ ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ๋์ผํ ์ฌ์ฉ์)๊ฐ ๋์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ํ ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ์ธ ๋์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ์ด๊ฑฐ๋, ๋ ๋ค ์คํ๋ผ์ธ ์ํ์์ ๋ค๋ฅธ ์๊ฐ์ ๋๊ธฐํํ๋ฉด ์ถฉ๋์ ๋ถ๊ฐํผํฉ๋๋ค.
- ๋คํธ์ํฌ ์ง์ฐ ๋ฐ ์์ ์ฑ: ๋๊ธฐํ ํ๋ก์ธ์ค ์์ฒด๋ ๋คํธ์ํฌ ์กฐ๊ฑด์ ์ํฅ์ ๋ฐ์ต๋๋ค. ๋๋ฆฌ๊ฑฐ๋ ๊ฐํ์ ์ธ ์ฐ๊ฒฐ์ ๋๊ธฐํ๋ฅผ ์ง์ฐ์ํค๊ณ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ฉฐ ๋ถ๋ถ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ์ํ ๊ด๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ปฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ , ์๋ฒ์์ ์จ ๋ฐ์ดํฐ์ ๊ตฌ๋ณํ๋ฉฐ, ๊ฐ ๋ฐ์ดํฐ์ ์ํ(์: ๋๊ธฐํ ๋๊ธฐ ์ค, ๋๊ธฐํ๋จ, ์ถฉ๋ ๋ฐ์)๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์
- ์ ๋ฐ์ดํธ ์์ค(Lost Updates): ํ ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ , ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉด, ๋๊ธฐํ ์ค์ ์คํ๋ผ์ธ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฎ์ด์ฐ์ฌ์ง๋๋ค.
- ๋ํฐ ๋ฆฌ๋(Dirty Reads): ์ฌ์ฉ์๊ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ์ด๋ฏธ ์๋ฒ์์ ์ ๋ฐ์ดํธ๋ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค.
- ์ฐ๊ธฐ ์ถฉ๋(Write Conflicts): ๋ ๋ช ์ ๋ค๋ฅธ ์ฌ์ฉ์(๋๋ ๊ธฐ๊ธฐ)๊ฐ ๋์์ ๋์ผํ ๋ ์ฝ๋์ ๋ํด ์ถฉ๋ํ๋ ๋ณ๊ฒฝ์ ๊ฐํฉ๋๋ค.
- ์ผ๊ด๋์ง ์์ ์ํ: ๋คํธ์ํฌ ์ค๋จ์ผ๋ก ์ธํ ๋ถ๋ถ์ ์ธ ๋๊ธฐํ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ๋ค๋ฅธ ์ํ์ ๋์ด๊ฒ ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ค๋ณต: ์คํจํ ๋๊ธฐํ ์๋๋ก ์ธํด ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฒ ์ ์ก๋์ด ๋ฉฑ๋ฑ์ฑ(idempotently)์ด ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ์ค๋ณต์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋๊ธฐํ ์ ๋ต: ์คํ๋ผ์ธ๊ณผ ์จ๋ผ์ธ์ ๊ฐ๊ทน ๋ฉ์ฐ๊ธฐ
์ด๋ฌํ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๋๊ธฐํ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ, ๋ฐ์ดํฐ ์ ํ, ๊ทธ๋ฆฌ๊ณ ํ์ฉ ๊ฐ๋ฅํ ์ต์ข ์ผ๊ด์ฑ ์์ค์ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค.
๋จ๋ฐฉํฅ ๋๊ธฐํ
๋จ๋ฐฉํฅ ๋๊ธฐํ๋ ๊ตฌํํ๊ธฐ๋ ๋ ๊ฐ๋จํ์ง๋ง ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๊ฐ ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฆ ๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋๊ธฐํ(์ ๋ก๋): ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๋ค๊ณ , ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํด์ง๋ฉด ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฒ์ ์ ๋ก๋ํฉ๋๋ค. ์๋ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฐ์ธํ๋ค๊ณ ๊ฐ์ ํ๊ณ ํฐ ์ถฉ๋ ํด๊ฒฐ ์์ด ์ด๋ฌํ ๋ณ๊ฒฝ์ ์๋ฝํฉ๋๋ค. ์ด๋ ์๋ก์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด๋ ๊ณ ์ ํ ์ฃผ๋ฌธ๊ณผ ๊ฐ์ด ์์ฃผ ๊ฒน์น์ง ์๋ ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ์ ์ ํฉํฉ๋๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋๊ธฐํ(๋ค์ด๋ก๋): ํด๋ผ์ด์ธํธ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ก์ปฌ ์บ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ์ ํ ์นดํ๋ก๊ทธ๋ ๋ด์ค ํผ๋์ ๊ฐ์ด ์ฝ๊ธฐ ์ ์ฉ์ด๊ฑฐ๋ ๋๋ฌผ๊ฒ ์ ๋ฐ์ดํธ๋๋ ๋ฐ์ดํฐ์ ์ผ๋ฐ์ ์ ๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋จ์ํ ๋ก์ปฌ ๋ณต์ฌ๋ณธ์ ๋ฎ์ด์๋๋ค.
์๋ฐฉํฅ ๋๊ธฐํ: ์ง์ ํ ๊ณผ์
๋๋ถ๋ถ์ ๋ณต์กํ PWA๋ ์๋ฐฉํฅ ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ๋ณ๊ฒฝ์ ์์ํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ง๋ฅ์ ์ผ๋ก ๋ณํฉ๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ถฉ๋ ํด๊ฒฐ์ด ๊ฐ์ฅ ์ค์ํด์ง๋๋ค.
์ต์ข ์ฐ๊ธฐ ์น๋ฆฌ(Last Write Wins, LWW)
- ๊ฐ๋ : ๊ฐ์ฅ ๊ฐ๋จํ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต์ ๋๋ค. ๊ฐ ๋ฐ์ดํฐ ๋ ์ฝ๋์๋ ํ์์คํฌํ๋ ๋ฒ์ ๋ฒํธ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋๊ธฐํ ์ค์ ๊ฐ์ฅ ์ต๊ทผ์ ํ์์คํฌํ(๋๋ ๊ฐ์ฅ ๋์ ๋ฒ์ ๋ฒํธ)๋ฅผ ๊ฐ์ง ๋ ์ฝ๋๊ฐ ์ต์ข ๋ฒ์ ์ผ๋ก ๊ฐ์ฃผ๋๊ณ , ์ด์ ๋ฒ์ ์ ํ๊ธฐ๋ฉ๋๋ค.
- ์ฅ์ : ๊ตฌํ์ด ์ฝ๊ณ ๋ก์ง์ด ๊ฐ๋จํฉ๋๋ค.
- ๋จ์ : ์ค๋๋์์ง๋ง ์ ์ฌ์ ์ผ๋ก ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฎ์ด์ฐ์ฌ์ง๋ฉด ๋ฐ์ดํฐ ์์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ณ๊ฒฝ ๋ด์ฉ์ด ์๋ ์์ ๋ง ๊ณ ๋ คํฉ๋๋ค. ๊ณต๋ ํธ์ง์ด๋ ๋งค์ฐ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
- ์์: ๋ ๋ช ์ ์ฌ์ฉ์๊ฐ ๋์ผํ ๋ฌธ์๋ฅผ ํธ์งํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ ์ฅ/๋๊ธฐํํ ์ฌ๋์ด '์น๋ฆฌ'ํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ค๋ฉ๋๋ค.
์ด์ ๋ณํ(Operational Transformation, OT) / ์ถฉ๋ ์๋ ๋ณต์ ๋ฐ์ดํฐ ์ ํ(Conflict-Free Replicated Data Types, CRDTs)
- ๊ฐ๋ : ์ด๋ ์ฃผ๋ก ๊ณต๋ ์ค์๊ฐ ํธ์ง ์ ํ๋ฆฌ์ผ์ด์ (์: ๊ณต์ ๋ฌธ์ ํธ์ง๊ธฐ)์ ์ฌ์ฉ๋๋ ๊ณ ๊ธ ๊ธฐ์ ์ ๋๋ค. ์ํ๋ฅผ ๋ณํฉํ๋ ๋์ ์์ ์ ๋ณํฉํฉ๋๋ค. OT๋ ์์ ์ด ๋ค๋ฅธ ์์๋ก ์ ์ฉ๋๋๋ผ๋ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก ๋ณํํฉ๋๋ค. CRDT๋ ๋์ ์์ ์ด ์ถฉ๋ ์์ด ๋ณํฉ๋์ด ํญ์ ์ผ๊ด๋ ์ํ๋ก ์๋ ด๋๋๋ก ์ค๊ณ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
- ์ฅ์ : ๊ณต๋ ์์ ํ๊ฒฝ์ ๋งค์ฐ ๊ฒฌ๊ณ ํ๋ฉฐ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด์กดํ๊ณ ์ง์ ํ ์ต์ข ์ผ๊ด์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์ : ๊ตฌํ์ด ๋งค์ฐ ๋ณต์กํ๊ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํ๋ฉฐ ์๋นํ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์์: ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ณต์ ๋ฌธ์์ ๋์์ ์ ๋ ฅํฉ๋๋ค. OT/CRDT๋ ๋ชจ๋ ํค ์ ๋ ฅ์ด ์ ๋ ฅ ์์ค ์์ด ์ฌ๋ฐ๋ฅด๊ฒ ํตํฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํ์์คํฌํ
- ๊ฐ๋
: ๊ฐ ๋ฐ์ดํฐ ๋ ์ฝ๋์๋ ๋ฒ์ ์๋ณ์(์: ์ฆ๊ฐํ๋ ์ซ์ ๋๋ ๊ณ ์ ID) ๋ฐ/๋๋ ํ์์คํฌํ(
lastModifiedAt
)๊ฐ ์์ต๋๋ค. ๋๊ธฐํํ ๋ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ์ ํจ๊ป ๋ฒ์ /ํ์์คํฌํ๋ฅผ ๋ณด๋ ๋๋ค. ์๋ฒ๋ ์ด๋ฅผ ์์ฒด ๋ ์ฝ๋์ ๋น๊ตํฉ๋๋ค. ํด๋ผ์ด์ธํธ ๋ฒ์ ์ด ๋ ์ค๋๋ ๊ฒฝ์ฐ ์ถฉ๋์ด ๊ฐ์ง๋ฉ๋๋ค. - ์ฅ์ : ์ถฉ๋์ ๋ช ์์ ์ผ๋ก ๊ฐ์งํ๋ฏ๋ก ๋จ์ํ LWW๋ณด๋ค ๋ ๊ฒฌ๊ณ ํฉ๋๋ค. ๋ ๋ฏธ๋ฌํ ์ถฉ๋ ํด๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋จ์ : ์ถฉ๋์ด ๊ฐ์ง๋์์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง์ ๋ํ ์ ๋ต์ด ์ฌ์ ํ ํ์ํฉ๋๋ค.
- ์์: ํ ์ฌ์ฉ์๊ฐ ์์ ์ ๋ค์ด๋ก๋ํ๊ณ ์คํ๋ผ์ธ ์ํ๊ฐ ๋ ํ ์์ ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ์์ ๋์ผํ ์์ ์ ์์ ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ์๋ฒ๋ ํด๋น ์์ ์ ๋ฒ์ ๋ฒํธ๊ฐ ์๋ฒ์ ์๋ ๊ฒ๋ณด๋ค ์ค๋๋ ๊ฒ์ ํ์ธํ๊ณ ์ถฉ๋์ ํ์ํฉ๋๋ค.
์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ถฉ๋ ํด๊ฒฐ
- ๊ฐ๋ : ์๋ฒ๊ฐ ์ถฉ๋์ ๊ฐ์งํ๋ฉด(์: ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ LWW ์์ ์ฅ์น๊ฐ ์คํจํ ๊ฒฝ์ฐ) ํด๋ผ์ด์ธํธ์ ์๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ถฉ๋ํ๋ ๋ฒ์ ์ ์ฌ์ฉ์์๊ฒ ์ ์ํ๊ณ ์ด๋ค ๋ฒ์ ์ ์ ์งํ ์ง ๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณํฉํ ์ง ์๋์ผ๋ก ์ ํํ๋๋ก ํฉ๋๋ค.
- ์ฅ์ : ์ฌ์ฉ์๊ฐ ์ต์ข ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ฏ๋ก ์ฌ์ฉ์ ์๋๋ฅผ ๋ณด์กดํ๋ ๋ฐ ๊ฐ์ฅ ๊ฒฌ๊ณ ํฉ๋๋ค. ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํฉ๋๋ค.
- ๋จ์ : ์ฌ์ฉ์ ์นํ์ ์ธ ์ถฉ๋ ํด๊ฒฐ UI๋ฅผ ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๊ฒ์ด ๋ณต์กํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐฉํดํ ์ ์์ต๋๋ค.
- ์์: ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ด์ ์ด๋ฉ์ผ์์ ์ถฉ๋์ ๊ฐ์งํ๊ณ ๋ ๋ฒ์ ์ ๋๋ํ ์ ์ํ๋ฉฐ ์ฌ์ฉ์์๊ฒ ํด๊ฒฐํ๋๋ก ์์ฒญํฉ๋๋ค.
Background Sync API ๋ฐ Periodic Background Sync
์น ํ๋ซํผ์ ์๋น์ค ์์ปค์ ํจ๊ป ์๋ํ๋ฉฐ ์คํ๋ผ์ธ ๋๊ธฐํ๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ๊ฐ๋ ฅํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํ ์๋น์ค ์์ปค ํ์ฉ
์๋น์ค ์์ปค๋ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ๋๊ธฐํ์ ์ค์ฌ์ ๋๋ค. ์ด๋ค์ ๋ธ๋ผ์ฐ์ ์ ๋คํธ์ํฌ ์ฌ์ด์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ํ๋ก์ ์ญํ ์ ํ๋ฉฐ, ์์ฒญ ๊ฐ๋ก์ฑ๊ธฐ, ์บ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ค์ํ๊ฒ๋ ๋ฉ์ธ ์ค๋ ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋ฐํ ์คํ๋์ง ์์ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
sync
์ด๋ฒคํธ ๊ตฌํ
Background Sync API
๋ PWA๊ฐ ์ฌ์ฉ์๊ฐ ์์ ์ ์ธ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ๊ฐ์ง ๋๊น์ง ์์
์ ์ง์ฐ์ํฌ ์ ์๊ฒ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์์ ์์
(์: ์์ ์ ์ถ)์ ์ํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์๋น์ค ์์ปค์ 'sync' ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋คํธ์ํฌ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์์ ์ ์ธ ์ฐ๊ฒฐ์ด ๊ฐ์ง๋๋ฉด ์๋น์ค ์์ปค๋ฅผ ๊นจ์ ๋ฑ๋ก๋ ๋๊ธฐํ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ๋๊ธฐ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ณด๋ผ ์ ์๊ฒ ํฉ๋๋ค.
- ์๋ ๋ฐฉ์:
- ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์์ ์์ ์ ์ํํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ์ ๊ด๋ จ ์์ ์ IndexedDB์ ์ ์ฅํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋๊ธฐํ ํ๊ทธ๋ฅผ ๋ฑ๋กํฉ๋๋ค:
navigator.serviceWorker.ready.then(reg => reg.sync.register('my-sync-tag'))
. - ์๋น์ค ์์ปค๋
sync
์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค:self.addEventListener('sync', event => { if (event.tag === 'my-sync-tag') { event.waitUntil(syncData()); } })
. - ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ์๋น์ค ์์ปค์
syncData()
ํจ์๊ฐ IndexedDB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ์ฌ ์๋ฒ๋ก ๋ณด๋ ๋๋ค.
- ์ฅ์ :
- ์์ ์ : ์ฌ์ฉ์๊ฐ PWA๋ฅผ ๋ซ๋๋ผ๋ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํด์ง๋ฉด ๋ฐ์ดํฐ๊ฐ ๊ฒฐ๊ตญ ์ ์ก๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
- ์๋ ์ฌ์๋: ๋ธ๋ผ์ฐ์ ๊ฐ ์คํจํ ๋๊ธฐํ ์๋๋ฅผ ์๋์ผ๋ก ์ฌ์๋ํฉ๋๋ค.
- ์ ๋ ฅ ํจ์จ์ : ํ์ํ ๋๋ง ์๋น์ค ์์ปค๋ฅผ ๊นจ์๋๋ค.
Periodic Background Sync
๋ ๊ด๋ จ API๋ก, PWA๊ฐ ์ด๋ ค ์์ง ์์ ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋น์ค ์์ปค๋ฅผ ๊นจ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์์
์ผ๋ก ์ธํด ๋ณ๊ฒฝ๋์ง ์์ง๋ง ์ต์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ ๋ฐ์ดํฐ(์: ์ ๋ฉ์์ง ๋๋ ์ฝํ
์ธ ์
๋ฐ์ดํธ ํ์ธ)๋ฅผ ์๋ก ๊ณ ์น๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด API๋ ์์ง ๋ธ๋ผ์ฐ์ ์ง์ ์ด๊ธฐ ๋จ๊ณ์ ์์ผ๋ฉฐ ๋จ์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ฑํ๋ฅผ ์ํ ์ฌ์ฉ์ ์ฐธ์ฌ ์ ํธ๊ฐ ํ์ํฉ๋๋ค.
๊ฒฌ๊ณ ํ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํ ์ํคํ ์ฒ
์คํ๋ผ์ธ ๋ฐ์ดํฐ์ ๋๊ธฐํ๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ PWA๋ฅผ ๊ตฌ์ถํ๋ ค๋ฉด ์ ๊ตฌ์กฐํ๋ ์ํคํ ์ฒ๊ฐ ํ์ํฉ๋๋ค.
์กฐ์ ์๋ก์์ ์๋น์ค ์์ปค
์๋น์ค ์์ปค๋ ๋๊ธฐํ ๋ก์ง์ ์ค์ฌ์ด ๋์ด์ผ ํฉ๋๋ค. ๋คํธ์ํฌ, ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ , ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๊ฐ์ ์ค๊ฐ์ ์ญํ ์ ํฉ๋๋ค. ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ , ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ ๋ฃ๊ณ , ๋ค์ด์ค๋ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์บ์ฑ ์ ๋ต: ๋ค์ํ ์ ํ์ ์์ฐ์ ๋ํด ๋ช ํํ ์บ์ฑ ์ ๋ต์ ์ ์ํฉ๋๋ค(์: ์ ์ ์์ฐ์๋ 'Cache First', ๋์ ์ฝํ ์ธ ์๋ 'Network First' ๋๋ 'Stale-While-Revalidate').
- ๋ฉ์์ง ์ ๋ฌ: ๋ฉ์ธ ์ค๋ ๋(PWA์ UI)์ ์๋น์ค ์์ปค(๋ฐ์ดํฐ ์์ฒญ, ๋๊ธฐํ ์ํ ์
๋ฐ์ดํธ, ์ถฉ๋ ์๋ฆผ์ฉ) ๊ฐ์ ๋ช
ํํ ํต์ ์ฑ๋์ ์ค์ ํฉ๋๋ค. ์ด๋ฅผ ์ํด
postMessage()
๋ฅผ ์ฌ์ฉํฉ๋๋ค. - IndexedDB ์ํธ์์ฉ: ์๋น์ค ์์ปค๋ IndexedDB์ ์ง์ ์ํธ์์ฉํ์ฌ ๋ณด๋ฅ ์ค์ธ ๋๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ฒ๋ก๋ถํฐ ๋ค์ด์ค๋ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์คํ๋ผ์ธ ์ฐ์ ์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง
IndexedDB ์คํค๋ง๋ ์คํ๋ผ์ธ ๋๊ธฐํ๋ฅผ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค:
- ๋ฉํ๋ฐ์ดํฐ ํ๋: ๋ก์ปฌ ๋ฐ์ดํฐ ๋ ์ฝ๋์ ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋๊ธฐํ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค:
id
(๊ณ ์ ํ ๋ก์ปฌ ID, ์ข ์ข UUID)serverId
(์ฑ๊ณต์ ์ธ ์ ๋ก๋ ํ ์๋ฒ์์ ํ ๋นํ ID)status
(์: 'pending', 'synced', 'error', 'conflict', 'deleted-local', 'deleted-server')lastModifiedByClientAt
(๋ง์ง๋ง ํด๋ผ์ด์ธํธ ์ธก ์์ ํ์์คํฌํ)lastModifiedByServerAt
(๋๊ธฐํ ์ค์ ๋ฐ์ ๋ง์ง๋ง ์๋ฒ ์ธก ์์ ํ์์คํฌํ)version
(ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์์ ๊ด๋ฆฌ๋๋ ์ฆ๊ฐํ๋ ๋ฒ์ ๋ฒํธ)isDeleted
(์ํํธ ์ญ์ ๋ฅผ ์ํ ํ๋๊ทธ)
- Outbox/Inbox ํ ์ด๋ธ: ๋ณด๋ฅ ์ค์ธ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๊ธฐ ์ํด IndexedDB์ ์ ์ฉ ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๊ณ ๋ คํฉ๋๋ค. 'outbox'๋ ์๋ฒ๋ก ๋ณด๋ด์ผ ํ ์์ (์์ฑ, ์ ๋ฐ์ดํธ, ์ญ์ )์ ์ ์ฅํ ์ ์์ต๋๋ค. 'inbox'๋ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํด์ผ ํ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์์ ์ ์ ์ฅํ ์ ์์ต๋๋ค.
- ์ถฉ๋ ๋ก๊ทธ: ๊ฐ์ง๋ ์ถฉ๋์ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ณ๋์ ๊ฐ์ฒด ์ ์ฅ์๋ก, ๋์ค์ ์ฌ์ฉ์ ํด๊ฒฐ ๋๋ ์๋ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค.
๋ฐ์ดํฐ ๋ณํฉ ๋ก์ง
์ด๊ฒ์ด ๋๊ธฐํ ์ ๋ต์ ํต์ฌ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์๋ฒ์์ ์ค๊ฑฐ๋ ์๋ฒ๋ก ์ ์ก๋ ๋ ๋ณต์กํ ๋ณํฉ ๋ก์ง์ด ์ข ์ข ํ์ํฉ๋๋ค. ์ด ๋ก์ง์ ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์ ์์ฃผํ์ง๋ง, ํด๋ผ์ด์ธํธ๋ ์๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ํด์ํ๊ณ ์ ์ฉํ๋ฉฐ ๋ก์ปฌ ์ถฉ๋์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ(Idempotency): ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ์ฌ๋ฌ ๋ฒ ๋ณด๋ด๋ ์ค๋ณต ๋ ์ฝ๋๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์๋ชป๋ ์ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์๋ฒ๋ ์ค๋ณต๋ ์์ ์ ์๋ณํ๊ณ ๋ฌด์ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์ฐจ๋ฑ ๋๊ธฐํ(Differential Sync): ์ ์ฒด ๋ ์ฝ๋๋ฅผ ๋ณด๋ด๋ ๋์ ๋ณ๊ฒฝ ์ฌํญ(๋ธํ)๋ง ๋ณด๋ ๋๋ค. ์ด๋ ๋์ญํญ ์ฌ์ฉ์ ์ค์ด๊ณ ์ถฉ๋ ๊ฐ์ง๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
- ์์์ ์ฐ์ฐ(Atomic Operations): ๊ด๋ จ ๋ณ๊ฒฝ ์ฌํญ์ ๋จ์ผ ํธ๋์ญ์ ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๊ฑฐ๋ ์๋ฌด๊ฒ๋ ์ ์ฉ๋์ง ์๋๋ก ํ์ฌ ๋ถ๋ถ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋๊ธฐํ ์ํ์ ๋ํ UI ํผ๋๋ฐฑ
์ฌ์ฉ์๋ ๋ฐ์ดํฐ์ ๋๊ธฐํ ์ํ์ ๋ํด ์ ๋ณด๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๋ชจํธํจ์ ๋ถ์ ๊ณผ ํผ๋์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์๊ฐ์ ์ ํธ: ์์ด์ฝ, ์คํผ๋ ๋๋ ์ํ ๋ฉ์์ง(์: "์ ์ฅ ์ค...", "์คํ๋ผ์ธ์ ์ ์ฅ๋จ", "๋๊ธฐํ ์ค...", "์คํ๋ผ์ธ ๋ณ๊ฒฝ ์ฌํญ ๋๊ธฐ ์ค", "์ถฉ๋ ๊ฐ์ง๋จ")๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ํ๋ ๋๋ค.
- ์ฐ๊ฒฐ ์ํ: ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ์ธ์ง ์คํ๋ผ์ธ์ธ์ง ๋ช ํํ๊ฒ ํ์ํฉ๋๋ค.
- ์งํ ํ์๊ธฐ: ๋๊ท๋ชจ ๋๊ธฐํ ์์ ์ ๊ฒฝ์ฐ ์งํ๋ฅ ํ์์ค์ ๋ณด์ฌ์ค๋๋ค.
- ์คํ ๊ฐ๋ฅํ ์ค๋ฅ: ๋๊ธฐํ๊ฐ ์คํจํ๊ฑฐ๋ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ฌ์ฉ์๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ดํ๋ ๋ช ํํ๊ณ ์คํ ๊ฐ๋ฅํ ๋ฉ์์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ฌ์๋
๋๊ธฐํ๋ ๋ณธ์ง์ ์ผ๋ก ๋คํธ์ํฌ ์ค๋ฅ, ์๋ฒ ๋ฌธ์ ๋ฐ ๋ฐ์ดํฐ ์ถฉ๋์ ์ทจ์ฝํฉ๋๋ค. ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ์ ์ง์ ์ฑ๋ฅ ์ ํ(Graceful Degradation): ๋๊ธฐํ๊ฐ ์คํจํ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํด์๋ ์ ๋ฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ์ง์์ ๋ฐฑ์คํ ์ ๋ต์ผ๋ก ์ฌ์๋๋ฅผ ์๋ํด์ผ ํฉ๋๋ค.
- ์๊ตฌ์ ์ธ ํ: ๋ณด๋ฅ ์ค์ธ ๋๊ธฐํ ์์ ์ ๋ธ๋ผ์ฐ์ ์ฌ์์ ํ์๋ ์ ์ง๋๊ณ ๋์ค์ ์ฌ์๋๋ ์ ์๋๋ก ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ด์ผ ํฉ๋๋ค(์: IndexedDB).
- ์ฌ์ฉ์ ์๋ฆผ: ์ค๋ฅ๊ฐ ์ง์๋๊ณ ์๋ ๊ฐ์ ์ด ํ์ํ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ์๋ฆฝ๋๋ค.
์ค์ฉ์ ์ธ ๊ตฌํ ๋จ๊ณ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ฒฌ๊ณ ํ ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋ฐ ๋๊ธฐํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ๋ณ ์ ๊ทผ ๋ฐฉ์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1๋จ๊ณ: ์คํ๋ผ์ธ ์ ๋ต ์ ์
์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ค ๋ถ๋ถ์ด ๋ฐ๋์ ์คํ๋ผ์ธ์์ ์๋ํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ ์ ๋๊น์ง ์๋ํด์ผ ํ๋์ง๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ์ญ์์ค. ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์บ์ํด์ผ ํฉ๋๊น? ์คํ๋ผ์ธ์์ ์ด๋ค ์์ ์ ์ํํ ์ ์์ต๋๊น? ์ต์ข ์ผ๊ด์ฑ์ ๋ํ ํ์ฉ ๋ฒ์๋ ์ผ๋ง์ ๋๊น?
- ํต์ฌ ๋ฐ์ดํฐ ์๋ณ: ํต์ฌ ๊ธฐ๋ฅ์ ํ์์ ์ธ ์ ๋ณด๋ ๋ฌด์์ ๋๊น?
- ์คํ๋ผ์ธ ์์ : ๋คํธ์ํฌ ์ฐ๊ฒฐ ์์ด ์ด๋ค ์ฌ์ฉ์ ์์ ์ ์ํํ ์ ์์ต๋๊น? (์: ์ด์ ์์ฑ, ํญ๋ชฉ ํ์, ๊ธฐ์กด ๋ฐ์ดํฐ ๋ณด๊ธฐ).
- ์ถฉ๋ ํด๊ฒฐ ์ ์ฑ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ ๋๊น? (LWW, ์ฌ์ฉ์ ํ๋กฌํํธ ๋ฑ).
- ๋ฐ์ดํฐ ์ต์ ์ฑ ์๊ตฌ ์ฌํญ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์์ฃผ ๋๊ธฐํํด์ผ ํฉ๋๊น?
2๋จ๊ณ: ์ฌ๋ฐ๋ฅธ ์คํ ๋ฆฌ์ง ์ ํ
์์ ๋
ผ์ํ๋ฏ์ด, Cache API๋ ๋คํธ์ํฌ ์๋ต์ ์ํ ๊ฒ์ด๊ณ IndexedDB๋ ๊ตฌ์กฐํ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ดํฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค. IndexedDB ์ํธ์์ฉ์ ๋จ์ํํ๊ธฐ ์ํด idb
(IndexedDB์ ๋ํผ)๋ Dexie.js
์ ๊ฐ์ ๊ณ ์์ค ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ญ์์ค.
3๋จ๊ณ: ๋ฐ์ดํฐ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๊ตฌํ
๋ณต์กํ JavaScript ๊ฐ์ฒด๋ฅผ IndexedDB์ ์ ์ฅํ๋ฉด ์๋์ผ๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋คํธ์ํฌ ์ ์ก ๋ฐ ํธํ์ฑ ๋ณด์ฅ์ ์ํด ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์กฐํ๋๋์ง์ ๋ํ ๋ช ํํ ๋ฐ์ดํฐ ๋ชจ๋ธ(์: JSON ์คํค๋ง ์ฌ์ฉ)์ ์ ์ํ์ญ์์ค. ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ฌ์ ์ธ ๋ฒ์ ๋ถ์ผ์น๋ฅผ ์ฒ๋ฆฌํ์ญ์์ค.
4๋จ๊ณ: ๋๊ธฐํ ๋ก์ง ๊ฐ๋ฐ
์ฌ๊ธฐ์ ์๋น์ค ์์ปค, IndexedDB, Background Sync API๊ฐ ํจ๊ป ์๋ํฉ๋๋ค.
- ๋๊ฐ๋ ๋ณ๊ฒฝ ์ฌํญ (ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก):
- ์ฌ์ฉ์๊ฐ ์์ (์: ์๋ก์ด '๋ ธํธ' ํญ๋ชฉ ์์ฑ)์ ์ํํฉ๋๋ค.
- PWA๋ ์๋ก์ด '๋
ธํธ'๋ฅผ ๊ณ ์ ํ ํด๋ผ์ด์ธํธ ์์ฑ ID(์: UUID),
status: 'pending'
, ๋ฐlastModifiedByClientAt
ํ์์คํฌํ์ ํจ๊ป IndexedDB์ ์ ์ฅํฉ๋๋ค. - PWA๋ ์๋น์ค ์์ปค์
'sync'
์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํฉ๋๋ค(์:reg.sync.register('sync-notes')
). - ์๋น์ค ์์ปค๋ (์จ๋ผ์ธ ์ํ์ผ ๋)
'sync'
์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ฉด IndexedDB์์status: 'pending'
์ธ ๋ชจ๋ '๋ ธํธ' ํญ๋ชฉ์ ๊ฐ์ ธ์ต๋๋ค. - ๊ฐ '๋
ธํธ'์ ๋ํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋
๋๋ค. ์๋ฒ๋ '๋
ธํธ'๋ฅผ ์ฒ๋ฆฌํ๊ณ ,
serverId
๋ฅผ ํ ๋นํ๋ฉฐ, ์ ์ฌ์ ์ผ๋กlastModifiedByServerAt
๋ฐversion
์ ์ ๋ฐ์ดํธํฉ๋๋ค. - ์ฑ๊ณต์ ์ธ ์๋ฒ ์๋ต ์, ์๋น์ค ์์ปค๋ IndexedDB์ '๋
ธํธ'๋ฅผ ์
๋ฐ์ดํธํ์ฌ
status: 'synced'
๋ก ์ค์ ํ๊ณ ,serverId
๋ฅผ ์ ์ฅํ๋ฉฐ,lastModifiedByServerAt
๋ฐversion
์ ์ ๋ฐ์ดํธํฉ๋๋ค. - ์คํจํ ์์ฒญ์ ๋ํ ์ฌ์๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
- ๋ค์ด์ค๋ ๋ณ๊ฒฝ ์ฌํญ (์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก):
- PWA๊ฐ ์จ๋ผ์ธ ์ํ๊ฐ ๋๊ฑฐ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋น์ค ์์ปค๋ ์๋ฒ์์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค(์: ํด๋ผ์ด์ธํธ์ ๋ง์ง๋ง์ผ๋ก ์๋ ค์ง ๋๊ธฐํ ํ์์คํฌํ ๋๋ ๊ฐ ๋ฐ์ดํฐ ์ ํ์ ๋ฒ์ ์ ์ ์กํ์ฌ).
- ์๋ฒ๋ ํด๋น ํ์์คํฌํ/๋ฒ์ ์ดํ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์๋ตํฉ๋๋ค.
- ๊ฐ ๋ค์ด์ค๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์๋น์ค ์์ปค๋
serverId
๋ฅผ ์ฌ์ฉํ์ฌ IndexedDB์ ๋ก์ปฌ ๋ฒ์ ๊ณผ ๋น๊ตํฉ๋๋ค. - ๋ก์ปฌ ์ถฉ๋ ์์: ๋ก์ปฌ ํญ๋ชฉ์
status
๊ฐ 'synced'์ด๊ณ ๋ค์ด์ค๋ ์๋ฒ ๋ณ๊ฒฝ๋ณด๋ค ์ค๋๋lastModifiedByServerAt
(๋๋ ๋ฎ์version
)์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋ก์ปฌ ํญ๋ชฉ์ ์๋ฒ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค. - ์ ์ฌ์ ์ถฉ๋: ๋ก์ปฌ ํญ๋ชฉ์
status
๊ฐ 'pending'์ด๊ฑฐ๋ ๋ค์ด์ค๋ ์๋ฒ ๋ณ๊ฒฝ๋ณด๋ค ์๋ก์ดlastModifiedByClientAt
์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ถฉ๋์ด ๊ฐ์ง๋ฉ๋๋ค. ์ด๋ ์ ํํ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต(์: LWW, ์ฌ์ฉ์ ํ๋กฌํํธ)์ด ํ์ํฉ๋๋ค. - IndexedDB์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํฉ๋๋ค.
postMessage()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ค๋ ๋์ ์ ๋ฐ์ดํธ ๋๋ ์ถฉ๋์ ์๋ฆฝ๋๋ค.
์์: ์คํ๋ผ์ธ ์ผํ ์นดํธ
๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ PWA๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์์ ์นดํธ์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ๋ค์์ด ํ์ํฉ๋๋ค:
- ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง: ๊ฐ ์นดํธ ํญ๋ชฉ์ ๊ณ ์ ํ ๋ก์ปฌ ID, ์๋, ์ ํ ์ธ๋ถ ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ
status: 'pending'
๊ณผ ํจ๊ป IndexedDB์ ์ ์ฅ๋ฉ๋๋ค. - ๋๊ธฐํ: ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด, ์๋น์ค ์์ปค์ ๋ฑ๋ก๋ ๋๊ธฐํ ์ด๋ฒคํธ๊ฐ ์ด๋ฌํ 'pending' ์ํ์ ์นดํธ ํญ๋ชฉ์ ์๋ฒ๋ก ๋ณด๋ ๋๋ค.
- ์ถฉ๋ ํด๊ฒฐ: ์ฌ์ฉ์๊ฐ ์๋ฒ์ ๊ธฐ์กด ์นดํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ํญ๋ชฉ์ ๋ณํฉํ๊ฑฐ๋, ์คํ๋ผ์ธ ์ํ์์ ํญ๋ชฉ์ ์ฌ๊ณ ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ฌ๊ณ ๋ฌธ์ ๋ฅผ ์๋ฆฌ๊ณ ์ฌ์ฉ์์๊ฒ ํด๊ฒฐ์ ์์ฒญํ๋ UI ํ๋กฌํํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ๋ค์ด์ค๋ ๋๊ธฐํ: ์ฌ์ฉ์๊ฐ ์ด์ ์ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์นดํธ์ ํญ๋ชฉ์ ์ ์ฅํ๋ค๋ฉด, ์๋น์ค ์์ปค๋ ์ด๋ฅผ ๊ฐ์ ธ์ ๋ก์ปฌ์ ๋ณด๋ฅ ์ค์ธ ํญ๋ชฉ๊ณผ ๋ณํฉํ๊ณ IndexedDB๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
5๋จ๊ณ: ์ฒ ์ ํ ํ ์คํธ
์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ๋ํ ์ฒ ์ ํ ํ ์คํธ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์์ PWA๋ฅผ ํ ์คํธํ์ญ์์ค:
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ์์ (๊ฐ๋ฐ์ ๋๊ตฌ์์ ์๋ฎฌ๋ ์ด์ ).
- ๋๋ฆฌ๊ณ ๋ถ์์ ํ ์ฐ๊ฒฐ (๋คํธ์ํฌ ์ค๋กํ๋ง ์ฌ์ฉ).
- ์คํ๋ผ์ธ์ผ๋ก ์ ํํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๋ค๊ณ , ์จ๋ผ์ธ์ผ๋ก ์ ํํ์ฌ ๋ ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๋ ๋ค์ ๋ค์ ์คํ๋ผ์ธ์ผ๋ก ์ ํํฉ๋๋ค.
- ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ํญ/์ฐฝ์ผ๋ก ํ ์คํธํฉ๋๋ค (๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋์ผํ ์ฌ์ฉ์์ ์ฌ๋ฌ ๊ธฐ๊ธฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ).
- ์ ํํ ์ ๋ต์ ๋ง๋ ๋ณต์กํ ์ถฉ๋ ์๋๋ฆฌ์ค๋ฅผ ํ ์คํธํฉ๋๋ค.
- ํ ์คํธ๋ฅผ ์ํด ์๋น์ค ์์ปค ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ(install, activate, update)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
6๋จ๊ณ: ์ฌ์ฉ์ ๊ฒฝํ ๊ณ ๋ ค ์ฌํญ
ํ๋ฅญํ ๊ธฐ์ ์ ํด๊ฒฐ์ฑ ๋ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋์๋ฉด ์คํจํ ์ ์์ต๋๋ค. PWA๊ฐ ๋ช ํํ๊ฒ ์ํตํ๋๋ก ํ์ญ์์ค:
- ์ฐ๊ฒฐ ์ํ: ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ์ด๊ฑฐ๋ ์ฐ๊ฒฐ ๋ฌธ์ ๊ฐ ์์ ๋ ๋์ ๋๋ ํ์๊ธฐ(์: ๋ฐฐ๋)๋ฅผ ํ์ํฉ๋๋ค.
- ์์ ์ํ: ์์ (์: ๋ฌธ์ ์ ์ฅ)์ด ๋ก์ปฌ์ ์ ์ฅ๋์์ง๋ง ์์ง ๋๊ธฐํ๋์ง ์์์ ๋ ๋ช ํํ๊ฒ ํ์ํฉ๋๋ค.
- ๋๊ธฐํ ์๋ฃ/์คํจ์ ๋ํ ํผ๋๋ฐฑ: ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋๊ธฐํ๋์๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์์ ๋ ๋ช ํํ ๋ฉ์์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ถฉ๋ ํด๊ฒฐ UI: ์๋ ์ถฉ๋ ํด๊ฒฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๊ธฐ์ ์๋ จ๋์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ง๊ด์ ์ด๊ณ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ UI๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ์ฌ์ฉ์ ๊ต์ก: PWA์ ์คํ๋ผ์ธ ๊ธฐ๋ฅ๊ณผ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ๋์๋ง ๋ฌธ์๋ ์จ๋ณด๋ฉ ํ์ ์ ๊ณตํฉ๋๋ค.
๊ณ ๊ธ ๊ฐ๋ ๋ฐ ๋ฏธ๋ ๋ํฅ
์คํ๋ผ์ธ ์ฐ์ PWA ๊ฐ๋ฐ ๋ถ์ผ๋ ์๋ก์ด ๊ธฐ์ ๊ณผ ํจํด์ด ๋ฑ์ฅํ๋ฉด์ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค.
๋ณต์กํ ๋ก์ง์ ์ํ ์น์ด์ ๋ธ๋ฆฌ(WebAssembly)
๋งค์ฐ ๋ณต์กํ ๋๊ธฐํ ๋ก์ง, ํนํ ์ ๊ตํ CRDT๋ ๋ง์ถคํ ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํ๋ ๊ฒฝ์ฐ, ์น์ด์ ๋ธ๋ฆฌ(Wasm)๋ ์ฑ๋ฅ์์ ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Rust, C++, Go์ ๊ฐ์ ์ธ์ด๋ก ์์ฑ๋)๋ฅผ Wasm์ผ๋ก ์ปดํ์ผํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๊ณ ๋๋ก ์ต์ ํ๋ ์๋ฒ ์ธก ๊ฒ์ฆ ๋๊ธฐํ ์์ง์ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ํ์ฉํ ์ ์์ต๋๋ค.
Web Locks API
Web Locks API๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ํญ์ด๋ ์๋น์ค ์์ปค์์ ์คํ๋๋ ์ฝ๋๊ฐ ๊ณต์ ๋ฆฌ์์ค(์: IndexedDB ๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ๋ํ ์ ๊ทผ์ ์กฐ์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ PWA์ ์ฌ๋ฌ ๋ถ๋ถ์ด ๋์์ ๋๊ธฐํ ์์ ์ ์๋ํ ๋ ๊ฒฝ์ ์กฐ๊ฑด(race condition)์ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ถฉ๋ ํด๊ฒฐ์ ์ํ ์๋ฒ ์ธก ํ์
๋ง์ ๋ก์ง์ด ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ํ์ง๋ง, ์๋ฒ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์คํ๋ผ์ธ ์ฐ์ PWA๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ๋ฐฑ์๋๋ ๋ถ๋ถ ์ ๋ฐ์ดํธ๋ฅผ ์์ ๋ฐ ์ฒ๋ฆฌํ๊ณ , ๋ฒ์ ์ ๊ด๋ฆฌํ๋ฉฐ, ์ถฉ๋ ํด๊ฒฐ ๊ท์น์ ์ ์ฉํ๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. GraphQL ๊ตฌ๋ ์ด๋ ์น์์ผ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ์ ๋ ํจ์จ์ ์ธ ๋๊ธฐํ๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์์ต๋๋ค.
๋ถ์ฐํ ์ ๊ทผ ๋ฐฉ์ ๋ฐ ๋ธ๋ก์ฒด์ธ
๋งค์ฐ ํน์ํ ๊ฒฝ์ฐ, ๋ถ์ฐํ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง ๋ฐ ๋๊ธฐํ ๋ชจ๋ธ(๋ธ๋ก์ฒด์ธ์ด๋ IPFS๋ฅผ ํ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์)์ ํ์ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๋ณธ์ง์ ์ผ๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ํ ๊ฐ๋ ฅํ ๋ณด์ฅ์ ์ ๊ณตํ์ง๋ง, ๋๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ PWA ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์๋นํ ๋ณต์ก์ฑ๊ณผ ์ฑ๋ฅ ์์ ์ ์ถฉ์์ ์๋ฐํฉ๋๋ค.
๊ธ๋ก๋ฒ ๋ฐฐํฌ๋ฅผ ์ํ ๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์คํ๋ผ์ธ ์ฐ์ PWA๋ฅผ ์ค๊ณํ ๋, ์ง์ ์ผ๋ก ํฌ๊ด์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ถ๊ฐ ์์๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋คํธ์ํฌ ์ง์ฐ ๋ฐ ๋์ญํญ ๋ณ๋์ฑ
์ธํฐ๋ท ์๋์ ์์ ์ฑ์ ๊ตญ๊ฐ ๋ฐ ์ง์ญ์ ๋ฐ๋ผ ๊ทน์ ์ผ๋ก ๋ค๋ฆ ๋๋ค. ๊ณ ์ ๊ด์ฌ์ ์ฐ๊ฒฐ์์ ์ ์๋ํ๋ ๊ฒ์ด ํผ์กํ 2G ๋คํธ์ํฌ์์๋ ์์ ํ ์คํจํ ์ ์์ต๋๋ค. ๋๊ธฐํ ์ ๋ต์ ๋ค์์ ๋ํด ๋ณต์๋ ฅ์ด ์์ด์ผ ํฉ๋๋ค:
- ๋์ ์ง์ฐ ์๊ฐ(High Latency): ๋๊ธฐํ ํ๋กํ ์ฝ์ด ๋๋ฌด ๋ง์ ํต์ ์ ํ์ง ์๋๋ก ํ์ฌ ์๋ณต ํ์๋ฅผ ์ต์ํํฉ๋๋ค.
- ๋ฎ์ ๋์ญํญ(Low Bandwidth): ํ์ํ ๋ธํ๋ง ๋ณด๋ด๊ณ , ๋ฐ์ดํฐ๋ฅผ ์์ถํ๋ฉฐ, ์ด๋ฏธ์ง/๋ฏธ๋์ด ์ ์ก์ ์ต์ ํํฉ๋๋ค.
- ๊ฐํ์ ์ธ ์ฐ๊ฒฐ:
Background Sync API
๋ฅผ ํ์ฉํ์ฌ ์ฐ๊ฒฐ ๋๊น์ ์ํํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ ์ ์ผ ๋ ๋๊ธฐํ๋ฅผ ์ฌ๊ฐํฉ๋๋ค.
๋ค์ํ ๊ธฐ๊ธฐ ์ฑ๋ฅ
์ ์ธ๊ณ ์ฌ์ฉ์๋ ์ต์ฒจ๋จ ์ค๋งํธํฐ๋ถํฐ ๊ตฌํ ์ ๊ฐ ํผ์ฒํฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋งค์ฐ ๋ค์ํ ๊ธฐ๊ธฐ์์ ์น์ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๊ธฐ๋ค์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ, ๋ฉ๋ชจ๋ฆฌ, ์ ์ฅ ์ฉ๋์ด ๊ฐ๊ธฐ ๋ค๋ฆ ๋๋ค.
- ์ฑ๋ฅ: ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋ณํฉ ์ค์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ํํ๋๋ก ๋๊ธฐํ ๋ก์ง์ ์ต์ ํํฉ๋๋ค.
- ์ ์ฅ์ ํ ๋น๋: ๊ธฐ๊ธฐ ๋ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ ๋ธ๋ผ์ฐ์ ์ ์ฅ์ ์ ํ์ ์ ์ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ์ง์ธ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐฐํฐ๋ฆฌ ์๋ช : ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ ์์ ์ ๊ณผ๋ํ ๋ฐฐํฐ๋ฆฌ ์๋ชจ๋ฅผ ํผํ๊ธฐ ์ํด ํจ์จ์ ์ด์ด์ผ ํ๋ฉฐ, ์ด๋ ์ ์ ์ฝ์ผํธ๊ฐ ๋ ๋ณดํธ์ ์ธ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ
๋ฏผ๊ฐํ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์คํ๋ผ์ธ์ ์ ์ฅํ๋ ๊ฒ์ ๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ฉฐ, ์ด๋ ๋ค๋ฅธ ์ง์ญ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ ์ด ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ๋ ๋์ฑ ์ฆํญ๋ฉ๋๋ค.
- ์ํธํ: ํนํ ๊ธฐ๊ธฐ๊ฐ ์์๋ ์ ์๋ ๊ฒฝ์ฐ IndexedDB์ ์ ์ฅ๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค. IndexedDB ์์ฒด๋ ๋ธ๋ผ์ฐ์ ์ ์๋๋ฐ์ค ๋ด์์ ์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง๋ง, ์ถ๊ฐ ์ํธํ ๊ณ์ธต์ ์์ฌ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ต์ํ: ํ์์ ์ธ ๋ฐ์ดํฐ๋ง ์คํ๋ผ์ธ์ ์ ์ฅํฉ๋๋ค.
- ์ธ์ฆ: ๋ฐ์ดํฐ์ ๋ํ ์คํ๋ผ์ธ ์ ๊ทผ์ด ๋ณดํธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค(์: ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ธ์ฆํ๊ฑฐ๋ ์ ํ๋ ์๋ช ์ ๊ฐ์ง ๋ณด์ ํ ํฐ ์ฌ์ฉ).
- ๊ท์ ์ค์: GDPR(์ ๋ฝ), CCPA(๋ฏธ๊ตญ), LGPD(๋ธ๋ผ์ง) ๋ฑ๊ณผ ๊ฐ์ ๊ตญ์ ๊ท์ ์ ์ธ์งํ๊ณ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์์ ์ฒ๋ฆฌํ ๋๋ ์ด๋ฅผ ์ค์ํฉ๋๋ค.
๋ฌธํ์ ๋ฐ๋ฅธ ์ฌ์ฉ์ ๊ธฐ๋์น
์ฑ ๋์ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ํ ์ฌ์ฉ์ ๊ธฐ๋์น๋ ๋ฌธํ์ ์ผ๋ก ๋ค๋ฅผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ์ง์ญ์์๋ ์ฐ๊ฒฐ ์ํ๊ฐ ์ข์ง ์์ ์คํ๋ผ์ธ ์ฑ์ ๋งค์ฐ ์ต์ํ ์ ์๋ ๋ฐ๋ฉด, ๋ค๋ฅธ ์ง์ญ์์๋ ์ฆ๊ฐ์ ์ธ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
- ํฌ๋ช ์ฑ: PWA๊ฐ ์คํ๋ผ์ธ ๋ฐ์ดํฐ์ ๋๊ธฐํ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง์ ๋ํด ํฌ๋ช ํ๊ฒ ์ค๋ช ํฉ๋๋ค. ๋ช ํํ ์ํ ๋ฉ์์ง๋ ๋ณดํธ์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
- ํ์งํ: ๋๊ธฐํ ์ํ ๋ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํฌํจํ ๋ชจ๋ UI ํผ๋๋ฐฑ์ด ๋์ ๊ณ ๊ฐ์ ์ํด ์ ์ ํ ํ์งํ๋๋๋ก ํฉ๋๋ค.
- ์ ์ด๊ถ: ์๋ ๋๊ธฐํ ํธ๋ฆฌ๊ฑฐ๋ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ์ง์ฐ๊ธฐ ์ต์ ๊ณผ ๊ฐ์ด ์ฌ์ฉ์์๊ฒ ๋ฐ์ดํฐ์ ๋ํ ์ ์ด๊ถ์ ๋ถ์ฌํฉ๋๋ค.
๊ฒฐ๋ก : ๋ณต์๋ ฅ ์๋ ์คํ๋ผ์ธ ๊ฒฝํ ๊ตฌ์ถํ๊ธฐ
ํ๋ฐํธ์๋ PWA ์คํ๋ผ์ธ ์คํ ๋ฆฌ์ง ๋๊ธฐํ ๋ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ด๋ฆฌ๋ ์ง์ ์ผ๋ก ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ณต์กํ์ง๋ง ํ์์ ์ธ ์ธก๋ฉด์ ๋๋ค. ์ฌ๋ฐ๋ฅธ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์ ์คํ๊ฒ ์ ํํ๊ณ , ์ง๋ฅ์ ์ธ ๋๊ธฐํ ์ ๋ต์ ๊ตฌํํ๋ฉฐ, ์ถฉ๋ ํด๊ฒฐ์ ๊ผผ๊ผผํ๊ฒ ์ฒ๋ฆฌํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋คํธ์ํฌ ๊ฐ์ฉ์ฑ์ ์ด์ํ๊ณ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๋ง๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์คํ๋ผ์ธ ์ฐ์ ์ฌ๊ณ ๋ฐฉ์์ ์ฑํํ๋ ๊ฒ์ ๊ธฐ์ ์ ๊ตฌํ ์ด์์ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์๊ตฌ์ ๋ํ ๊น์ ์ดํด, ๋ค์ํ ์ด์ ํ๊ฒฝ ์์ธก, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ฐ์ ์์ ์ง์ ์ ์๊ตฌํฉ๋๋ค. ๊ทธ ๊ณผ์ ์ด ์ด๋ ค์ธ ์ ์์ง๋ง, ๋ณด์์ ์ฌ์ฉ์๊ฐ ์ด๋์ ์๋ , ์ฐ๊ฒฐ ์ํ๊ฐ ์ด๋ป๋ ๊ฐ์ ๋ณต์๋ ฅ ์๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ์ฌ์ฉ์ ์ ๋ขฐ์ ์ฐธ์ฌ๋ฅผ ์ด์งํ๋ ๊ฒ์ ๋๋ค. ๊ฒฌ๊ณ ํ ์คํ๋ผ์ธ ์ ๋ต์ ํฌ์ํ๋ ๊ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ๋์ ๋๋นํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ๋ชจ๋ ์ฌ๋์ด ์ด๋์๋ ์ง์ ์ผ๋ก ์ ๊ทผํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.