FEInterview Prep

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.js
2const CACHE_NAME = 'my-app-v1';
3const STATIC_FILES = ['/', '/offline.html', '/main.css', '/app.js'];
4
5// 설치 — 정적 파일 캐싱
6self.addEventListener('install', (event) => {
7 event.waitUntil(
8 caches.open(CACHE_NAME).then((cache) => cache.addAll(STATIC_FILES))
9 );
10 self.skipWaiting(); // 즉시 활성화
11});
12
13// 활성화 — 이전 버전 캐시 삭제
14self.addEventListener('activate', (event) => {
15 event.waitUntil(
16 caches.keys().then((keys) =>
17 Promise.all(
18 keys
19 .filter((key) => key !== CACHE_NAME)
20 .map((key) => caches.delete(key))
21 )
22 )
23 );
24 self.clients.claim();
25});
26
27// 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를 사용해본 경험이 있나요?

학습 자료