Next.js 프로젝트 웹앱 만들기 - PWA(Progressive Web App)

Next.js 프로젝트 웹앱 만들기 - PWA(Progressive Web App)

요약
Next.js로 PWA 웹앱 개발해보기 feat.next-pwa
작성일
Nov 26, 2024
태그
Next.js
PWA

PWA(Progressive Web App)를 알아보자

 
notion image
PWA(Progressive Web App)는 웹 기술을 사용해 네이티브 앱과 유사한 사용자 경험을 제공하는 웹 애플리케이션입니다. 일반 웹처럼 URL로 접속할 수 있으면서도 네이티브 앱처럼 설치하고 오프라인에서도 사용할 수 있고 브라우저만 있다면 대부분 환경 작동할 수 있습니다.

PWA의 특징

  • 빠른 로딩 속도: 서비스 워커(Service Worker)를 활용해 캐싱 기능을 제공하므로 재방문 시 빠르게 로드됨
  • 오프라인 지원: 네트워크 연결이 없어도 중요한 기능이 작동
  • 앱 설치: 사용자가 브라우저를 통해 설치해 홈 화면에서 앱처럼 실행 가능
  • 푸시 알림: 푸시 알림을 통해 사용자와의 지속적인 상호작용이 가능
  • 앱과 유사한 인터페이스: standalone 모드로 실행되면 주소창 없이 앱처럼 실행

대표적인 PWA 적용 사례

  • Twitter Lite
  • Starbucks PWA
  • Alibaba
  • Pinterest

Next.js 프로젝트에 PWA적용해보기 - App 라우터 방식

PWA(Progressive Web App)는 네이티브 앱의 장점을 웹 애플리케이션에 접목한 기술입니다.
주소창 없는 전체 화면, 빠른 로딩 속도, 오프라인 접근성을 제공하며, 특히 설치 없이 웹과 앱의 경험을 동시에 제공합니다.
PC보다 모바일 환경에서 많이 사용되는 웹 사이트를 운영하다 보면 매번 브라우저를 열어 접속하는 것이 번거롭다고 느끼기 마련입니다. 북마크나 바탕화면에 추가하는 방법이 있지만 네이티브 앱처럼 실행되면 더 편리하지 않을까? 저는 이러한 배경에서 PWA를 떠올리게 되었고 이번 기회에 프로젝트에 적용하게 되었습니다.
이번 예시로 사용되는 프로젝트는 아래 링크로 접속하면 PWA가 적용된 사이트를 확인할 수 있습니다.

1. next-pwa 설치

Next.js에서 PWA는 라이브러리를 통해 쉽게 세팅할 수 있습니다.
먼저 Next.js에서 PWA 설정을 도와주는 라이브러리를 설치합니다.
# npm npm install next-pwa # yarn yarn add next-pwa

2. next.config.js 수정

next-pwa 라이브러리 설치가 완료되었다면 next.config.js를 수정해야 합니다. 먼저 공식문서에서 제공하는 샘플을 그대로 가져와 줍니다 .
const withPWA = require('next-pwa')({ dest: 'public' }) module.exports = withPWA({ // next.js config })

3. Manifest 파일 생성

이제 manifest 파일을 작성해야 합니다. 프로젝트 public 폴더에 manifest.json 파일을 생성하고 아래 내용을 입력하면 됩니다. 만약 public 폴더가 없다면 app 폴더에 생성해도 괜찮습니다.
 
PWA를 위한 Manifest 주요 항목
  1. background_color
      • 앱 로드 중 초기 화면의 배경색을 지정한다. 이는 앱 로드 시간 동안에 보여지게 되는 색상
      • 예: "#FFFFFF"
  1. theme_color
      • 브라우저의 UI 색상을 지정한다. 예를 들어, 앱이 실행 중일 때 상단 상태 바의 배경색을 설정
      • : "#FFFFFF"
  1. icons
      • 앱 아이콘 정보를 정의한다. 다양한 크기의 이미지를 제공해 모든 디바이스에서 적절히 표시
      • src: 아이콘 경로
      • sizes: 아이콘 크기 (예: 192x192, 512x512)
      • purpose: maskable을 설정하면 홈 화면 아이콘이 다양한 모양의 마스크에 적합하게 렌더링
  1. name
      • 앱의 전체 이름으로 설치 후 홈 화면 또는 앱 목록에 표시
      • : "다양한 계산기 모음"
  1. short_name
      • 앱 이름의 축약형으로 홈 화면 아이콘 하단이나 좁은 화면에서 표시
      • : "계산기"
  1. start_url
      • 앱이 실행될 때 로드되는 기본 URL아다. 일반적으로 루트 경로인 /로 설정되지만 특정 페이지로 지정 가능
      • : "/"
  1. display
      • 앱이 브라우저 창에서 표시되는 방식을 결정
        • standalone: 네이티브 앱처럼 보이도록 주소창과 브라우저 UI 숨김
        • fullscreen: 완전한 전체 화면 모드로 실행
        • minimal-ui: 최소한의 브라우저 UI(뒤로가기, 새로고침 버튼 등)를 표시
  1. orientation
      • 앱의 화면 방향을 지정
        • portrait: 세로 모드
        • landscape: 가로 모드
{ "name": "PWA App", "short_name": "App", "icons": [ { "src": "/icons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" }, { "src": "/icons/android-chrome-384x384.png", "sizes": "384x384", "type": "image/png" }, { "src": "/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png" } ], "theme_color": "#FFFFFF", "background_color": "#FFFFFF", "start_url": "/", "display": "standalone", "orientation": "portrait" }

4. Metadata에 Manifest 추가

Manifest 파일을 브라우저가 확인할 수 있도록 app/layout.tsxmetadata에 추가합니다.
manifest: /manifest.json 해당 코드를 입력해 주면 됩니다.
export const metadata: Metadata = { metadataBase: new URL("<https://every-calculator.vercel.app>"), title: "다양한 계산기 모음", description: "다양한 계산기를 간단하고 편리하게 활용해 보세요!", manifest: "/manifest.json", icons: { icon: "/images/favicon.png", }, openGraph: { type: "website", url: "/", title: "다양한 계산기 모음", description: "다양한 계산기를 간단하고 편리하게 활용해 보세요!", images: [ { url: "/images/preview.jpeg", alt: "다양한 계산기 모음 미리보기 이미지", }, ], }, };

5. PWA 적용 확인 및 테스트

위에 사항들을 문제없이 적용하였다면 이제 PWA가 적용되었는지 로컬에서 먼저 테스트를 해볼 수 있습니다.
로컬에서 빌드와 실행을 통해 확인해 봅시다.
💡
기존에는 크롬 브라우저의 Lighthouse 탭에서 PWA 점수를 확인가능 했지만 최근 크롬에서는 해당 기능은 지원이 중단되었다…
npm run build npm run start
 
빌드가 완료되었고 PWA를 제대로 인식하였다면 아래와 같이 확인이 가능합니다.
notion image
PWA가 올바르게 설정되었다면 Install App 버튼이 표시되며 설치 후 주소창 없이 앱처럼 실행됩니다.
💡
로컬에서 접속하여 주소창에 표시되는 다운로드 아이콘을 누르면 아래 이미지처럼 앱 설치를 할 수 있게 됩니다.
notion image
 
이제 설치를 완료하고 보면 브라우저가 아닌 앱으로 접속되는 것을 볼 수 있습니다. PC에서만 동작하는 것이 아니라 모바일 환경에서도 동일하게 동작할 뿐 아니라 주소창도 보이지 않고 어플처럼 동작하는 모습을 볼 수 있습니다.
notion image
 
notion image
💡
PWA는 HTTPSlocalhost 환경에서만 작동!
만약 배포에 Vercel, Netlify와 같은 플랫폼을 이용하면 기본적으로 HTTPS 환경을 지원하므로 별도의 인증서 설정 없이 배포할 수 있습니다.
 

참고문헌