diff --git a/.idea/copilotDiffState.xml b/.idea/copilotDiffState.xml
deleted file mode 100644
index 0a9807a..0000000
--- a/.idea/copilotDiffState.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index f139c55..081b5f1 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,13 +4,8 @@
-
+
-
-
-
-
-
@@ -31,33 +26,35 @@
- {
+ "keyToString": {
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
+ "RunOnceActivity.git.unshallow": "true",
+ "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultAutoModeForALLUsers.v1": "true",
+ "com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
+ "git-widget-placeholder": "master",
+ "ignore.virus.scanning.warn.message": "true",
+ "junie.onboarding.icon.badge.shown": "true",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "C:/gitea/taisai-svelte",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "pnpm",
+ "npm.build.executor": "Run",
+ "npm.db:push.executor": "Run",
+ "npm.dev.executor": "Run",
+ "prettierjs.PrettierConfiguration.Package": "C:\\gitea\\taisai-svelte\\node_modules\\prettier",
+ "settings.editor.selected.configurable": "com.github.copilot.settings.customization.CustomizationConfigurable",
+ "to.speed.mode.migration.done": "true",
+ "ts.external.directory.path": "C:\\giteat\\taisai-svelte\\node_modules\\typescript\\lib",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -133,13 +130,29 @@
1763044396291
-
+
+
+
+
+
+
+ 1763079503671
+
+
+
+ 1763079503671
+
+
+
+
+
+
diff --git a/GZIP_GUIDE.md b/GZIP_GUIDE.md
new file mode 100644
index 0000000..e92f497
--- /dev/null
+++ b/GZIP_GUIDE.md
@@ -0,0 +1,104 @@
+# Gzip 압축 테스트 가이드
+
+## 빌드 및 Preview 명령어
+
+### 1. 빌드 (gzip 파일 생성)
+```bash
+pnpm build
+```
+- 원본 파일과 `.gz` 파일이 함께 생성됩니다
+- 1KB 이상의 JS, CSS 파일만 압축됩니다
+
+### 2. Preview 서버
+
+#### 일반 Preview (gzip 미지원)
+```bash
+pnpm preview
+```
+- Vite 기본 preview 서버
+- `.gz` 파일을 제공하지 않음
+- 원본 파일만 제공
+
+#### Gzip Preview (gzip 지원) ⭐
+```bash
+pnpm preview:gzip
+```
+- Express 기반 커스텀 서버
+- `.gz` 파일을 우선적으로 제공
+- 브라우저가 `Accept-Encoding: gzip`을 보내면 자동으로 `.gz` 파일 제공
+- `http://localhost:4173`에서 실행
+
+## Gzip 압축 확인 방법
+
+### 방법 1: 브라우저 개발자 도구 (권장)
+
+1. `pnpm preview:gzip` 실행
+2. 브라우저에서 `http://localhost:4173` 접속
+3. F12 (개발자 도구) → **Network** 탭
+4. 페이지 새로고침 (Ctrl+R 또는 F5)
+5. JS/CSS 파일 클릭
+6. **Headers** 탭에서 확인:
+ - **Response Headers**에 `Content-Encoding: gzip` 있으면 성공 ✅
+ - **Size** 열에서 `transferred` vs `resource` 크기 비교
+
+### 방법 2: curl 명령어
+
+```bash
+# Windows PowerShell
+curl -H "Accept-Encoding: gzip" -I http://localhost:4173/_app/immutable/chunks/ChUbo8MR.js
+
+# 출력에서 "Content-Encoding: gzip" 확인
+```
+
+### 방법 3: 파일 직접 확인
+
+```bash
+# .svelte-kit/output/client/_app/immutable/chunks 폴더에서
+# 원본 파일과 .gz 파일이 함께 존재하는지 확인
+
+dir .svelte-kit\output\client\_app\immutable\chunks\*.gz
+```
+
+## 예상 압축률
+
+| 파일 타입 | 원본 크기 | 압축 크기 | 압축률 |
+|----------|---------|---------|--------|
+| CSS | 117 KB | 18 KB | 84% |
+| JS (Large)| 36 KB | 12 KB | 67% |
+| JS (Small)| 3.5 KB | 1.5 KB | 58% |
+
+## 주의사항
+
+1. **`pnpm preview`는 gzip을 지원하지 않습니다**
+ - 반드시 `pnpm preview:gzip` 사용
+
+2. **프로덕션 배포 시**
+ - Nginx, Apache 등 웹 서버에서 gzip 설정 필요
+ - Vercel, Netlify 등은 자동으로 처리
+
+3. **이미 압축된 파일은 효과 없음**
+ - 이미지(PNG, JPEG), 비디오 파일은 추가 압축 효과 없음
+
+## 설정 파일
+
+### vite.config.ts
+- `vite-plugin-compression`: 빌드 시 `.gz` 파일 생성
+- `threshold: 1024`: 1KB 이상 파일만 압축
+
+### preview-gzip.js
+- Express 기반 커스텀 preview 서버
+- `express-static-gzip`으로 `.gz` 파일 우선 제공
+
+## 트러블슈팅
+
+### Q: Network 탭에 `Content-Encoding: gzip`이 없어요
+- `pnpm preview` 대신 `pnpm preview:gzip` 사용
+- 브라우저 캐시 삭제 후 재시도 (Ctrl+Shift+R)
+
+### Q: 파일 크기가 줄어들지 않아요
+- Network 탭에서 **transferred** 크기 확인
+- **resource** 크기는 압축 해제 후 크기 (변하지 않음)
+
+### Q: 특정 파일만 압축하고 싶어요
+- `vite.config.ts`에서 `filter` 옵션 추가 가능
+
diff --git a/preview-gzip.js b/preview-gzip.js
new file mode 100644
index 0000000..a98a995
--- /dev/null
+++ b/preview-gzip.js
@@ -0,0 +1,33 @@
+import express from 'express';
+import expressStaticGzip from 'express-static-gzip';
+import { fileURLToPath } from 'url';
+import { dirname, join } from 'path';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const app = express();
+const port = 4173;
+
+// gzip 압축 파일을 우선적으로 제공
+app.use(
+ '/',
+ expressStaticGzip(join(__dirname, '.svelte-kit/output/client'), {
+ enableBrotli: false,
+ orderPreference: ['gz'],
+ serveStatic: {
+ maxAge: '1d',
+ setHeaders: (res, path) => {
+ if (path.endsWith('.html')) {
+ res.setHeader('Cache-Control', 'public, max-age=0');
+ }
+ }
+ }
+ })
+);
+
+app.listen(port, () => {
+ console.log(`\n ➜ Preview server with gzip: http://localhost:${port}/`);
+ console.log(` ➜ Press Ctrl+C to stop\n`);
+});
+