Skip to content

Latest commit

ย 

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

pwa-demo

๊ต์‹ค ์ˆ˜์—…์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Progressive Web App ์‹ค์Šต ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

ํ•™์ƒ๋“ค์€ ์ด ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•œ ๋’ค Netlify ๋˜๋Š” Vercel์— ๋ฐฐํฌํ•˜๊ณ , ๋ชจ๋ฐ”์ผ์—์„œ HTTPS URL์„ ์—ด์–ด ์•ฑ์„ ์„ค์น˜ํ•œ ๋‹ค์Œ ์นด๋ฉ”๋ผ, ๊ฐค๋Ÿฌ๋ฆฌ, ์œ„์น˜, ์•Œ๋ฆผ, ๊ณต์œ , ํด๋ฆฝ๋ณด๋“œ, ์ €์žฅ์†Œ, ์˜คํ”„๋ผ์ธ ๋™์ž‘์„ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PWA๋ž€?

Progressive Web App์€ ์ผ๋ฐ˜ ์›น ์•ฑ์— ์•ฑ๋‹ค์šด ๊ธฐ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ๋”ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ํ™ˆ ํ™”๋ฉด ์„ค์น˜, ์˜คํ”„๋ผ์ธ ๋™์ž‘, ์•ฑ ์•„์ด์ฝ˜, service worker, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋น„์Šทํ•œ Web API ์—ฐ๋™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜์—… ์ž๋ฃŒ๋กœ ์“ฐ๊ธฐ ์‰ฝ๋„๋ก ํ™”๋ฉด ๋ฌธ๊ตฌ์™€ ์•ˆ๋‚ด๋Š” ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ–ˆ๊ณ , ์ฝ”๋“œ์—์„œ ๊ทธ๋Œ€๋กœ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” API ์ด๋ฆ„์€ ์˜์–ด ์›๋ฌธ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์Šคํƒ

  • Vite
  • React
  • TypeScript
  • Plain CSS
  • ๋ฐฑ์—”๋“œ ์—†์Œ
  • ์ตœ์†Œ ์˜์กด์„ฑ

๋กœ์ปฌ ์‹คํ–‰

npm install
npm run dev

Vite๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ๋กœ์ปฌ ์ฃผ์†Œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ฝ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” localhost๋ฅผ ์•ˆ์ „ํ•œ ์ปจํ…์ŠคํŠธ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์นด๋ฉ”๋ผ, ํด๋ฆฝ๋ณด๋“œ์ฒ˜๋Ÿผ HTTPS๊ฐ€ ํ•„์š”ํ•œ API๋„ ๋กœ์ปฌ์—์„œ ์‹ค์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ

npm run build

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ธํ•˜๋ ค๋ฉด:

npm run preview

service worker๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ service worker๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด URL์— ?sw=1์„ ๋ถ™์—ฌ์„œ ์—ฝ๋‹ˆ๋‹ค.

Netlify ๋ฐฐํฌ

  1. ํ”„๋กœ์ ํŠธ๋ฅผ GitHub์— pushํ•ฉ๋‹ˆ๋‹ค.
  2. Netlify์—์„œ ์ƒˆ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. Build command๋Š” npm run build๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. Publish directory๋Š” dist๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Netlify๋Š” ๋ฐฐํฌ๋œ ์‚ฌ์ดํŠธ์— HTTPS๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Vercel ๋ฐฐํฌ

  1. ํ”„๋กœ์ ํŠธ๋ฅผ GitHub์— pushํ•ฉ๋‹ˆ๋‹ค.
  2. Vercel์—์„œ ์ด ์ €์žฅ์†Œ๋ฅผ importํ•ฉ๋‹ˆ๋‹ค.
  3. Vite ๊ธฐ๋ณธ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค: build command๋Š” npm run build, output directory๋Š” dist.

Vercel๋„ ๋ฐฐํฌ๋œ ์‚ฌ์ดํŠธ์— HTTPS๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์•„์ด์ฝ˜ ๊ต์ฒด

placeholder ์•„์ด์ฝ˜์€ public/icons์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • logo.svg
  • icon-192.png
  • icon-512.png
  • maskable-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, description
  • index.html: <title>๊ณผ description meta ํƒœ๊ทธ
  • src/app/App.tsx: ํ—ค๋”์˜ <h1>๊ณผ ๋ณด์กฐ ๋ฌธ๊ตฌ

manifest ์ˆ˜์ •

public/manifest.webmanifest์—์„œ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ”๊ฟ” ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • name
  • short_name
  • description
  • theme_color
  • background_color
  • icons
  • shortcuts

manifest๋ฅผ ๋ฐ”๊พผ ๋’ค์—๋Š” ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ค์น˜ํ•œ ์•ฑ์—์„œ๋Š” ์ด๋ฆ„์ด๋‚˜ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ์ด ๋ฐ”๋กœ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•„์š”ํ•˜๋ฉด ์•ฑ์„ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

HTTPS๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋น„์Šทํ•œ API ๋Œ€๋ถ€๋ถ„์€ ์•ˆ์ „ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Camera
  • Location
  • Clipboard
  • Notifications
  • Service workers
  • Wake Lock

๋กœ์ปฌ ๊ฐœ๋ฐœ์—์„œ๋Š” localhost๊ฐ€ ๋ณดํ†ต ์•ˆ์ „ํ•œ ์ปจํ…์ŠคํŠธ๋กœ ์ธ์ •๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ชจ๋ฐ”์ผ ํ…Œ์ŠคํŠธ๋Š” Netlify๋‚˜ Vercel์ฒ˜๋Ÿผ HTTPS๊ฐ€ ์ œ๊ณต๋˜๋Š” ๋ฐฐํฌ URL์—์„œ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

API ์ง€์› ์ฐธ๊ณ 

๋ชจ๋ฐ”์ผ์—์„œ ํŠนํžˆ ์‹ค์Šตํ•˜๊ธฐ ์ข‹์€ ๊ธฐ๋Šฅ:

  • ์„ค์น˜ ํ”„๋กฌํ”„ํŠธ์™€ 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 ํ‚ค๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์‹ค์ œ ์„œ๋น„์Šค๋ผ๋ฉด ์ง€๋„ ์ œ๊ณต์ž์˜ ์ด์šฉ ์•ฝ๊ด€, ํŠธ๋ž˜ํ”ฝ ์ œํ•œ, ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€์„ ๋”ฐ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ ์ˆ˜์—… ํ๋ฆ„

  1. ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋กœ์ปฌ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. Netlify ๋˜๋Š” Vercel์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐฐํฌ๋œ HTTPS URL์„ ๋ชจ๋ฐ”์ผ์—์„œ ์—ฝ๋‹ˆ๋‹ค.
  5. ์•ฑ์„ ํ™ˆ ํ™”๋ฉด์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  6. ์นด๋ฉ”๋ผ, ๊ฐค๋Ÿฌ๋ฆฌ, ์œ„์น˜, ์•Œ๋ฆผ, ๊ณต์œ , ํด๋ฆฝ๋ณด๋“œ, ์˜คํ”„๋ผ์ธ ๋ฐ๋ชจ๋ฅผ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค.
  7. ์•ฑ ์•„์ด์ฝ˜์„ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  8. manifest์—์„œ ์•ฑ ์ด๋ฆ„, ํ…Œ๋งˆ ์ƒ‰์ƒ, shortcuts๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  9. ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•œ ๋’ค ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages