๊ต์ค ์์ ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ Progressive Web App ์ค์ต ํ๋ก์ ํธ์ ๋๋ค.
ํ์๋ค์ ์ด ์ ์ฅ์๋ฅผ ํด๋ก ํ ๋ค Netlify ๋๋ Vercel์ ๋ฐฐํฌํ๊ณ , ๋ชจ๋ฐ์ผ์์ HTTPS URL์ ์ด์ด ์ฑ์ ์ค์นํ ๋ค์ ์นด๋ฉ๋ผ, ๊ฐค๋ฌ๋ฆฌ, ์์น, ์๋ฆผ, ๊ณต์ , ํด๋ฆฝ๋ณด๋, ์ ์ฅ์, ์คํ๋ผ์ธ ๋์์ ์ง์ ํ ์คํธํ ์ ์์ต๋๋ค.
Progressive Web App์ ์ผ๋ฐ ์น ์ฑ์ ์ฑ๋ค์ด ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ๋ํ๋ ๋ฐฉ์์ ๋๋ค. ๋ํ์ ์ผ๋ก ํ ํ๋ฉด ์ค์น, ์คํ๋ผ์ธ ๋์, ์ฑ ์์ด์ฝ, service worker, ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋ค์ดํฐ๋ธ ๋น์ทํ Web API ์ฐ๋์ด ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ์์ ์๋ฃ๋ก ์ฐ๊ธฐ ์ฝ๋๋ก ํ๋ฉด ๋ฌธ๊ตฌ์ ์๋ด๋ ํ๊ตญ์ด๋ก ์์ฑํ๊ณ , ์ฝ๋์์ ๊ทธ๋๋ก ๊ฒ์ํ๊ฑฐ๋ ๋ณต์ฌํด์ผ ํ๋ API ์ด๋ฆ์ ์์ด ์๋ฌธ์ ์ ์งํ์ต๋๋ค.
- Vite
- React
- TypeScript
- Plain CSS
- ๋ฐฑ์๋ ์์
- ์ต์ ์์กด์ฑ
npm install
npm run devVite๊ฐ ์ถ๋ ฅํ๋ ๋ก์ปฌ ์ฃผ์๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ค. ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋ localhost๋ฅผ ์์ ํ ์ปจํ
์คํธ๋ก ์ทจ๊ธํ๊ธฐ ๋๋ฌธ์ ์นด๋ฉ๋ผ, ํด๋ฆฝ๋ณด๋์ฒ๋ผ HTTPS๊ฐ ํ์ํ API๋ ๋ก์ปฌ์์ ์ค์ตํ ์ ์์ต๋๋ค.
npm run buildํ๋ก๋์ ๋น๋๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๋ ค๋ฉด:
npm run previewservice worker๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๋์
๋น๋์์ ๋ฑ๋ก๋ฉ๋๋ค. ๊ฐ๋ฐ ์๋ฒ์์ service worker๋ฅผ ํ
์คํธํ๊ณ ์ถ๋ค๋ฉด URL์ ?sw=1์ ๋ถ์ฌ์ ์ฝ๋๋ค.
- ํ๋ก์ ํธ๋ฅผ GitHub์ pushํฉ๋๋ค.
- Netlify์์ ์ ์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ณ ์ด ์ ์ฅ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
- Build command๋
npm run build๋ฅผ ์ฌ์ฉํฉ๋๋ค. - Publish directory๋
dist๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Netlify๋ ๋ฐฐํฌ๋ ์ฌ์ดํธ์ HTTPS๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
- ํ๋ก์ ํธ๋ฅผ GitHub์ pushํฉ๋๋ค.
- Vercel์์ ์ด ์ ์ฅ์๋ฅผ importํฉ๋๋ค.
- Vite ๊ธฐ๋ณธ๊ฐ์ ์ ์งํฉ๋๋ค: build command๋
npm run build, output directory๋dist.
Vercel๋ ๋ฐฐํฌ๋ ์ฌ์ดํธ์ HTTPS๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
placeholder ์์ด์ฝ์ public/icons์ ์์ต๋๋ค.
logo.svgicon-192.pngicon-512.pngmaskable-icon-512.png
logo.svg๋ ์ฑ ํค๋์ favicon์ ์ฐ์ด๊ณ , public/manifest.webmanifest๊ฐ ์ค์น ์์ด์ฝ์ฉ PNG ํ์ผ๋ค์ ์ฐธ์กฐํฉ๋๋ค. ๊ฐ์ ํ์ผ๋ช
์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ต์ฒดํ๊ฑฐ๋, manifest์ icons ๊ฒฝ๋ก๋ฅผ ์์ ํ๋ฉด ๋ฉ๋๋ค.
SVG๋ง ๋ฐ๊พธ๋ฉด ์ค์น ์์ด์ฝ์ฉ PNG๋ ๊ทธ๋๋ก ๋จ์ต๋๋ค. ํ์๋ค์ด ์๊ธฐ ๋ก๊ณ ๋ก ๋ฐ๊ฟ ๋๋ logo.svg, icon-192.png, icon-512.png, maskable-icon-512.png๋ฅผ ๊ฐ์ ์ด๋ฆ์ผ๋ก ํจ๊ป ๊ต์ฒดํ๋ ํ๋ฆ์ด ๊ฐ์ฅ ๋จ์ํฉ๋๋ค.
ํ์ ํ๋ก์ ํธ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋ค์ ํ์ผ์ ๊ฐ์ด ํ์ธํฉ๋๋ค.
public/manifest.webmanifest:name,short_name,descriptionindex.html:<title>๊ณผdescriptionmeta ํ๊ทธsrc/app/App.tsx: ํค๋์<h1>๊ณผ ๋ณด์กฐ ๋ฌธ๊ตฌ
public/manifest.webmanifest์์ ๋ค์ ๊ฐ์ ๋ฐ๊ฟ ๋ณผ ์ ์์ต๋๋ค.
nameshort_namedescriptiontheme_colorbackground_coloriconsshortcuts
manifest๋ฅผ ๋ฐ๊พผ ๋ค์๋ ๋ค์ ๋น๋ํ๊ณ ๋ฐฐํฌํฉ๋๋ค. ์ด๋ฏธ ์ค์นํ ์ฑ์์๋ ์ด๋ฆ์ด๋ ์์ด์ฝ ๋ณ๊ฒฝ์ด ๋ฐ๋ก ๋ณด์ด์ง ์์ ์ ์์ผ๋ ํ์ํ๋ฉด ์ฑ์ ์ญ์ ํ ๋ค์ ์ค์นํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ๋น์ทํ API ๋๋ถ๋ถ์ ์์ ํ ์ปจํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
- Camera
- Location
- Clipboard
- Notifications
- Service workers
- Wake Lock
๋ก์ปฌ ๊ฐ๋ฐ์์๋ localhost๊ฐ ๋ณดํต ์์ ํ ์ปจํ
์คํธ๋ก ์ธ์ ๋ฉ๋๋ค. ์ค์ ๋ชจ๋ฐ์ผ ํ
์คํธ๋ Netlify๋ Vercel์ฒ๋ผ HTTPS๊ฐ ์ ๊ณต๋๋ ๋ฐฐํฌ URL์์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋ชจ๋ฐ์ผ์์ ํนํ ์ค์ตํ๊ธฐ ์ข์ ๊ธฐ๋ฅ:
- ์ค์น ํ๋กฌํํธ์ standalone ์คํ
- ์นด๋ฉ๋ผ
- ๊ฐค๋ฌ๋ฆฌ / ํ์ผ ์ ํ
- ์์น์ OpenStreetMap ์ง๋ ํ์
- Web Share
- ์ง๋
๋ธ๋ผ์ฐ์ ๋ณ ์ฐจ์ด๊ฐ ํฐ ๊ธฐ๋ฅ:
- Push API
- iOS ์๋ฆผ
- File System Access API
- Device Orientation ๊ถํ ํ๋ฆ
- Wake Lock
- App Badging
์ค์ ์๊ฒฉ push ์๋ฆผ์ ๋ฐฑ์๋ ์๋ํฌ์ธํธ, push subscription ์ ์ฅ์, VAPID ํค๊ฐ ํ์ํฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ push ์ง์ ์ฌ๋ถ๋ฅผ ๋ณด์ฌ ์ฃผ์ง๋ง, ๋ฐฑ์๋ ์์ด ์๊ฒฉ push๋ฅผ ๊ฐ์ง๋ก ํ๋ด ๋ด์ง๋ ์์ต๋๋ค.
์๋ฆผ ๊ถํ์ ํ ๋ฒ ๊ฑฐ๋ถํ๋ฉด ๊ฐ์ ์ฌ์ดํธ์์ native permission prompt๋ฅผ ๊ณ์ ๋ค์ ๋์ธ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋๋ iOS ์๋ฆผ ์ค์ ์์ ์ง์ ํ์ฉ์ผ๋ก ๋ฐ๊พผ ๋ค ์ฑ์์ ๊ถํ ์ํ๋ฅผ ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค.
์์น ์ง๋๋ OpenStreetMap embed๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ณ๋ API ํค๊ฐ ํ์ ์์ต๋๋ค. ๋ง์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ์ค์ ์๋น์ค๋ผ๋ฉด ์ง๋ ์ ๊ณต์์ ์ด์ฉ ์ฝ๊ด, ํธ๋ํฝ ์ ํ, ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ ๊ธฐ์ค์ ๋ฐ๋ก ํ์ธํด์ผ ํฉ๋๋ค.
- ์ ์ฅ์๋ฅผ ํด๋ก ํฉ๋๋ค.
- ๋ก์ปฌ์์ ์ฑ์ ์คํํฉ๋๋ค.
- Netlify ๋๋ Vercel์ ๋ฐฐํฌํฉ๋๋ค.
- ๋ฐฐํฌ๋ HTTPS URL์ ๋ชจ๋ฐ์ผ์์ ์ฝ๋๋ค.
- ์ฑ์ ํ ํ๋ฉด์ ์ค์นํฉ๋๋ค.
- ์นด๋ฉ๋ผ, ๊ฐค๋ฌ๋ฆฌ, ์์น, ์๋ฆผ, ๊ณต์ , ํด๋ฆฝ๋ณด๋, ์คํ๋ผ์ธ ๋ฐ๋ชจ๋ฅผ ์ค์ตํฉ๋๋ค.
- ์ฑ ์์ด์ฝ์ ๊ต์ฒดํฉ๋๋ค.
- manifest์์ ์ฑ ์ด๋ฆ, ํ ๋ง ์์, shortcuts๋ฅผ ์์ ํฉ๋๋ค.
- ๋ค์ ๋น๋ํ๊ณ ์ฌ๋ฐฐํฌํ ๋ค ๋ณํ๋ฅผ ํ์ธํฉ๋๋ค.