ํผ๋๋ก ๋์๊ฐ๊ธฐ
Dev.toFrontend
์๋ฌธ ์ฝ๊ธฐ
Local-First DB์ UUID ๊ธฐ๋ฐ ๋๊ธฐํ๋ก ๋คํธ์ํฌ ์ ์ฝ ํด๊ฒฐ
Don't Let Bad Networks Kill Your App: Building Offline-First in Flutter & Laravel ๐ฑ
AI ์์ฝ
Context
๋ถ์์ ํ ๋คํธ์ํฌ ํ๊ฒฝ์ AgriTech ํ๋ ์ฌ์ฉ์๋ฅผ ์ํ ์๋น์ค ์ ๊ณต ํ์์ฑ ๋๋. ๊ธฐ์กด HTTP ์์ฒญ ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ๋คํธ์ํฌ ์์กด์ฑ์ผ๋ก ์ธํ ์ฑ ํ๋ฆฌ์ง ๋ฐ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ ํด๊ฒฐ ํ์.
Technical Solution
- sqflite ๋์ ์ ํตํ Local Database ์ค์ฌ์ Source of Truth ์ค๊ณ๋ก ๋คํธ์ํฌ ์ํ์ ๋ฌด๊ดํ ์ฆ๊ฐ์ ์ธ UI ์๋ต์ฑ ํ๋ณด
- sync_status ํ๋๊ทธ๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ์ํ ๊ด๋ฆฌ ๋ฐ Background Worker ๊ธฐ๋ฐ์ ๋ฐฐ์น ๋๊ธฐํ ๋ฉ์ปค๋์ฆ ๊ตฌ์ถ
- ID ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ Client-side UUID ์์ฑ ์ ๋ต ์ฑํ์ผ๋ก Server-side Auto-increment ์์กด์ฑ ์ ๊ฑฐ
- Last Write Wins ์ ๋ต๊ณผ updated_at ํ์์คํฌํ๋ฅผ ๊ฒฐํฉํ Laravel ๋ฐฑ์๋ ์ถฉ๋ ํด๊ฒฐ ๋ก์ง ๊ตฌํ
- DB::transaction์ ํตํ ๋ฐฐ์น ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ก ์์์ฑ ๋ณด์ฅ ๋ฐ API ํธ์ถ ํ์ ์ต์ ํ
์ค์ฒ ํฌ์ธํธ
- Client-side์์ UUID๋ฅผ ์์ฑํ์ฌ ์๋ฒ ๋๊ธฐํ ์ Key ์ถฉ๋ ๊ฐ๋ฅ์ฑ ์ฐจ๋จ - Local DB์ sync_status ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋๊ธฐํ ๋์ ๋ ์ฝ๋๋ฅผ ๋ช ํํ ๊ตฌ๋ถ - ๋จ์ API ํธ์ถ ๊ตฌ์กฐ์์ Local-first Write ํ Background Sync ๊ตฌ์กฐ๋ก์ ์ ํ ๊ฒํ - ๋ฐ์ดํฐ ์ถฉ๋ ํด๊ฒฐ์ ์ํ Last Write Wins ๋๋ ๋น์ฆ๋์ค ๋ง์ถคํ ๋จธ์ง ์ ๋ต ์๋ฆฝ