browser · medium priority
Progressive Web App (PWA)
Service Worker, 오프라인 지원, 앱 설치
intermediate 난이도3시간카카오네이버배민당근
시작 전
이해도
매우 낮음
학습 개요
탄생 배경
쉬운 설명
복잡한 개념을 실생활 비유로 설명합니다.
“오프라인 직원”
PWA는 웹사이트에 네이티브 앱의 능력을 더한 것입니다. Service Worker는 인터넷과 앱 사이의 중간 직원입니다. 인터넷이 끊겨도 미리 저장해 둔 자료로 응답하고, 네트워크가 돌아오면 조용히 최신 데이터로 업데이트합니다.
핵심 개념
Service Worker 등록 과정
1
등록 (Registration)
navigator.serviceWorker.register("/sw.js") 호출
2
설치 (Install)
install 이벤트 — 정적 파일 미리 캐싱
3
활성화 (Activate)
activate 이벤트 — 이전 캐시 정리
4
네트워크 인터셉트
fetch 이벤트 — 요청을 가로채 캐시 또는 네트워크로 처리
Service Worker 기본 구현javascript
1// public/sw.js2const CACHE_NAME = 'my-app-v1';3const STATIC_FILES = ['/', '/offline.html', '/main.css', '/app.js'];45// 설치 — 정적 파일 캐싱6self.addEventListener('install', (event) => {7 event.waitUntil(8 caches.open(CACHE_NAME).then((cache) => cache.addAll(STATIC_FILES))9 );10 self.skipWaiting(); // 즉시 활성화11});1213// 활성화 — 이전 버전 캐시 삭제14self.addEventListener('activate', (event) => {15 event.waitUntil(16 caches.keys().then((keys) =>17 Promise.all(18 keys19 .filter((key) => key !== CACHE_NAME)20 .map((key) => caches.delete(key))21 )22 )23 );24 self.clients.claim();25});2627// fetch 이벤트 — Cache First 전략28self.addEventListener('fetch', (event) => {29 event.respondWith(30 caches.match(event.request).then((cached) => {31 return cached || fetch(event.request).catch(() =>32 caches.match('/offline.html')33 );34 })35 );36});
실무 적용
어떤 상황에서 사용하는가
모바일 웹 사용자에게 앱스토어 없이 오프라인 지원·홈 화면 설치를 제공해야 할 때
어떻게 적용하는가
Next.js: next-pwa 플러그인으로 Workbox 자동 설정. Vite: vite-plugin-pwa 사용. Manifest 파일로 홈 화면 설치 지원. 배달의민족·카카오맵·Twitter Lite가 PWA로 모바일 웹 경험 향상.
흔한 실수와 안티패턴
- HTTPS 없이는 Service Worker 등록 불가 (localhost 제외)
- Service Worker 업데이트가 바로 반영 안 됨 — skipWaiting() 또는 사용자에게 새로고침 안내
- iOS Safari의 PWA 지원 제한 — Push API 미지원, 스토리지 제한
면접 질문
중급카카오네이버배민
답변 방향 힌트
캐시 우선 응답 + 백그라운드 갱신
반드시 언급할 키워드
- 즉각적인 응답
- 백그라운드 네트워크 요청
- 다음 방문에 최신 데이터
예상 꼬리 질문
- Service Worker 업데이트 감지 방법은?
- Workbox를 사용해본 경험이 있나요?