IMCAT.DEV
로그인 가입
JavaScript 고급 프로젝트

JavaScript PWA (Progressive Web Apps)

JavaScript PWA (Progressive Web Apps) — 고급

PWA (Progressive Web Apps)

1. 도입 (왜 배워야 하는가)

PWA(Progressive Web Apps)는 웹 애플리케이션의 새로운 패러다임으로, 모바일 앱과 같은 사용자 경험을 제공하면서도 웹의 장점을 살리는 기술입니다. 실무에서 PWA를 활용하면 애플리케이션의 성능을 향상시키고, 오프라인에서도 작동하며, 설치가 간편한 장점을 누릴 수 있습니다.

PWA를 모른다면, 사용자에게 느린 로딩 시간과 제한된 기능을 제공하게 되어, 경쟁력 있는 제품을 만들기 어려워질 수 있습니다. 예를 들어, 사용자가 이동 중에도 앱을 사용할 수 있는 기능이 없다면, 사용자 이탈률이 증가할 것이고, 이는 매출 손실로 이어질 수 있습니다.

2. 핵심 개념 설명

PWA의 핵심 개념은 다음과 같습니다:

  • 서비스 워커(Service Worker): 웹 애플리케이션과 브라우저 간의 중재자 역할을 하며, 네트워크 요청을 가로채고, 캐시를 사용하여 오프라인에서도 애플리케이션을 사용할 수 있도록 합니다.
  • 웹 앱 매니페스트(Web App Manifest): 앱의 이름, 아이콘, 시작 URL 등을 정의하여 사용자가 홈 화면에 추가할 수 있도록 도와줍니다.
  • HTTPS: PWA는 반드시 HTTPS를 통해 제공되어야 하며, 이는 보안성을 높이고 사용자 데이터를 보호합니다.
  • 용어정의
    서비스 워커네트워크 요청을 가로채어 캐싱 및 오프라인 지원
    웹 앱 매니페스트애플리케이션의 메타데이터를 정의하는 JSON 파일
    HTTPS보안 프로토콜로, 웹 사이트의 데이터를 암호화

    3. 기본 코드 예제

    PWA를 시작하기 위한 기본적인 서비스 워커 등록 코드 예제입니다.

    // service-worker.js
    self.addEventListener('install', (event) => {
        console.log('Service Worker 설치 중...');
        // 설치 중 캐시할 파일 목록
        event.waitUntil(
            caches.open('v1').then((cache) => {
                return cache.addAll([
                    '/',
                    '/index.html',
                    '/styles.css',
                    '/script.js',
                ]);
            })
        );
    });
    
    // fetch 이벤트
    self.addEventListener('fetch', (event) => {
        console.log('네트워크 요청:', event.request.url);
        event.respondWith(
            caches.match(event.request).then((response) => {
                return response || fetch(event.request);
            })
        );
    });

    실행 결과:

  • "Service Worker 설치 중..."가 콘솔에 출력됩니다.
  • 네트워크 요청이 발생할 때마다 "네트워크 요청: [URL]"이 출력됩니다.
  • 동작 설명:

    1. 서비스 워커가 설치될 때 로그를 남깁니다.
    2. 설치 과정에서 필요한 파일들을 캐시합니다.
    3. 사용자가 요청할 때 캐시된 파일이 있으면 해당 파일을 반환하고, 없으면 네트워크 요청을 합니다.
    4. 4. 실전 활용 예제

      예제 1: 오프라인 기능 추가

      쇼핑몰 웹사이트에서 사용자가 오프라인 상태에서도 장바구니에 담은 상품을 확인할 수 있도록 하는 기능입니다.

      // 장바구니 데이터 저장
      let cart = [];
      
      // 장바구니에 상품 추가 함수
      function addToCart(product) {
          cart.push(product);
          // 오프라인 상태에서도 데이터 저장
          localStorage.setItem('cart', JSON.stringify(cart));
      }

      상황 설명: 사용자가 장바구니에 상품을 추가할 때마다, 해당 데이터가 로컬 스토리지에 저장되어 오프라인에서도 접근할 수 있습니다.

      예제 2: 푸시 알림

      사용자가 새로운 상품이 추가될 때 푸시 알림을 받을 수 있도록 설정하는 코드입니다.

      self.addEventListener('push', (event) => {
          const options = {
              body: '새로운 상품이 추가되었습니다!',
              icon: 'images/icon.png',
          };
          event.waitUntil(
              self.registration.showNotification('알림', options)
          );
      });

      상황 설명: 새로운 상품이 추가되면, 구독한 사용자에게 알림을 보내어 재방문을 유도할 수 있습니다.

      5. 흔한 실수와 주의사항

      1. 서비스 워커가 실행되지 않는 경우

    5. 잘못된 코드: navigator.serviceWorker.register('/sw.js'); 경로가 잘못되었을 때
    6. 올바른 코드: 서비스 워커 파일이 루트 경로에 위치해야 합니다.
    7. 2. HTTPS를 사용하지 않을 때

    8. 잘못된 코드: HTTP로 서비스 워커를 등록하려고 할 때
    9. 올바른 코드: 반드시 HTTPS를 사용해야 서비스 워커가 작동합니다.
    10. 3. 캐싱 전략을 잘못 설정할 경우

    11. 잘못된 코드: 모든 요청을 캐시하려고 할 때
    12. 올바른 코드: 사용자의 요구에 따라 적절한 캐싱 전략을 선택해야 합니다.
    13. 6. 정리

    14. PWA는 웹 애플리케이션에 모바일 앱과 같은 사용자 경험을 제공합니다.
    15. 서비스 워커와 웹 앱 매니페스트는 PWA의 핵심 요소입니다.
    16. HTTPS를 통해 보안을 강화해야 하며, 오프라인 기능과 푸시 알림은 사용자 경험을 향상시키는 데 도움이 됩니다.
    17. 다음에 학습하면 좋은 주제

    18. React와 PWA의 통합
    19. 서버리스 아키텍처와 PWA
    20. PWA 성능 최적화 기술 (예: lazy loading, 코드 스플리팅)