솔미는 성장중
PWA 적용기 : 본문
야놀자 부트캠프 파이널 프로젝트를 진행할 때 기획적으로 모바일이 더 적합하다는 판단을 해서 PWA를 도입해 웹앱을 만들기로 했다!
푸시알림을 꼭 도입하고 싶었기 때문이다..희희
PWA란?
Progressive Web App
네이티브 앱의 장점과 웹의 장점을 결합한 것!
- 가볍다!
- 진입장벽이 아주 낮다!
- 여러 모바일 환경에 대응할 수 있다! (iOS, Andriod 다 하나로 퉁-)
- 보안상 이유로 브라우저가 접근 못하는 시스템 하드웨어&소프트웨어에 접근 가능
- 검색엔진을 통해 찾을 수 있다. (+ 앱스토어 배포도 원한다면 가능하당)
but
- 고성능 게임 개발 같은건 당연히.. 어렵다
- 지원하지 않는 브라우저도 존재
- 아직 완전히 자리잡지 않아서 기능적인 한계들이 일부 존재
그럼 이제 어떻게 적용할건지에 대해서 알아보자
조건도 몇 가지 없다 👍
PWA를 적용하기 위한 조건
1. https
https는 보안이 강화된 http이다.
http에 Secure Socket이 추가돼 데이터를 주고받는 과정에서 내용이 암호화되어 통신할 수 있도록 한 것이다.
PWA는 보안이 연결된 사이트에서만 동작하기 때문에 HTTPS 도메인에서 제공되어야 한다.
2. 서비스 워커 (Service Worker)
서비스 워커는 백그라운드에서 실행되는 JS 형태의 스크립트이다!
오프라인 환경에서도 웹이 작동할 수 있도록 네트워크 요청을 가로채 네트워크 불량 상태 등 접속성이 안 좋은 상황을 커버한다. 네트워크 요청을 가로챈다는 점에서 중간자 공격에 취약하기 때문에 https에서만 작동하는 것이다.
중간자 공격(man in the middle attack, MITM)
네트워크 통신을 조작해 통신 내용을 도청/조작하는 공격기법
3. 매니페스트 (Manifest)
PWA에 대해 브라우저에 알려주고, 사용자의 데스크탑 or 모바일에 설치할 때 어떻게 작동해야 하는지 알려주는 JSON 파일이다. (웹 페이지 url, 앱 이름, 화면 표시 방식 등 기능과 표시 방법에 대한 정보를 담고있음!)
pwa에 대해 알아보는 김에 좋은 pwa를 만들기 위해선 어떤 것을 고려해야하는지도 추가로 살펴보았다. :)
좋은 PWA를 만들기 위해선?
체크리스트
디바이스 크기/입력 유형에 관계없이 모든 사용자가 앱을 설치하고 사용할 수 있는가?
- Starts fast, stays fast (빠르게 로드 & 빠르게 유지)
- Works in any browser (모든 브라우저에서 작동)
- Responsive to any screen size (모든 화면 크기에 대응)
- Provides a custom offline page (오프라인 환경에서 맞춤형 오프라인 페이지 제공)
- Is installable (설치가능)
- Support DeepLink (앱 홈페이지 뿐만아니라 앱 내 특정 페이지에 URL로 접속 가능)
적용 시 겪었던 이슈
우리는 푸시알림을 위해서 pwa를 도입한 것이었기에 firebase-fcm과 함께 적용했다.
간단하게 전체적인 흐름 정리
Firebase 설치 및 연동 - Firebase 프로젝트 생성 & VAPID 키 발급 - VAPID키를 이용해서 토큰 발급 - 해당 토큰을 백엔드에게 전달
적용방법은 아래 깃허브 주소들을 참고했다.
https://github.com/firebase/quickstart-js/blob/master/messaging/vite.config.js (공식 예제 사이트)
https://lemontia.tistory.com/1047 (전체적인 플로우 참고)
https://github.com/kheeyaa/FCM-with-React?tab=readme-ov-file (폴더구조 참고)
그리고 프론트, 백엔드 각각에서 어떤 작업을 해야하는지에 대해서도 정리를 해보았다.

1. 이미지 등록하기
PWA는 필수적으로 이미지를 등록시켜줘야 한다. (이 이미지는 모바일 화면에 나타나는 모바일 앱 이미지로 사용된다!)
이때 이미지를 꼭 크기별로 만들어서 저장해주어야하는데, 직접 하나하나 만들기 귀찮아서 명령어를 만들어주었다.
npm i @vite-pwa/assets-generator -D
// package.json
{
"scripts": {
"generate-pwa-assets": "pwa-assets-generator --preset minimal public/logo.svg"
}
}
(파일명에 따라 logo.svg 부분을 수정해주면 된다.)
참고 링크) https://www.saurabhmisra.dev/setup-react-pwa-using-vite
manifest에 아래처럼 아이콘 정보를 제대로 설정해주고, index.html에서 manifeset.JSON을 인식할 수 있게 헤더에
<link rel="manifest" href="/manifest.json" /> 를 추가해주었는데, dev서버에서 실행시켰을 때와 build하고 실행시켰을 때 PWA가 공통적으로 적용되지 않는 이슈가 있었다.
// manifest.json 일부
"icons": [
{
"src": "pwa-64x64.png",
"sizes": "64x64",
"type": "image/png"
},
{
"src": "pwa-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "pwa-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "maskable-icon-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
이런저런 시도를 해보았고, 결국에는 이미지 경로를 못찾아서 발생하는 문제였다.;;;;
- 개발 서버:
- 개발 서버에서는 보통 서비스 워커 등록 경로를 루트 경로에 맞춘다.
- 따라서 <link rel="manifest" href="/manifest.json" />와 같이 루트 경로를 가리키는 링크를 사용한다.
- 빌드 후 실행:
- 빌드 후 실행 시에는 웹 앱이 정적 파일로 빌드되며, 서버 상에서는 해당 파일들을 서비스한다.
이 때는 웹 앱의 루트가 실제 웹 서버의 루트로 이동하게 되므로, 서비스 워커 및 기타 리소스의 경로를 업데이트해야 할 수 있습니다. - 예를 들어, 웹 앱이 /assets 폴더 내의 이미지를 사용하고 있고, 빌드 후에는 이 이미지들이 public/assets에 위치한다면, 서비스 워커 및 매니페스트 파일에서도 이를 고려하여 경로를 설정해야 한다.
- 빌드 후 실행 시에는 웹 앱이 정적 파일로 빌드되며, 서버 상에서는 해당 파일들을 서비스한다.
즉, 각각 어디에 있는 이미지를 바라볼지를 다르게 설정해두어 public/assets , public 어떤 위치에 이미지가 저장되어있느냐에 따라 pwa가 특정 경우만 적용되는 현상이 발생했던 것이다.
2. service worker 등록
service worker를 등록해주려면 외부에서 접근이 가능하도록 만들어주어야한다.
따라서 firebase-messaging-sw.js는 public에 위치되어야한다.

그외 마주쳤던 에러들
1)
The package "@esbuild/linux-x64" could not be found, and is needed by esbuild.
해결법: optional dependencies에 패키지 설치
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.6.1",
"esbuild": "^0.19.11"
}
An error occurred while retrieving token. FirebaseError: Messaging: We are unable to register the default service worker
해결법: firebase-messaging-sw.js를 public에 위치시킴
3)
importScripts firebase not working
해결법: 경로에 -compat 추가 & self.importScripts 가 아닌 importScripts 로 변경하고 eslint 에러 무시 주석 추가
그외 다른 방법)
PWA builder 라는 사이트에서 가이드라인을 따라가도 좋다.
PWABuilder
www.pwabuilder.com
사용 후기
적용방법은 생각보다 간단한데, 아무도 사용해본 사람이 없었기에 설정에서 어려움을 느꼈던 것 같다.
너무너무 좋지만 아직은 자리를 잡아가고 있는 중이기에 기능적인 한계를 느끼기도 했다.
예를 들어 ios지원도 최근에서야 가능해졌다.
하지만 진입장벽이 낮다는 점, 여러 언어를 익힐 필요없다는 점 떄문에 앞으로 점점 활성화 될 것으로 기대된다 😆