[FE] PWA์˜ A to Z

2025. 2. 16. 23:51ยท๐Ÿ–ฅ๏ธdevelop/Frontend

์›น ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ ์  ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์— ํฅ๋ฏธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฃผ๋ ฅ ์Šคํƒ์ด React์—ฌ์„œ React Native๋ฅผ ๊ณต๋ถ€ํ•ด์•ผํ•˜๋‚˜ ๊ณ ๋ฏผํ•˜๋˜ ์ฐจ์—, ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ์›น ๊ธฐ์ˆ ๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” PWA(Progressive Web App)์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

๊ฐœ์ธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ PWA๋ฅผ ์ ์šฉํ•ด๋ณด์•˜์œผ๋ฉฐ, ์ง€๊ธˆ ์ง„ํ–‰์ค‘์ธ ํ•ด์ปคํ†ค์—์„œ๋„ PWA๋ฅผ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. ์ด์ œ๋Š” ์–ด๋–ค ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋“  PWA๋ถ€ํ„ฐ ์ ์šฉํ•˜๊ณ  ๋ณผ ์ •๋„๋กœ PWA๋ฅผ ์‚ฌ๋ž‘ํ•˜์ง€๋งŒ, ๋ถ€๋„๋Ÿฝ๊ฒŒ๋„ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜์ง€๋Š” ๋ชปํ–ˆ๋‹ค. ์ผ๋‹จ ์„ค์น˜ ๋ฒ„ํŠผ๋งŒ ๋œจ๋ฉด ๋งŒ์กฑํ•˜๋Š” ์ˆ˜์ค€์ด์—ˆ๋Š”๋ฐ ์ด์ œ๋Š” PWA๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ๋ณด๋‹ค ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด PWA์˜ ์ „๋ฐ˜์ ์ธ ๊ฐœ๋…๋ถ€ํ„ฐ ํ•ต์‹ฌ ๊ธฐ์ˆ ๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

1. PWA(Progressive Web App)๋ž€

PWA(Progressive Web App)์€ ์›น ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

๊ตฌ๊ธ€์ด ์ฒ˜์Œ ๊ฐœ๋…์„ ์ •๋ฆฝํ–ˆ์œผ๋ฉฐ, '์ง„๋ณด์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜' ์ด๋ผ๋Š” ์ด๋ฆ„์ฒ˜๋Ÿผ, ์ „ํ†ต์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๋›ฐ์–ด๋„˜์–ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค. PWA๋Š” ๊ธฐ์กด์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋‹ฌ๋ฆฌ ์˜คํ”„๋ผ์ธ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ , ํ‘ธ์‹œ ์•Œ๋ฆผ๊ณผ ํ™ˆ ํ™”๋ฉด ๋ฐ”๋กœ๊ฐ€๊ธฐ ์„ค์น˜ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

์—ฌํƒ€ ์›น ๊ธฐ์ˆ ์ฒ˜๋Ÿผ, PWA๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTML, CSS, Javascript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ๋‹ค. ์—ฌ๊ธฐ์— Service Worker, Web Manifes ๋“ฑ์˜ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ, ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— ์‚ฌ์šฉ์ž๋Š” ๋ณ„๋„์˜ ์•ฑ ์Šคํ† ์–ด์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•˜์ง€๋„ ์•Š๊ณ ๋„ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

PWA์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฅ์ ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. PWA์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์˜คํ”„๋ผ์ธ ์ง€์›

PWA๋Š” Service Worker๋ฅผ ์ด์šฉํ•˜์—ฌ, ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ์ƒํ™ฉ์—์„œ๋„ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํ”„๋ผ์ธ์—์„œ๋„ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณต๊ตฌ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™”

๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ฒผ์„ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ ์ €์žฅํ•˜๊ณ , ์—ฐ๊ฒฐ์ด ๋ณต๊ตฌ๋˜๋ฉด ์ž๋™์œผ๋กœ ์„œ๋ฒ„์™€ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค(SyncManager API ํ™œ์šฉ ๊ฐ€๋Šฅ)

navigator.serviceWorker.ready.then(reg => {
  return reg.sync.register('sync-event');
});

 

ํ‘ธ์‹œ ์•Œ๋ฆผ ์ง€์›

ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. Web Push API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ๋ฆฌํ…์…˜์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

 

์ €์žฅ ๊ณต๊ฐ„ ๊ด€๋ฆฌ

์บ์‹œ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„์ง€๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. Storage API๋ฅผ ํ™œ์šฉํ•ด ์ €์žฅ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

์•ฑ ์Šคํ† ์–ด ์„ค์น˜ ๋ถˆํ•„์š”

PWA๋Š” ๋ณ„๋„์˜ ์•ฑ ์Šคํ† ์–ด๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์„ค์น˜ํ•  ์ˆ˜ ์ž‡๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„ ๋ฐ”๋กœ ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. PWA์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ 

PWA๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ฃผ์š” ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

Service Worker

Service Worker๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ , ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜คํ”„๋ผ์ธ์—์„œ๋„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker ๋“ฑ๋ก ์„ฑ๊ณต:', registration);
    })
    .catch(error => {
      console.log('Service Worker ๋“ฑ๋ก ์‹คํŒจ:', error);
    });
}

 

์œ„ ์ฝ”๋“œ์—์„œ navigator.serviceWorker.register() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Service Worker๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ ์บ์‹ฑ ์ „๋žต์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Web App Manifest

Web App Manifest๋Š” JSON ํŒŒ์ผ๋กœ, PWA๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

{
  "name": "My PWA App",
  "short_name": "PWA",
  "start_url": "/index.html",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000",
  "icons": [
    {
      "src": "/icons/icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    }
  ]
}

 

JSON ํŒŒ์ผ ์ž‘์„ฑ ํ›„, index.html์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•œ๋‹ค.

<link rel="manifest" href="/manifest.json">

 

์„ค์ •์„ ์™„๋ฃŒํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•  ๋•Œ ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜์˜๋˜๋ฉฐ, ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

์บ์‹ฑ ์ „๋žต

PWA์—์„œ๋Š” ์บ์‹ฑ์„ ํ†ตํ•ด ์˜คํ”„๋ผ์ธ ์ง€์›์„ ๊ฐ•ํ™”ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์บ์‹ฑ ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Cache First: ๋„คํŠธ์›Œํฌ๋ณด๋‹ค ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„  ์ œ๊ณต
  • Network First: ์ตœ์‹  ๋ฐ์ดํ„ฐ ์šฐ์„  ์š”์ฒญ, ์‹คํŒจ ์‹œ ์บ์‹œ ์‚ฌ์šฉ
  • Stale-While-Revalidate: ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์ œ๊ณตํ•˜๋ฉด์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ†ตํ•ด ์ตœ์‹  ๋ฐ์ดํ„ฐ๋กœ ์—…๋ฐ์ดํŠธ
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

 

์œ„ ์ฝ”๋“œ๋Š” Cache-first ์ „๋žต์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

 

3. PWA ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

react ํ”„๋กœ์ ํŠธ์—์„œ PWA๋Š” create-react-app์œผ๋กœ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

npx create-react-app <ํ”„๋กœ์ ํŠธ๋ช…> --template cra-template-pwa

 

2. manifest.json ์„ค์ •

์„œ๋น„์Šค ์ด๋ฆ„, ์•„์ด์ฝ˜ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "short_name": "PWA App",
  "name": "My Progressive Web Application",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#000000"
}

 

3. serviceWorkerRegistration.js ์ˆ˜์ •

serviceWorkerRegistration.register();

 

unregister -> register๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • register(): serviceworker๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์˜คํ”„๋ผ์ธ ์บ์‹ฑ, ํ‘ธ์‹œ์•Œ๋ฆผ ๋“ฑ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • unregister(): ๊ธฐ์กด ๋“ฑ๋ก๋œ service worker๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ pwa ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.

 

4. PWA์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

โœ… PWA์˜ ์žฅ์ 

๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ์ง€์›

  • PWA๋Š” ์›น ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์—์„œ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์›น๊ณผ ๋ชจ๋ฐ”์ผ์„ ๋ชจ๋‘ ์ง€์›ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ ˆ๊ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์„ค์น˜ ๋ถ€๋‹ด ์—†์Œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์Šคํ† ์–ด๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์•ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ค์น˜ ๊ณผ์ •์ด ๊ฐ„๋‹จํ•ด ์‚ฌ์šฉ์ž ์ดํƒˆ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„

  • Service Worker๋ฅผ ํ™œ์šฉํ•œ ์บ์‹ฑ ๊ธฐ์ˆ ๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.
  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•œ ํ™˜๊ฒฝ์—์„œ๋„ ๋น ๋ฅด๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜คํ”„๋ผ์ธ ์ง€์›

  • ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ฒจ๋„ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜คํ”„๋ผ์ธ์—์„œ๋„ ํŠน์ • ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ

  • ์›น ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋ฆฌํ…์…˜์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ‘ธ์‹œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๋งˆ์ผ€ํŒ… ๋ฐ ์‚ฌ์šฉ์ž ์ฐธ์—ฌ ์œ ๋„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์— ์œ ๋ฆฌ

  • ์ผ๋ฐ˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋‹ฌ๋ฆฌ ์›น ํŽ˜์ด์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋ฏ€๋กœ, ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ํฌ๋กค๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„ ๋“ฑ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์–ด ๋” ๋งŽ์€ ์œ ์ž…์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ์‰ฝ๋‹ค

  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•  ํ•„์š” ์—†์ด, ๋ฐฐํฌ๋œ ์ตœ์‹  ๋ฒ„์ „์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋œ๋‹ค.
  • ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

โŒ PWA์˜ ๋‹จ์ 

์ œํ•œ์ ์ธ iOS ์ง€์›

  • iOS์˜ Safari๋Š” PWA์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ œํ•œ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด ์™„์ „ํ•˜์ง€ ์•Š๋‹ค.
  • ๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ ๋ชจ๋“œ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™์ž‘์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์ ‘๊ทผ์„ฑ ์ œํ•œ

  • ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์นด๋ฉ”๋ผ, ๋ธ”๋ฃจํˆฌ์Šค, NFC ๋“ฑ ์ผ๋ถ€ ๊ธฐ๊ธฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์ œํ•œ์ ์ด๋‹ค.
  • ๊ณ ์‚ฌ์–‘์˜ ๊ทธ๋ž˜ํ”ฝ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์•ฑ ์Šคํ† ์–ด ์œ ์ž… ์ฐจ๋‹จ

  • ์•ฑ์Šคํ† ์–ด์— ๋“ฑ๋ก๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์•ฑ์Šคํ† ์–ด๋ฅผ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์œ ์ž…์ด ์–ด๋ ต๋‹ค.
  • ๊ธฐ์กด ์•ฑ์Šคํ† ์–ด ์ƒํƒœ๊ณ„๋ฅผ ํ™œ์šฉํ•œ ๋งˆ์ผ€ํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋ณ„ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ

  • ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค PWA ์ง€์› ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋‹ค. (ํŠนํžˆ iOS์˜ Safari๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ ๋ฏธ์ง€์›)
  • ์ตœ์‹  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

๋ณด์•ˆ ์ด์Šˆ

  • HTTPS ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ, Service Worker์˜ ๋ณด์•ˆ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋น„๊ตํ•˜๋ฉด OS ์ฐจ์›์˜ ๋ณด์•ˆ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค.

PWA๋ฅผ ์•ฑ์Šคํ† ์–ด์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค?

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ PWA๋Š” ์›น ๊ธฐ์ˆ ๋งŒ์œผ๋กœ๋„ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋งค๋ ฅ์ ์ธ ์„ ํƒ์ง€์˜€๋‹ค. ํฌ๋กœ์Šค ํ”Œ๋ž˜์ƒˆํผ ํ˜ธํ™˜์„ฑ๊ณผ ๋›ฐ์–ด๋‚œ ์ ‘๊ทผ์„ฑ์€ ๋ฌผ๋ก , ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต ๋ถ€๋‹ด ์—†์ด๋„ ์•ฑ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์ปธ๋‹ค.

 

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

 

๊ทธ๋Ÿฌ๋˜ ์ค‘, PWA๋ฅผ ์•ฑ์Šคํ† ์–ด์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋Š” PWA์˜ ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ํ•œ์ธต ๋” ๋„“ํžˆ๋Š” ๋ฐœ๊ฒฌ์ด์—ˆ๋‹ค. ์›น ๊ธฐ์ˆ ์˜ ์žฅ์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์•ฑ ์Šคํ† ์–ด ์ƒํƒœ๊ณ„์˜ ์ด์ ์„ ํ•จ๊ป˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. ์•ฑ ์Šคํ† ์–ด(google, apple)์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

1. Google play store ์ถœ์‹œ

TWA(Trusted Web Activity)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, PWA๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. Apple App Store ์ถœ์‹œ

์ง์ ‘ ๋ฐฐํฌ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, ios PWA Wrapper, ์›น๋ทฐ ๋ž˜ํผ๋ฅผ ํ†ตํ•ด ์ถœ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


PWA๋Š” ์•Œ๋ฉด ์•Œ์ˆ˜๋ก ์žฌ๋ฏธ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ํŒจํ‚ค์ง•ํ•˜์—ฌ ์•ฑ ์Šคํ† ์–ด์— ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์•ž์œผ๋กœ๋„ PWA๋ฅผ ์• ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค. PWA์˜ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ ...์•ฑ ์ถœ์‹œ๊นŒ์ง€ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. 

 

'๐Ÿ–ฅ๏ธdevelop > Frontend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Electron] Vibeํ•˜๊ฒŒ ์ผ๋ ‰ํŠธ๋ก  ์‹œ์ž‘ํ•˜๊ธฐ  (2) 2025.03.30
[Next.js] ๋กœ๊ทธ์ธ ๋’ค๋กœ๊ฐ€๊ธฐ๋กœ ์ ‘๊ทผ ์ œํ•œํ•˜๊ธฐ-router.push vs router.replace  (0) 2024.11.19
[Three.js] Three.js๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž  (0) 2024.10.27
'๐Ÿ–ฅ๏ธdevelop/Frontend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Electron] Vibeํ•˜๊ฒŒ ์ผ๋ ‰ํŠธ๋ก  ์‹œ์ž‘ํ•˜๊ธฐ
  • [Next.js] ๋กœ๊ทธ์ธ ๋’ค๋กœ๊ฐ€๊ธฐ๋กœ ์ ‘๊ทผ ์ œํ•œํ•˜๊ธฐ-router.push vs router.replace
  • [Three.js] Three.js๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (81) N
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“•review (15)
        • ์ฑ… (10)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (39) N
        • TIL (25)
        • ํ”„๋กœ์ ํŠธ (9) N
        • ํšŒ๊ณ  (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[FE] PWA์˜ A to Z
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”