# PWA (Progressive Web App) 가이드

## 개요

tkfb.technicalkorea.net에 PWA를 적용하여 모바일에서 홈 화면 앱처럼 사용 가능합니다.

- **전략**: network-first (항상 네트워크 우선, 실패 시 캐시)
- **목적**: 앱 느낌 제공 (주소창 없음, 스플래시 화면, 홈 아이콘)
- **오프라인**: 제한적 (이전 방문 페이지만 캐시에서 제공)

## 파일 구조

```
web/
├── manifest.json          # PWA 매니페스트 (앱 이름, 아이콘, 테마)
├── sw.js                  # 서비스 워커 (network-first 캐시)
├── js/app-init.js         # SW 등록 + manifest 동적 삽입 (setupPWA 함수)
└── img/
    ├── icon-192x192.png   # PWA 아이콘 (192px)
    └── icon-512x512.png   # PWA 아이콘 (512px)
```

## 주의사항

### sw.js 수정 시 반드시 지킬 것

1. **CACHE_VERSION을 반드시 올릴 것** (예: `tkfb-v1` → `tkfb-v2`)
   - 버전을 안 올리면 사용자가 이전 캐시를 계속 사용
2. **network-first 전략을 유지할 것**
   - `cache-first`로 바꾸면 배포해도 사용자에게 반영 안 됨
3. **API 요청은 절대 캐시하지 말 것**
   - `if (request.url.includes('/api/')) return;` 라인 유지
4. **가능하면 sw.js를 건드리지 말 것**
   - 잘못된 sw.js가 배포되면 최대 24시간 동안 사용자 브라우저에 캐시됨
   - 일반 HTML/CSS/JS 수정은 sw.js와 무관하게 정상 반영됨

### 비상 복구 (킬스위치)

sw.js에 문제가 생겼을 때 사용자 브라우저에서 서비스 워커를 해제하는 방법:

```
https://tkfb.technicalkorea.net/pages/dashboard.html?sw-kill
```

이 URL로 접속하면:
- 등록된 서비스 워커 모두 해제
- 캐시 스토리지 전체 삭제
- 페이지 자동 새로고침

### 일반 배포 시

- HTML/CSS/JS 파일 수정 → **sw.js 수정 불필요** (network-first라 항상 최신 파일 가져옴)
- Cloudflare 캐시 제거 → 정상 반영됨
- 버전 파라미터 변경 (`?v=5` → `?v=6`) → 브라우저 캐시도 우회

### Cloudflare 캐시와 관계

| 상황 | 동작 |
|------|------|
| CF 캐시 제거 + 일반 파일 수정 | 즉시 반영 (network-first) |
| CF 캐시 제거 + sw.js 수정 | 최대 24시간 후 반영 (브라우저 SW 갱신 주기) |
| 네트워크 끊김 | 이전 방문 페이지만 캐시에서 제공 |
| ?sw-kill 사용 | SW + 캐시 전체 삭제, 원래 웹사이트로 동작 |

## 홈 화면 추가 방법

### iPhone (iOS Safari)
1. Safari에서 tkfb.technicalkorea.net 접속
2. 하단 공유 버튼 (□↑) 탭
3. "홈 화면에 추가" 선택
4. "추가" 탭

### Android (Chrome)
1. Chrome에서 tkfb.technicalkorea.net 접속
2. 자동으로 "홈 화면에 추가" 배너 표시 (또는 메뉴 → "앱 설치")
3. "설치" 탭

## 알려진 제한사항

- **iOS**: tkreport, tkqc 외부 링크 클릭 시 Safari가 별도로 열림 (PWA 한계)
- **iOS**: 백그라운드 동기화 미지원
- **전체**: 완전한 오프라인 지원은 아님 (network-first 전략)
