Progressive Web App(PWA)은 웹 기술을 기반으로 하여 네이티브 앱과 유사한 사용자 경험을 제공하는 웹 애플리케이션입니다. PWA는 오프라인에서도 동작할 수 있으며, 알림 기능과 홈 화면 설치 기능을 갖추어 사용자가 앱처럼 쉽게 접근할 수 있는 것이 특징입니다.
1. PWA란 무엇인가?
PWA는 기존 웹사이트의 장점에 모바일 애플리케이션의 편리함을 더한 형태로, 다음과 같은 특성을 가집니다.
- 오프라인 동작 가능: 네트워크 연결 없이도 사용 가능해 사용자 경험을 높입니다.
- 반응형 디자인: 다양한 화면 크기에 맞춰 최적화되어 있어 데스크톱, 태블릿, 스마트폰 등 다양한 기기에서 사용 가능합니다.
- 빠른 로딩 속도: 기본적으로 캐싱을 사용하여 앱 로딩 속도를 높이고, 로딩 지연을 최소화합니다.
- 앱 설치 가능: 홈 화면에 추가하여 앱처럼 사용할 수 있으며, 앱스토어 설치가 필요 없습니다.
- 알림 기능: 푸시 알림을 통해 사용자와의 상호작용을 향상시킬 수 있습니다.
2. PWA의 핵심 요소
Progressive Web App(PWA)를 구현하려면 다음과 같은 핵심 요소를 이해해야 합니다.
- HTTPS 사용: 보안이 중요한 PWA는 HTTPS에서만 작동하며, 모든 통신이 안전하게 이루어져야 합니다.
- 웹 앱 매니페스트(Web App Manifest): PWA의 이름, 아이콘, 색상, 시작 URL 등을 정의하는 파일로, 앱처럼 보이게 만드는 역할을 합니다.
- 서비스 워커(Service Worker): 백그라운드에서 실행되는 스크립트로, 캐싱을 통해 오프라인에서도 웹앱이 동작하도록 지원하며, 알림 기능도 제공합니다.
3. PWA 구현 단계
이제 Progressive Web App(PWA)의 세 가지 핵심 요소를 설정하여 간단한 웹앱을 PWA로 만들어 보겠습니다.
단계 1: HTTPS로 배포하기
HTTPS 프로토콜은 사용자 데이터를 보호하고, 서비스 워커와 같은 중요한 기능이 안전하게 작동할 수 있도록 합니다. 실제 웹사이트가 배포될 때는 반드시 HTTPS로 호스팅해야 합니다. 대부분의 호스팅 제공업체는 HTTPS 인증서를 무료로 제공하므로, 배포 전에 이를 활성화해 주세요.
단계 2: 웹 앱 매니페스트 파일 설정하기
매니페스트 파일은 JSON 형식으로 작성되며, PWA의 외관과 설정을 정의합니다. 파일명은 manifest.json으로 설정합니다.
manifest.json 예시
{
"name": "My Progressive Web App",
"short_name": "MyPWA",
"start_url": "/index.html",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#007bff",
"icons": [
{
"src": "/images/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/images/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
- name: 앱 이름
- short_name: 홈 화면에 표시될 앱의 짧은 이름
- start_url: 앱이 실행될 기본 URL
- display: standalone으로 설정하면 브라우저 UI 없이 실행됩니다.
- icons: 앱 아이콘을 정의하며, 여러 해상도를 지원할 수 있습니다.
HTML에 매니페스트 연결
<link rel="manifest" href="/manifest.json">
단계 3: 서비스 워커 설정하기
서비스 워커는 자바스크립트 파일로 작성되며, 네트워크 요청을 가로채 캐시에서 파일을 제공하여 오프라인 환경에서도 웹앱이 동작하게 합니다.
서비스 워커 파일(sw.js) 예시
// 서비스 워커 설치 및 캐시 파일 설정
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open("my-cache").then((cache) => {
return cache.addAll([
"/",
"/index.html",
"/styles.css",
"/script.js",
"/images/icon-192x192.png",
"/images/icon-512x512.png"
]);
})
);
});
// 서비스 워커 활성화 및 캐시 관리
self.addEventListener("activate", (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cache) => {
if (cache !== "my-cache") {
return caches.delete(cache);
}
})
);
})
);
});
// 네트워크 요청 가로채기 및 캐시 반환
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
});
서비스 워커 등록
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js").then((registration) => {
console.log("Service Worker registered with scope:", registration.scope);
}).catch((error) => {
console.log("Service Worker registration failed:", error);
});
}
- install 이벤트: 앱의 주요 파일을 캐시합니다.
- activate 이벤트: 오래된 캐시를 삭제하여 최신 파일만 유지합니다.
- fetch 이벤트: 네트워크 요청을 가로채 캐시를 통해 응답하거나, 네트워크에서 직접 가져옵니다.
4. PWA 테스트 및 디버깅
PWA가 잘 동작하는지 확인하기 위해 크롬 개발자 도구의 ‘애플리케이션’ 탭을 사용하여 매니페스트와 서비스 워커 상태를 확인할 수 있습니다. 또한, 오프라인 모드를 활성화하여 오프라인에서도 웹앱이 정상적으로 작동하는지 테스트해 보세요.
5. PWA의 장점과 한계
장점: PWA는 빠른 로딩 속도, 오프라인 지원, 알림 기능, 설치 가능성을 통해 사용자 경험을 크게 향상시킵니다.
한계: PWA는 네이티브 앱에서 제공하는 몇 가지 고급 기능(예: 블루투스 통신, 고급 카메라 제어 등)을 제공하지 않습니다. 따라서 네이티브 앱의 기능이 필수적인 경우에는 적합하지 않을 수 있습니다.
Progressive Web App(PWA)는 웹사이트의 경험을 네이티브 앱 수준으로 끌어올릴 수 있는 훌륭한 기술입니다. 매니페스트 파일과 서비스 워커 설정을 통해 웹사이트를 PWA로 전환하면 네트워크 상황에 관계없이 유저에게 일관된 경험을 제공할 수 있습니다. 기본적인 구조와 설정을 익힌 후, PWA를 사용해 더 나은 사용자 경험을 제공하는 웹앱을 구현해 보세요.









