diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..338c29de
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# 기계 생성 잠금 파일. GitHub PR diff에서 기본 접힘 처리한다.
+package-lock.json linguist-generated=true
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..697ec40a
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,16 @@
+## Key changes
+
+-
+
+### Additional changes
+
+-
+
+## Tests completed
+
+-
+
+## Notes
+
+- Base branch:
+- Merge order:
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000..b5812ccf
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,58 @@
+# NOTE Astro 를 빌드해 GitHub Pages 로 올린다
+# - 저장소 설정 Pages -> Source 가 "GitHub Actions" 여야 동작한다
+# - 이미지가 586MB 라 체크아웃과 업로드가 느리다. 타임아웃을 넉넉히 둔다
+name: Deploy
+
+on:
+ push:
+ branches: [main]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# 배포는 한 번에 하나만 돈다. 진행 중인 배포는 끝까지 보낸다
+# - 중간에 끊으면 Pages 가 반쯤 올라간 상태로 남을 수 있다
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ env:
+ # 한글 파일명이 깨지지 않도록 로케일을 고정한다 [로케일 고정]
+ LC_ALL: en_US.UTF-8
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: .nvmrc
+ cache: npm
+
+ - run: npm ci
+
+ # 빌드 전에 막는다. 배포한 뒤 깨진 것을 발견하면 늦다
+ - run: npm run lint
+ - run: npm run check
+
+ - run: npm run build
+
+ - uses: actions/upload-pages-artifact@v3
+ with:
+ path: dist
+
+ deploy:
+ needs: build
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index fa03d7cc..357ae9eb 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,17 @@
-.sass-cache/*
-.DS_Store
-_site/*
-.jekyll-cache/*
+# Astro
+dist/
+.astro/
+node_modules/
+
+# Jekyll (Phase 5 컷오버까지 유지)
+_site/
+.jekyll-cache/
.jekyll-metadata
-*.xml
+.sass-cache/
+
+# 작업 메모. 공개 저장소에 둘 내용이 아니다
+docs/
+
+# OS / IDE
+.DS_Store
.idea/
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 00000000..2bd5a0a9
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+22
diff --git a/README.md b/README.md
index c75c1912..b395d8c5 100755
--- a/README.md
+++ b/README.md
@@ -1,87 +1,66 @@
- {subtitle}
+# devfancy.github.io
-> 📌 The template is based on the [Github Blog Template](https://github.com/Gaohaoyang/gaohaoyang.github.io) created by [HyG](https://github.com/gaohaoyang).
+[Astro](https://astro.build) 로 만든 개인 블로그입니다. 글은 https://devfancy.github.io 에서 볼 수 있습니다.
-For the Korean version of the template, I referred to the [Github Blog Template](https://github.com/goodGid/goodGid.github.io) by [Gid](https://github.com/goodGid).
+## 로컬에서 실행하기
-### Writing Commit Messages
+Node 버전은 `.nvmrc` 를 따릅니다.
-* When **creating a new post** for the first time, write the commit message as `Write {Category} Post " {Title} "`.
-
- * Example: If the category is `DevHistory` and the title is "2024 Dev History",
-
- * the commit message should be written as `Write DevHistory Post " 2024 Dev History "`.
-
-* If you are **updating an existing post**, write the commit message as `Update {Category} Post " {Title}`.
+```bash
+nvm use
+npm ci
+npm run dev # http://localhost:4321
+```
-### How to Add or Modify Categories
+| 명령 | 하는 일 |
+| --- | --- |
+| `npm run dev` | 개발 서버 |
+| `npm run build` | `dist/` 로 정적 빌드 |
+| `npm run preview` | 빌드 결과 미리보기 |
+| `npm run check` | `astro check` 타입 검사 |
+| `npm run lint` | Biome 검사 |
+| `npm run format` | Biome 자동 수정 |
-> Unlike the original template, which generates category order randomly, I have opted for a manual addition/modification approach.
+> 로케일이 `C` 면 한글 파일명에서 인코딩 오류가 납니다. CI 는 `LC_ALL=en_US.UTF-8` 을 고정해 두었습니다.
-* Add the desired categories to the `categories_order` section in the `_config.yml` file.
+## 글 쓰기
-* As of (2024.12.22), the **current setup** is as follows:
+글은 `src/content/posts/*.md` 에 둡니다. **파일명이 곧 URL** 입니다.
+`src/content/posts/Spring-Transaction.md` → `/Spring-Transaction/`
```yaml
-categories_order:
- - "DevHistory"
- - "TechInsight"
- - "Java"
- - "Spring"
- - "SpringBoot"
- - "JPA"
- - "MySQL"
- - "Flyway"
- - "Technology"
- # More categories...
+---
+title: "제목"
+date: 2026-09-21
+categories: ["서버"]
+tags: ["Spring", "JPA"]
+use_math: true # 수식이 있을 때만
+---
```
-### How to Run Locally
-
-* Follow these steps to set up and run the project on your local machine:
+- `categories` 는 한 편에 하나입니다. 쓸 수 있는 값은 `src/config.ts` 의 `CATEGORY_GROUPS` 에 있습니다
+- 태그 노출 순서는 같은 파일의 `TAG_ORDER` 가 정합니다
+- 이미지는 `public/assets/img/` 아래에 두고 `/assets/img/...` 로 참조합니다
-#### 1. Install Bundler
+## 폴더 구조
-* Run the following command to install the specified version of Bundler.
-
-```bash
-$ sudo gem install bundler:2.1.4
```
-
-#### 2. Install Dependencies and Start the Server
-
-* Use the following commands to install all dependencies and start the Jekyll server.
-
-```bash
-$ bundle install
-$ bundle exec jekyll serve
+src/
+ components/ Hero, Header, Chip 같은 공용 조각
+ layouts/ Base.astro — 모든 페이지의 껍데기
+ pages/ 라우트. [...slug].astro 가 글 상세를 만든다
+ content/ posts/ 아래 마크다운
+ styles/ global.css — 색 토큰과 .prose 본문 스타일
+ config.ts 사이트 정보, 네비, 카테고리·태그 순서
+public/assets/img/ 글 본문 이미지
```
-#### 3. Expected Output
-
-* Upon successful execution, you should see output similar to the following
-
-```bash
-$ bundle exec jekyll serve
-
-Configuration file: /path/to/_config.yml
- Source: /path/to/source
- Destination: /path/to/_site
- Incremental build: disabled. Enable with --incremental
- Generating...
- Jekyll Feed: Generating feed for posts
- Conflict: The following destination is shared by multiple files.
- - /path/to/_site/example.html
- - /path/to/_posts/example.md
- ...
- done in X.XXX seconds.
- Auto-regeneration: enabled for '/path/to/project'
- Server address: http://127.0.0.1:4000/
- Server running... press ctrl-c to stop.
-```
+## 배포
-#### 4. Access the Local Server
+`main` 에 푸시되면 `.github/workflows/deploy.yml` 이 GitHub Pages 로 배포합니다.
+저장소 설정의 Pages → Source 는 **GitHub Actions** 여야 합니다.
-* Open your browser and navigate to: `http://127.0.0.1:4000`
+---
-
\ No newline at end of file
+Jekyll 판은 [HyG](https://github.com/gaohaoyang) 의 [템플릿](https://github.com/Gaohaoyang/gaohaoyang.github.io) 과
+[Gid](https://github.com/goodGid) 의 [한국어 판](https://github.com/goodGid/goodGid.github.io) 을 바탕으로 했습니다.
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 00000000..139a712b
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,25 @@
+import { unified } from "@astrojs/markdown-remark";
+import sitemap from "@astrojs/sitemap";
+import tailwindcss from "@tailwindcss/vite";
+import { defineConfig } from "astro/config";
+import rehypeKatex from "rehype-katex";
+import remarkMath from "remark-math";
+
+export default defineConfig({
+ // NOTE: 이 세 줄이 URL 1:1 보존의 전부다. 바꾸지 말 것 (MIGRATION.md 2-2)
+ site: "https://devfancy.github.io",
+ trailingSlash: "always",
+ build: { format: "directory" },
+
+ integrations: [sitemap()],
+
+ markdown: {
+ // NOTE: 수식은 전역 적용된다. 프론트매터로 끌 수 없다 [수식 전역 적용]
+ processor: unified({
+ remarkPlugins: [remarkMath],
+ rehypePlugins: [[rehypeKatex, { throwOnError: false }]],
+ }),
+ },
+
+ vite: { plugins: [tailwindcss()] },
+});
diff --git a/biome.json b/biome.json
new file mode 100644
index 00000000..a2ed9c4a
--- /dev/null
+++ b/biome.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
+ "files": { "includes": ["src/**/*.ts", "astro.config.mjs"] },
+ "formatter": { "indentStyle": "space", "indentWidth": 2, "lineWidth": 100 },
+ "linter": { "enabled": true, "rules": { "preset": "recommended" } }
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..7d2082ab
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,8239 @@
+{
+ "name": "devfancy-blog",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "devfancy-blog",
+ "dependencies": {
+ "@astrojs/markdown-remark": "^7.3.1",
+ "@astrojs/sitemap": "^3.7.4",
+ "@tailwindcss/vite": "^4.3.3",
+ "astro": "^7.3.3",
+ "katex": "^0.18.7",
+ "rehype-katex": "^7.0.1",
+ "remark-math": "^6.0.0",
+ "tailwindcss": "^4.3.3"
+ },
+ "devDependencies": {
+ "@astrojs/check": "^0.9.10",
+ "@astrojs/rss": "^4.0.19",
+ "@biomejs/biome": "^2.5.14",
+ "typescript": "^5.9.3"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/astro2tsx": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/astro2tsx/-/astro2tsx-0.1.0.tgz",
+ "integrity": "sha512-tgprkax8mcF+BiHJQBdoQ+REqtvvnLlYzV0yCeLMdcv3pJIutdlinWNHUzN1jMOT5VRlYTtMmDdaoPrtd3cBAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emnapi/core": "1.11.3",
+ "@napi-rs/wasm-runtime": "1.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/check": {
+ "version": "0.9.10",
+ "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.10.tgz",
+ "integrity": "sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/language-server": "^2.16.7",
+ "chokidar": "^4.0.3",
+ "kleur": "^4.1.5",
+ "yargs": "^18.0.0"
+ },
+ "bin": {
+ "astro-check": "bin/astro-check.js"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@astrojs/check/node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@astrojs/check/node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.4.1.tgz",
+ "integrity": "sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@astrojs/compiler-binding-android-arm64": "0.4.1",
+ "@astrojs/compiler-binding-darwin-arm64": "0.4.1",
+ "@astrojs/compiler-binding-darwin-x64": "0.4.1",
+ "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.1",
+ "@astrojs/compiler-binding-linux-arm64-musl": "0.4.1",
+ "@astrojs/compiler-binding-linux-x64-gnu": "0.4.1",
+ "@astrojs/compiler-binding-linux-x64-musl": "0.4.1",
+ "@astrojs/compiler-binding-wasm32-wasi": "0.4.1",
+ "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.1",
+ "@astrojs/compiler-binding-win32-x64-msvc": "0.4.1"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-android-arm64": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-android-arm64/-/compiler-binding-android-arm64-0.4.1.tgz",
+ "integrity": "sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-darwin-arm64": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.4.1.tgz",
+ "integrity": "sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-darwin-x64": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.4.1.tgz",
+ "integrity": "sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.4.1.tgz",
+ "integrity": "sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-linux-arm64-musl": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.4.1.tgz",
+ "integrity": "sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-linux-x64-gnu": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.4.1.tgz",
+ "integrity": "sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-linux-x64-musl": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.4.1.tgz",
+ "integrity": "sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-wasm32-wasi": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.4.1.tgz",
+ "integrity": "sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.4.1.tgz",
+ "integrity": "sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-binding-win32-x64-msvc": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.4.1.tgz",
+ "integrity": "sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/compiler-rs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.4.1.tgz",
+ "integrity": "sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/compiler-binding": "0.4.1"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/internal-helpers": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.11.0.tgz",
+ "integrity": "sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.4",
+ "@types/mdast": "^4.0.4",
+ "js-yaml": "^4.3.0",
+ "picomatch": "^4.0.4",
+ "retext-smartypants": "^6.2.0",
+ "shiki": "^4.0.2",
+ "smol-toml": "^1.6.0",
+ "unified": "^11.0.5"
+ }
+ },
+ "node_modules/@astrojs/language-server": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.17.0.tgz",
+ "integrity": "sha512-ZvT7UEo7/jBdfjXD3nNYssziEezNKM8G6FUYRnGUidAs7FmowqsQhQ0Xwl5Q4tjqlOjhnpxQuoEb4jwESL+nKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/astro2tsx": "^0.1.0",
+ "@astrojs/yaml2ts": "^0.2.4",
+ "@volar/kit": "~2.4.28",
+ "@volar/language-core": "~2.4.28",
+ "@volar/language-server": "~2.4.28",
+ "@volar/language-service": "~2.4.28",
+ "muggle-string": "^0.4.1",
+ "tinyglobby": "^0.2.16",
+ "volar-service-css": "0.0.71",
+ "volar-service-emmet": "0.0.71",
+ "volar-service-html": "0.0.71",
+ "volar-service-prettier": "0.0.71",
+ "volar-service-typescript": "0.0.71",
+ "volar-service-typescript-twoslash-queries": "0.0.71",
+ "volar-service-yaml": "0.0.71",
+ "vscode-html-languageservice": "^5.6.2",
+ "vscode-uri": "^3.1.0"
+ },
+ "bin": {
+ "astro-ls": "bin/nodeServer.js"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0",
+ "prettier-plugin-astro": ">=0.11.0"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@astrojs/markdown-remark": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.3.1.tgz",
+ "integrity": "sha512-QCjsjZQl0+Cgb91+T3Ip9hyUe1r5aLm4udi584rML9YO3syupbAYE+jWpAxYg+z4lFLNUugPrylFxZ+8qFTClg==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/internal-helpers": "0.11.0",
+ "@astrojs/prism": "4.0.2",
+ "@mdx-js/mdx": "^3.1.1",
+ "acorn": "^8.16.0",
+ "estree-util-visit": "^2.0.0",
+ "github-slugger": "^2.0.0",
+ "hast-util-from-html": "^2.0.3",
+ "hast-util-to-html": "^9.0.5",
+ "hast-util-to-text": "^4.0.2",
+ "mdast-util-definitions": "^6.0.0",
+ "rehype-raw": "^7.0.0",
+ "rehype-stringify": "^10.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.2",
+ "remark-smartypants": "^3.0.2",
+ "source-map": "^0.7.6",
+ "unified": "^11.0.5",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-visit": "^5.1.0",
+ "unist-util-visit-parents": "^6.0.2",
+ "vfile": "^6.0.3"
+ }
+ },
+ "node_modules/@astrojs/markdown-satteri": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.4.1.tgz",
+ "integrity": "sha512-EniHbFNa6SQHDih7JnpPos3NWXO6hdt4raBcOosfGmlfc3gP9CI/sESA3VOf1PgJZ7SFfewlZW9Livn0JugEZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/internal-helpers": "0.11.0",
+ "@astrojs/prism": "4.0.2",
+ "github-slugger": "^2.0.0",
+ "satteri": "^0.10.3"
+ }
+ },
+ "node_modules/@astrojs/prism": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz",
+ "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==",
+ "license": "MIT",
+ "dependencies": {
+ "prismjs": "^1.30.0"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/@astrojs/rss": {
+ "version": "4.0.19",
+ "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-4.0.19.tgz",
+ "integrity": "sha512-e+z5wYeYtffQdHQO8c2tkSd2JEBdAuRXJV4ZEU5IxkYeE6e39woDd7nw1PH1Kk2tEYNCYuKdylnnbhGmt61awA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-xml-parser": "^5.5.7",
+ "piccolore": "^0.1.3",
+ "zod": "^4.3.6"
+ }
+ },
+ "node_modules/@astrojs/sitemap": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.4.tgz",
+ "integrity": "sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==",
+ "license": "MIT",
+ "dependencies": {
+ "sitemap": "^9.0.0",
+ "zod": "^4.3.6"
+ }
+ },
+ "node_modules/@astrojs/telemetry": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz",
+ "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^4.4.0",
+ "dset": "^3.1.4",
+ "is-docker": "^4.0.0",
+ "package-manager-detector": "^1.6.0"
+ },
+ "engines": {
+ "node": "18.20.8 || ^20.3.0 || >=22.0.0"
+ }
+ },
+ "node_modules/@astrojs/yaml2ts": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz",
+ "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yaml": "^2.8.3"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@biomejs/biome": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.14.tgz",
+ "integrity": "sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==",
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "bin": {
+ "biome": "bin/biome"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/biome"
+ },
+ "optionalDependencies": {
+ "@biomejs/cli-darwin-arm64": "2.5.14",
+ "@biomejs/cli-darwin-x64": "2.5.14",
+ "@biomejs/cli-linux-arm64": "2.5.14",
+ "@biomejs/cli-linux-arm64-musl": "2.5.14",
+ "@biomejs/cli-linux-x64": "2.5.14",
+ "@biomejs/cli-linux-x64-musl": "2.5.14",
+ "@biomejs/cli-win32-arm64": "2.5.14",
+ "@biomejs/cli-win32-x64": "2.5.14"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-arm64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.14.tgz",
+ "integrity": "sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-x64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.14.tgz",
+ "integrity": "sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.14.tgz",
+ "integrity": "sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64-musl": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.14.tgz",
+ "integrity": "sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.14.tgz",
+ "integrity": "sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64-musl": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.14.tgz",
+ "integrity": "sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-arm64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.14.tgz",
+ "integrity": "sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-x64": {
+ "version": "2.5.14",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.14.tgz",
+ "integrity": "sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@bruits/satteri-darwin-arm64": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz",
+ "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@bruits/satteri-darwin-x64": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz",
+ "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@bruits/satteri-linux-arm64-gnu": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz",
+ "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@bruits/satteri-linux-arm64-musl": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz",
+ "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@bruits/satteri-linux-x64-gnu": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz",
+ "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@bruits/satteri-linux-x64-musl": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz",
+ "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@bruits/satteri-wasm32-wasi": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz",
+ "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.1",
+ "@emnapi/runtime": "1.11.1",
+ "@napi-rs/wasm-runtime": "^1.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@bruits/satteri-win32-arm64-msvc": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz",
+ "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@bruits/satteri-win32-x64-msvc": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz",
+ "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@capsizecss/unpack": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz",
+ "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@clack/core": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.5.1.tgz",
+ "integrity": "sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-wrap-ansi": "^0.2.0",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 20.12.0"
+ }
+ },
+ "node_modules/@clack/prompts": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.8.1.tgz",
+ "integrity": "sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@clack/core": "1.5.1",
+ "fast-string-width": "^3.0.2",
+ "fast-wrap-ansi": "^0.2.0",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 20.12.0"
+ }
+ },
+ "node_modules/@emmetio/abbreviation": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz",
+ "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emmetio/scanner": "^1.0.4"
+ }
+ },
+ "node_modules/@emmetio/css-abbreviation": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz",
+ "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emmetio/scanner": "^1.0.4"
+ }
+ },
+ "node_modules/@emmetio/css-parser": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz",
+ "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emmetio/stream-reader": "^2.2.0",
+ "@emmetio/stream-reader-utils": "^0.1.0"
+ }
+ },
+ "node_modules/@emmetio/html-matcher": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz",
+ "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@emmetio/scanner": "^1.0.0"
+ }
+ },
+ "node_modules/@emmetio/scanner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz",
+ "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@emmetio/stream-reader": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz",
+ "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@emmetio/stream-reader-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz",
+ "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz",
+ "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.3",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
+ "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz",
+ "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
+ "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
+ "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
+ "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
+ "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
+ "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
+ "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
+ "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
+ "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
+ "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
+ "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
+ "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
+ "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
+ "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
+ "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
+ "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
+ "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
+ "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
+ "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
+ "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
+ "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
+ "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz",
+ "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz",
+ "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-freebsd-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz",
+ "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz",
+ "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz",
+ "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz",
+ "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz",
+ "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz",
+ "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz",
+ "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz",
+ "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz",
+ "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz",
+ "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz",
+ "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz",
+ "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz",
+ "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz",
+ "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz",
+ "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz",
+ "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz",
+ "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz",
+ "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz",
+ "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz",
+ "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==",
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.11.3"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-webcontainers-wasm32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz",
+ "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/sharp-wasm32": "0.35.4"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz",
+ "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz",
+ "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz",
+ "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
+ "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdx": "^2.0.0",
+ "acorn": "^8.0.0",
+ "collapse-white-space": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-util-scope": "^1.0.0",
+ "estree-walker": "^3.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "markdown-extensions": "^2.0.0",
+ "recma-build-jsx": "^1.0.0",
+ "recma-jsx": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "rehype-recma": "^1.0.0",
+ "remark-mdx": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "source-map": "^0.7.0",
+ "unified": "^11.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz",
+ "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.3"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=23.5.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4",
+ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4"
+ }
+ },
+ "node_modules/@nodable/entities": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz",
+ "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodable"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@oslojs/encoding": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz",
+ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
+ "license": "MIT"
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.150.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz",
+ "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/oxc-project"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm-eabi": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz",
+ "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz",
+ "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz",
+ "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz",
+ "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz",
+ "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz",
+ "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz",
+ "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz",
+ "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz",
+ "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz",
+ "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz",
+ "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz",
+ "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz",
+ "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz",
+ "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz",
+ "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "license": "MIT"
+ },
+ "node_modules/@shikijs/core": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz",
+ "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/primitive": "4.4.3",
+ "@shikijs/types": "4.4.3",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5",
+ "hast-util-to-html": "^9.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz",
+ "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.3",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.6"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz",
+ "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.3",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz",
+ "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/primitive": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz",
+ "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.3",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz",
+ "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.4.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz",
+ "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
+ "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.24.1",
+ "jiti": "^2.7.0",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
+ "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-x64": "4.3.3",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.3",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
+ "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
+ "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
+ "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
+ "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
+ "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
+ "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
+ "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
+ "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
+ "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
+ "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.11.1",
+ "@emnapi/runtime": "^1.11.1",
+ "@emnapi/wasi-threads": "^1.2.2",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
+ "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
+ "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
+ "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "tailwindcss": "4.3.3"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz",
+ "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/katex": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz",
+ "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
+ "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/nlcst": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz",
+ "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.13.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.6.tgz",
+ "integrity": "sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/@types/sax": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
+ "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "license": "ISC"
+ },
+ "node_modules/@volar/kit": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.28.tgz",
+ "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-service": "2.4.28",
+ "@volar/typescript": "2.4.28",
+ "typesafe-path": "^0.2.2",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
+ "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/source-map": "2.4.28"
+ }
+ },
+ "node_modules/@volar/language-server": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz",
+ "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.28",
+ "@volar/language-service": "2.4.28",
+ "@volar/typescript": "2.4.28",
+ "path-browserify": "^1.0.1",
+ "request-light": "^0.7.0",
+ "vscode-languageserver": "^9.0.1",
+ "vscode-languageserver-protocol": "^3.17.5",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@volar/language-service": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz",
+ "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.28",
+ "vscode-languageserver-protocol": "^3.17.5",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
+ "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@volar/typescript": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz",
+ "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.28",
+ "path-browserify": "^1.0.1",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@vscode/emmet-helper": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz",
+ "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emmet": "^2.4.3",
+ "jsonc-parser": "^2.3.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-languageserver-types": "^3.15.1",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
+ "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vscode/l10n": {
+ "version": "0.0.18",
+ "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz",
+ "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-draft-04": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
+ "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.5.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-i18n": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-4.2.0.tgz",
+ "integrity": "sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^8.0.0-beta.0"
+ }
+ },
+ "node_modules/am-i-vibing": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz",
+ "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==",
+ "license": "MIT",
+ "dependencies": {
+ "process-ancestry": "^0.1.0"
+ },
+ "bin": {
+ "am-i-vibing": "dist/cli.mjs"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-iterate": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz",
+ "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/astring": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz",
+ "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==",
+ "license": "MIT",
+ "bin": {
+ "astring": "bin/astring"
+ }
+ },
+ "node_modules/astro": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/astro/-/astro-7.3.3.tgz",
+ "integrity": "sha512-NF08hk3edFkVmr9avf9HW/rQyf6NrpbVDyYj2cVN3JfijDhfJYh1ivWVTY5PUd5+rRZn/Vtu4iaeyNlP0Iv6mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@astrojs/compiler-rs": "^0.4.0",
+ "@astrojs/internal-helpers": "0.11.0",
+ "@astrojs/markdown-satteri": "0.4.1",
+ "@astrojs/telemetry": "3.3.3",
+ "@capsizecss/unpack": "^4.0.0",
+ "@clack/prompts": "^1.1.0",
+ "@oslojs/encoding": "^1.1.0",
+ "am-i-vibing": "^0.4.0",
+ "aria-query": "^5.3.2",
+ "axobject-query": "^4.1.0",
+ "ci-info": "^4.4.0",
+ "clsx": "^2.1.1",
+ "common-ancestor-path": "^2.0.0",
+ "cookie": "^2.0.1",
+ "devalue": "^5.8.1",
+ "diff": "^9.0.0",
+ "dset": "^3.1.4",
+ "es-module-lexer": "^2.0.0",
+ "esbuild": "^0.28.0",
+ "find-proc": "0.2.0",
+ "flattie": "^1.1.1",
+ "fontace": "~0.4.1",
+ "get-tsconfig": "5.0.0-beta.4",
+ "github-slugger": "^2.0.0",
+ "html-escaper": "3.0.3",
+ "http-cache-semantics": "^4.2.0",
+ "js-yaml": "^4.3.0",
+ "jsonc-parser": "^3.3.1",
+ "magic-string": "^1.0.0",
+ "magicast": "^0.5.2",
+ "mrmime": "^2.0.1",
+ "neotraverse": "^1.0.1",
+ "obug": "^2.1.1",
+ "p-limit": "^7.3.0",
+ "p-queue": "^9.1.0",
+ "package-manager-detector": "^1.6.0",
+ "piccolore": "^0.1.3",
+ "picomatch": "^4.0.4",
+ "shiki": "^4.0.2",
+ "smol-toml": "^1.6.0",
+ "svgo": "^4.0.2",
+ "tinyclip": "^0.1.12",
+ "tinyexec": "^1.0.4",
+ "tinyglobby": "^0.2.15",
+ "ultrahtml": "^1.6.0",
+ "unifont": "~0.7.5",
+ "unstorage": "^1.17.5",
+ "verkit": "^0.4.0",
+ "vite": "^8.0.13",
+ "vitefu": "^1.1.2",
+ "xxhash-wasm": "^1.1.0",
+ "yargs-parser": "^22.0.0",
+ "zod": "^4.5.4"
+ },
+ "bin": {
+ "astro": "bin/astro.mjs"
+ },
+ "engines": {
+ "node": ">=22.12.0",
+ "npm": ">=9.6.5",
+ "pnpm": ">=7.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/astrodotbuild"
+ },
+ "optionalDependencies": {
+ "sharp": "^0.35.4"
+ },
+ "peerDependencies": {
+ "@astrojs/markdown-remark": "^7.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@astrojs/markdown-remark": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/astro/node_modules/magic-string": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz",
+ "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.6.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
+ "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz",
+ "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/common-ancestor-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-2.0.0.tgz",
+ "integrity": "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz",
+ "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cookie-es": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
+ "license": "MIT"
+ },
+ "node_modules/crossws": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz",
+ "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==",
+ "license": "MIT",
+ "dependencies": {
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz",
+ "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^7.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "nth-check": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.27.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz",
+ "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "license": "MIT"
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.9.4",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.4.tgz",
+ "integrity": "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/diff": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz",
+ "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dset": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/emmet": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz",
+ "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==",
+ "dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "./packages/scanner",
+ "./packages/abbreviation",
+ "./packages/css-abbreviation",
+ "./"
+ ],
+ "dependencies": {
+ "@emmetio/abbreviation": "^2.3.3",
+ "@emmetio/css-abbreviation": "^2.1.8"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.25.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz",
+ "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz",
+ "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==",
+ "license": "MIT"
+ },
+ "node_modules/esast-util-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz",
+ "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esast-util-from-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz",
+ "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "acorn": "^8.0.0",
+ "esast-util-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
+ "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.28.2",
+ "@esbuild/android-arm": "0.28.2",
+ "@esbuild/android-arm64": "0.28.2",
+ "@esbuild/android-x64": "0.28.2",
+ "@esbuild/darwin-arm64": "0.28.2",
+ "@esbuild/darwin-x64": "0.28.2",
+ "@esbuild/freebsd-arm64": "0.28.2",
+ "@esbuild/freebsd-x64": "0.28.2",
+ "@esbuild/linux-arm": "0.28.2",
+ "@esbuild/linux-arm64": "0.28.2",
+ "@esbuild/linux-ia32": "0.28.2",
+ "@esbuild/linux-loong64": "0.28.2",
+ "@esbuild/linux-mips64el": "0.28.2",
+ "@esbuild/linux-ppc64": "0.28.2",
+ "@esbuild/linux-riscv64": "0.28.2",
+ "@esbuild/linux-s390x": "0.28.2",
+ "@esbuild/linux-x64": "0.28.2",
+ "@esbuild/netbsd-arm64": "0.28.2",
+ "@esbuild/netbsd-x64": "0.28.2",
+ "@esbuild/openbsd-arm64": "0.28.2",
+ "@esbuild/openbsd-x64": "0.28.2",
+ "@esbuild/openharmony-arm64": "0.28.2",
+ "@esbuild/sunos-x64": "0.28.2",
+ "@esbuild/win32-arm64": "0.28.2",
+ "@esbuild/win32-ia32": "0.28.2",
+ "@esbuild/win32-x64": "0.28.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-attach-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
+ "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-build-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
+ "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "estree-walker": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-scope": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.1.tgz",
+ "integrity": "sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-to-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
+ "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "astring": "^1.8.0",
+ "source-map": "^0.7.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-util-visit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
+ "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "license": "MIT"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-string-width": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-truncated-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-string-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz",
+ "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.6.2",
+ "xml-naming": "^0.3.0"
+ }
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.1.tgz",
+ "integrity": "sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@nodable/entities": "^3.0.0",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^2.0.0",
+ "path-expression-matcher": "^1.6.2",
+ "strnum": "^2.4.2",
+ "xml-naming": "^0.3.0"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/find-proc": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/find-proc/-/find-proc-0.2.0.tgz",
+ "integrity": "sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/flattie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
+ "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fontace": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz",
+ "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==",
+ "license": "MIT",
+ "dependencies": {
+ "fontkitten": "^1.0.2"
+ }
+ },
+ "node_modules/fontkitten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.3.tgz",
+ "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==",
+ "license": "MIT",
+ "dependencies": {
+ "tiny-inflate": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz",
+ "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "5.0.0-beta.4",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz",
+ "integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20.20.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
+ "license": "ISC"
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/h3": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie-es": "^1.2.3",
+ "crossws": "^0.3.5",
+ "defu": "^6.1.6",
+ "destr": "^2.0.5",
+ "iron-webcrypto": "^1.2.1",
+ "node-mock-http": "^1.0.4",
+ "radix3": "^1.1.2",
+ "ufo": "^1.6.3",
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/hast-util-from-dom": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz",
+ "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==",
+ "license": "ISC",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hastscript": "^9.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
+ "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.1.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "parse5": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-html-isomorphic": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz",
+ "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-from-dom": "^5.0.0",
+ "hast-util-from-html": "^2.0.0",
+ "unist-util-remove-position": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-estree": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz",
+ "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-attach-comments": "^3.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz",
+ "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
+ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==",
+ "license": "MIT"
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "license": "MIT"
+ },
+ "node_modules/iron-webcrypto": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
+ "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/brc-dd"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz",
+ "integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-unsafe": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz",
+ "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "license": "MIT"
+ },
+ "node_modules/katex": {
+ "version": "0.18.7",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.18.7.tgz",
+ "integrity": "sha512-h+UCwkZ+4Jz8WQ7MLGfj7UVFrRCizGb912fwF4luGdYsC5paYG1vx+jy+KRcC/XkpjGva/P7nAWuxNnPzRvzHw==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^15.0.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "11.5.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz",
+ "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz",
+ "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/markdown-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
+ "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-definitions": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz",
+ "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
+ "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
+ "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
+ "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-math": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz",
+ "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.1.0",
+ "unist-util-remove-position": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
+ "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.27.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/micromark": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz",
+ "integrity": "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-math": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz",
+ "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/katex": "^0.16.0",
+ "devlop": "^1.0.0",
+ "katex": "^0.16.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-math/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/micromark-extension-math/node_modules/katex": {
+ "version": "0.16.47",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",
+ "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/micromark-extension-mdx-expression": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz",
+ "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-mdx-jsx": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz",
+ "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "micromark-factory-mdx-expression": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdx-md": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
+ "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
+ "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.0.0",
+ "acorn-jsx": "^5.0.0",
+ "micromark-extension-mdx-expression": "^3.0.0",
+ "micromark-extension-mdx-jsx": "^3.0.0",
+ "micromark-extension-mdx-md": "^2.0.0",
+ "micromark-extension-mdxjs-esm": "^3.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-mdxjs-esm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
+ "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-mdx-expression": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz",
+ "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-events-to-acorn": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-position-from-estree": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-events-to-acorn": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz",
+ "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-visit": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "vfile-message": "^4.0.0"
+ }
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/muggle-string": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
+ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
+ "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/neotraverse": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz",
+ "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/nlcst-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz",
+ "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
+ "license": "MIT"
+ },
+ "node_modules/node-mock-http": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz",
+ "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz",
+ "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==",
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/ofetch": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
+ "license": "MIT",
+ "dependencies": {
+ "destr": "^2.0.5",
+ "node-fetch-native": "^1.6.7",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz",
+ "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.3.tgz",
+ "integrity": "sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-queue": {
+ "version": "9.3.3",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz",
+ "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^5.0.4",
+ "p-timeout": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.2.tgz",
+ "integrity": "sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",
+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",
+ "license": "MIT"
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-latin": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
+ "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "@types/unist": "^3.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-modify-children": "^4.0.0",
+ "unist-util-visit-children": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-expression-matcher": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz",
+ "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/piccolore": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
+ "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==",
+ "license": "ISC"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.28",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+ "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.18",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.9.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz",
+ "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/process-ancestry": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz",
+ "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/radix3": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
+ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recma-build-jsx": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz",
+ "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-build-jsx": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-jsx": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz",
+ "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn-jsx": "^5.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "recma-parse": "^1.0.0",
+ "recma-stringify": "^1.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/recma-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz",
+ "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "esast-util-from-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/recma-stringify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz",
+ "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-util-to-js": "^2.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "license": "MIT"
+ },
+ "node_modules/rehype-katex": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz",
+ "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/katex": "^0.16.0",
+ "hast-util-from-html-isomorphic": "^2.0.0",
+ "hast-util-to-text": "^4.0.0",
+ "katex": "^0.16.0",
+ "unist-util-visit-parents": "^6.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-katex/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/rehype-katex/node_modules/katex": {
+ "version": "0.16.47",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",
+ "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-recma": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz",
+ "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "hast-util-to-estree": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-stringify": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz",
+ "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-to-html": "^9.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-math": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz",
+ "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-math": "^3.0.0",
+ "micromark-extension-math": "^3.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz",
+ "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-mdx": "^3.0.0",
+ "micromark-extension-mdxjs": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-smartypants": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz",
+ "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==",
+ "license": "MIT",
+ "dependencies": {
+ "retext": "^9.0.0",
+ "retext-smartypants": "^6.0.0",
+ "unified": "^11.0.4",
+ "unist-util-visit": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/request-light": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz",
+ "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/retext": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
+ "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "retext-latin": "^4.0.0",
+ "retext-stringify": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-latin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz",
+ "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "parse-latin": "^7.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-smartypants": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz",
+ "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/retext-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz",
+ "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/nlcst": "^2.0.0",
+ "nlcst-to-string": "^4.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz",
+ "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==",
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.150.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm-eabi": "1.2.9",
+ "@rolldown/binding-android-arm64": "1.2.9",
+ "@rolldown/binding-darwin-arm64": "1.2.9",
+ "@rolldown/binding-darwin-x64": "1.2.9",
+ "@rolldown/binding-freebsd-x64": "1.2.9",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.9",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.9",
+ "@rolldown/binding-linux-arm64-musl": "1.2.9",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.9",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.9",
+ "@rolldown/binding-linux-x64-gnu": "1.2.9",
+ "@rolldown/binding-linux-x64-musl": "1.2.9",
+ "@rolldown/binding-openharmony-arm64": "1.2.9",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.9",
+ "@rolldown/binding-win32-x64-msvc": "1.2.9"
+ }
+ },
+ "node_modules/satteri": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz",
+ "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.5",
+ "@types/hast": "^3.0.5",
+ "@types/mdast": "^4.0.4",
+ "@types/unist": "^3.0.3"
+ },
+ "optionalDependencies": {
+ "@bruits/satteri-darwin-arm64": "0.10.5",
+ "@bruits/satteri-darwin-x64": "0.10.5",
+ "@bruits/satteri-linux-arm64-gnu": "0.10.5",
+ "@bruits/satteri-linux-arm64-musl": "0.10.5",
+ "@bruits/satteri-linux-x64-gnu": "0.10.5",
+ "@bruits/satteri-linux-x64-musl": "0.10.5",
+ "@bruits/satteri-wasm32-wasi": "0.10.5",
+ "@bruits/satteri-win32-arm64-msvc": "0.10.5",
+ "@bruits/satteri-win32-x64-msvc": "0.10.5"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "devOptional": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.35.4",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz",
+ "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.1.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.8.5"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.35.4",
+ "@img/sharp-darwin-x64": "0.35.4",
+ "@img/sharp-freebsd-wasm32": "0.35.4",
+ "@img/sharp-libvips-darwin-arm64": "1.3.3",
+ "@img/sharp-libvips-darwin-x64": "1.3.3",
+ "@img/sharp-libvips-linux-arm": "1.3.3",
+ "@img/sharp-libvips-linux-arm64": "1.3.3",
+ "@img/sharp-libvips-linux-ppc64": "1.3.3",
+ "@img/sharp-libvips-linux-riscv64": "1.3.3",
+ "@img/sharp-libvips-linux-s390x": "1.3.3",
+ "@img/sharp-libvips-linux-x64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.3",
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.3",
+ "@img/sharp-linux-arm": "0.35.4",
+ "@img/sharp-linux-arm64": "0.35.4",
+ "@img/sharp-linux-ppc64": "0.35.4",
+ "@img/sharp-linux-riscv64": "0.35.4",
+ "@img/sharp-linux-s390x": "0.35.4",
+ "@img/sharp-linux-x64": "0.35.4",
+ "@img/sharp-linuxmusl-arm64": "0.35.4",
+ "@img/sharp-linuxmusl-x64": "0.35.4",
+ "@img/sharp-webcontainers-wasm32": "0.35.4",
+ "@img/sharp-win32-arm64": "0.35.4",
+ "@img/sharp-win32-ia32": "0.35.4",
+ "@img/sharp-win32-x64": "0.35.4"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/shiki": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz",
+ "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.4.3",
+ "@shikijs/engine-javascript": "4.4.3",
+ "@shikijs/engine-oniguruma": "4.4.3",
+ "@shikijs/langs": "4.4.3",
+ "@shikijs/themes": "4.4.3",
+ "@shikijs/types": "4.4.3",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sitemap": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz",
+ "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^24.9.2",
+ "@types/sax": "^1.2.1",
+ "arg": "^5.0.0",
+ "sax": "^1.4.1"
+ },
+ "bin": {
+ "sitemap": "dist/esm/cli.js"
+ },
+ "engines": {
+ "node": ">=20.19.5",
+ "npm": ">=10.8.2"
+ }
+ },
+ "node_modules/smol-toml": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz",
+ "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyyynthia"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz",
+ "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "anynum": "^1.0.1"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz",
+ "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^6.0.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^7.0.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "1.6.1"
+ },
+ "bin": {
+ "svgo": "bin/svgo.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
+ "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "license": "MIT"
+ },
+ "node_modules/tinyclip": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz",
+ "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >= 17.3.0"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",
+ "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "devOptional": true,
+ "license": "0BSD"
+ },
+ "node_modules/typesafe-path": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz",
+ "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-auto-import-cache": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz",
+ "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.8"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "license": "MIT"
+ },
+ "node_modules/ultrahtml": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz",
+ "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==",
+ "license": "MIT"
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
+ "license": "MIT"
+ },
+ "node_modules/undici": {
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.2.tgz",
+ "integrity": "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=22.19.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "license": "MIT"
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unifont": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz",
+ "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^3.1.0",
+ "ohash": "^2.0.11",
+ "undici": "^8.0.0"
+ }
+ },
+ "node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-modify-children": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz",
+ "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "array-iterate": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position-from-estree": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
+ "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-children": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz",
+ "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unstorage": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "^3.1.3",
+ "chokidar": "^5.0.0",
+ "destr": "^2.0.5",
+ "h3": "^1.15.10",
+ "lru-cache": "^11.2.7",
+ "node-fetch-native": "^1.6.7",
+ "ofetch": "^1.5.1",
+ "ufo": "^1.6.3"
+ },
+ "peerDependencies": {
+ "@azure/app-configuration": "^1.8.0",
+ "@azure/cosmos": "^4.2.0",
+ "@azure/data-tables": "^13.3.0",
+ "@azure/identity": "^4.6.0",
+ "@azure/keyvault-secrets": "^4.9.0",
+ "@azure/storage-blob": "^12.26.0",
+ "@capacitor/preferences": "^6 || ^7 || ^8",
+ "@deno/kv": ">=0.9.0",
+ "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0",
+ "@planetscale/database": "^1.19.0",
+ "@upstash/redis": "^1.34.3",
+ "@vercel/blob": ">=0.27.1",
+ "@vercel/functions": "^2.2.12 || ^3.0.0",
+ "@vercel/kv": "^1 || ^2 || ^3",
+ "aws4fetch": "^1.0.20",
+ "db0": ">=0.2.1",
+ "idb-keyval": "^6.2.1",
+ "ioredis": "^5.4.2",
+ "uploadthing": "^7.4.4"
+ },
+ "peerDependenciesMeta": {
+ "@azure/app-configuration": {
+ "optional": true
+ },
+ "@azure/cosmos": {
+ "optional": true
+ },
+ "@azure/data-tables": {
+ "optional": true
+ },
+ "@azure/identity": {
+ "optional": true
+ },
+ "@azure/keyvault-secrets": {
+ "optional": true
+ },
+ "@azure/storage-blob": {
+ "optional": true
+ },
+ "@capacitor/preferences": {
+ "optional": true
+ },
+ "@deno/kv": {
+ "optional": true
+ },
+ "@netlify/blobs": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@upstash/redis": {
+ "optional": true
+ },
+ "@vercel/blob": {
+ "optional": true
+ },
+ "@vercel/functions": {
+ "optional": true
+ },
+ "@vercel/kv": {
+ "optional": true
+ },
+ "aws4fetch": {
+ "optional": true
+ },
+ "db0": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "uploadthing": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/verkit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.4.1.tgz",
+ "integrity": "sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz",
+ "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.33.0",
+ "picomatch": "^4.0.7",
+ "postcss": "^8.5.28",
+ "rolldown": "~1.2.6",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.7.1",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
+ "license": "MIT",
+ "workspaces": [
+ "tests/deps/*",
+ "tests/projects/*",
+ "tests/projects/workspace/packages/*"
+ ],
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-css": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.71.tgz",
+ "integrity": "sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-css-languageservice": "^6.3.0",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-emmet": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.71.tgz",
+ "integrity": "sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@emmetio/css-parser": "^0.4.1",
+ "@emmetio/html-matcher": "^1.3.0",
+ "@vscode/emmet-helper": "^2.9.3",
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-html": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.71.tgz",
+ "integrity": "sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-html-languageservice": "^5.3.0",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-prettier": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.71.tgz",
+ "integrity": "sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0",
+ "prettier": "^2.2 || ^3.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ },
+ "prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-typescript": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.71.tgz",
+ "integrity": "sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-browserify": "^1.0.1",
+ "semver": "^7.6.2",
+ "typescript-auto-import-cache": "^0.3.5",
+ "vscode-languageserver-textdocument": "^1.0.11",
+ "vscode-nls": "^5.2.0",
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-typescript-twoslash-queries": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.71.tgz",
+ "integrity": "sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-uri": "^3.0.8"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/volar-service-yaml": {
+ "version": "0.0.71",
+ "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.71.tgz",
+ "integrity": "sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-uri": "^3.0.8",
+ "yaml-language-server": "~1.23.0"
+ },
+ "peerDependencies": {
+ "@volar/language-service": "~2.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@volar/language-service": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vscode-css-languageservice": {
+ "version": "6.3.10",
+ "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz",
+ "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vscode/l10n": "^0.0.18",
+ "vscode-languageserver-textdocument": "^1.0.12",
+ "vscode-languageserver-types": "3.17.5",
+ "vscode-uri": "^3.1.0"
+ }
+ },
+ "node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vscode-html-languageservice": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz",
+ "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vscode/l10n": "^0.0.18",
+ "vscode-languageserver-textdocument": "^1.0.12",
+ "vscode-languageserver-types": "^3.17.5",
+ "vscode-uri": "^3.1.0"
+ }
+ },
+ "node_modules/vscode-json-languageservice": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz",
+ "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsonc-parser": "^3.0.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-languageserver-types": "^3.16.0",
+ "vscode-nls": "^5.0.0",
+ "vscode-uri": "^3.0.2"
+ },
+ "engines": {
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz",
+ "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
+ "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.17.5"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz",
+ "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-jsonrpc": "9.0.2",
+ "vscode-languageserver-types": "3.18.3"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz",
+ "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz",
+ "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
+ "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
+ "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "vscode-jsonrpc": "8.2.0",
+ "vscode-languageserver-types": "3.17.5"
+ }
+ },
+ "node_modules/vscode-languageserver/node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vscode-nls": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz",
+ "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz",
+ "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/xml-naming": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz",
+ "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/xxhash-wasm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
+ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
+ "license": "MIT"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz",
+ "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==",
+ "devOptional": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yaml-language-server": {
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.23.0.tgz",
+ "integrity": "sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vscode/l10n": "^0.0.18",
+ "ajv": "^8.17.1",
+ "ajv-draft-04": "^1.0.0",
+ "ajv-i18n": "^4.2.0",
+ "prettier": "^3.8.1",
+ "request-light": "^0.5.7",
+ "vscode-json-languageservice": "4.1.8",
+ "vscode-languageserver": "^9.0.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-languageserver-types": "^3.16.0",
+ "vscode-uri": "^3.0.2",
+ "yaml": "2.8.3"
+ },
+ "bin": {
+ "yaml-language-server": "bin/yaml-language-server"
+ }
+ },
+ "node_modules/yaml-language-server/node_modules/request-light": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz",
+ "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yaml-language-server/node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
+ "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^8.2.1",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.6.5",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz",
+ "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..85467760
--- /dev/null
+++ b/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "devfancy-blog",
+ "type": "module",
+ "private": true,
+ "engines": {
+ "node": ">=22.12.0"
+ },
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "check": "astro check",
+ "lint": "biome check .",
+ "format": "biome check --write ."
+ },
+ "dependencies": {
+ "@astrojs/markdown-remark": "^7.3.1",
+ "@astrojs/sitemap": "^3.7.4",
+ "@tailwindcss/vite": "^4.3.3",
+ "astro": "^7.3.3",
+ "katex": "^0.18.7",
+ "rehype-katex": "^7.0.1",
+ "remark-math": "^6.0.0",
+ "tailwindcss": "^4.3.3"
+ },
+ "devDependencies": {
+ "@astrojs/check": "^0.9.10",
+ "@astrojs/rss": "^4.0.19",
+ "@biomejs/biome": "^2.5.14",
+ "typescript": "^5.9.3"
+ }
+}
diff --git a/ads.txt b/public/ads.txt
similarity index 100%
rename from ads.txt
rename to public/ads.txt
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 00000000..c37d7b28
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/assets/img/algorithm/Algorithm-Baekjoon-1012.jpeg b/public/assets/img/algorithm/Algorithm-Baekjoon-1012.jpeg
similarity index 100%
rename from assets/img/algorithm/Algorithm-Baekjoon-1012.jpeg
rename to public/assets/img/algorithm/Algorithm-Baekjoon-1012.jpeg
diff --git a/assets/img/algorithm/Algorithm-Baekjoon-24479-1.jpeg b/public/assets/img/algorithm/Algorithm-Baekjoon-24479-1.jpeg
similarity index 100%
rename from assets/img/algorithm/Algorithm-Baekjoon-24479-1.jpeg
rename to public/assets/img/algorithm/Algorithm-Baekjoon-24479-1.jpeg
diff --git a/assets/img/algorithm/Algorithm-Baekjoon-24480-1.jpeg b/public/assets/img/algorithm/Algorithm-Baekjoon-24480-1.jpeg
similarity index 100%
rename from assets/img/algorithm/Algorithm-Baekjoon-24480-1.jpeg
rename to public/assets/img/algorithm/Algorithm-Baekjoon-24480-1.jpeg
diff --git a/assets/img/algorithm/Algorithm-backjoon-11725.jpeg b/public/assets/img/algorithm/Algorithm-backjoon-11725.jpeg
similarity index 100%
rename from assets/img/algorithm/Algorithm-backjoon-11725.jpeg
rename to public/assets/img/algorithm/Algorithm-backjoon-11725.jpeg
diff --git a/assets/img/algorithm/Private-Static-Final-1.png b/public/assets/img/algorithm/Private-Static-Final-1.png
similarity index 100%
rename from assets/img/algorithm/Private-Static-Final-1.png
rename to public/assets/img/algorithm/Private-Static-Final-1.png
diff --git a/assets/img/algorithm/solved-class3-backjoon-11724-1.jpeg b/public/assets/img/algorithm/solved-class3-backjoon-11724-1.jpeg
similarity index 100%
rename from assets/img/algorithm/solved-class3-backjoon-11724-1.jpeg
rename to public/assets/img/algorithm/solved-class3-backjoon-11724-1.jpeg
diff --git a/assets/img/book/Book-Growing-Up-Together-1.png b/public/assets/img/book/Book-Growing-Up-Together-1.png
similarity index 100%
rename from assets/img/book/Book-Growing-Up-Together-1.png
rename to public/assets/img/book/Book-Growing-Up-Together-1.png
diff --git a/assets/img/book/Book-Growing-Up-Together-2.png b/public/assets/img/book/Book-Growing-Up-Together-2.png
similarity index 100%
rename from assets/img/book/Book-Growing-Up-Together-2.png
rename to public/assets/img/book/Book-Growing-Up-Together-2.png
diff --git a/assets/img/book/Book-Growing-Up-Together-3.png b/public/assets/img/book/Book-Growing-Up-Together-3.png
similarity index 100%
rename from assets/img/book/Book-Growing-Up-Together-3.png
rename to public/assets/img/book/Book-Growing-Up-Together-3.png
diff --git a/assets/img/book/Book-Growing-Up-Together-4.png b/public/assets/img/book/Book-Growing-Up-Together-4.png
similarity index 100%
rename from assets/img/book/Book-Growing-Up-Together-4.png
rename to public/assets/img/book/Book-Growing-Up-Together-4.png
diff --git a/assets/img/book/Book-Growing-Up-Together.jpg b/public/assets/img/book/Book-Growing-Up-Together.jpg
similarity index 100%
rename from assets/img/book/Book-Growing-Up-Together.jpg
rename to public/assets/img/book/Book-Growing-Up-Together.jpg
diff --git a/assets/img/book/Book_Interview_Questions_for_Reflecting_on_Life_and_Attitude.png b/public/assets/img/book/Book_Interview_Questions_for_Reflecting_on_Life_and_Attitude.png
similarity index 100%
rename from assets/img/book/Book_Interview_Questions_for_Reflecting_on_Life_and_Attitude.png
rename to public/assets/img/book/Book_Interview_Questions_for_Reflecting_on_Life_and_Attitude.png
diff --git a/assets/img/book/Die-Kunst-uber-Geld-nachzudenken.png b/public/assets/img/book/Die-Kunst-uber-Geld-nachzudenken.png
similarity index 100%
rename from assets/img/book/Die-Kunst-uber-Geld-nachzudenken.png
rename to public/assets/img/book/Die-Kunst-uber-Geld-nachzudenken.png
diff --git a/assets/img/book/Die-Kunst-uber-Geld-nachzudenken_egg.png b/public/assets/img/book/Die-Kunst-uber-Geld-nachzudenken_egg.png
similarity index 100%
rename from assets/img/book/Die-Kunst-uber-Geld-nachzudenken_egg.png
rename to public/assets/img/book/Die-Kunst-uber-Geld-nachzudenken_egg.png
diff --git a/assets/img/book/Modern-AI-Development-at-Karrot.png b/public/assets/img/book/Modern-AI-Development-at-Karrot.png
similarity index 100%
rename from assets/img/book/Modern-AI-Development-at-Karrot.png
rename to public/assets/img/book/Modern-AI-Development-at-Karrot.png
diff --git a/assets/img/book/Starting-with-Domain-Driven-Design-image.png b/public/assets/img/book/Starting-with-Domain-Driven-Design-image.png
similarity index 100%
rename from assets/img/book/Starting-with-Domain-Driven-Design-image.png
rename to public/assets/img/book/Starting-with-Domain-Driven-Design-image.png
diff --git a/assets/img/book/The-One-Who-Leaves-People-Behind.png b/public/assets/img/book/The-One-Who-Leaves-People-Behind.png
similarity index 100%
rename from assets/img/book/The-One-Who-Leaves-People-Behind.png
rename to public/assets/img/book/The-One-Who-Leaves-People-Behind.png
diff --git a/assets/img/book/book-software-master-craftsman.jpg b/public/assets/img/book/book-software-master-craftsman.jpg
similarity index 100%
rename from assets/img/book/book-software-master-craftsman.jpg
rename to public/assets/img/book/book-software-master-craftsman.jpg
diff --git a/assets/img/book/book-software-master-craftsman_7.jpg b/public/assets/img/book/book-software-master-craftsman_7.jpg
similarity index 100%
rename from assets/img/book/book-software-master-craftsman_7.jpg
rename to public/assets/img/book/book-software-master-craftsman_7.jpg
diff --git a/assets/img/book/the-answer_1.png b/public/assets/img/book/the-answer_1.png
similarity index 100%
rename from assets/img/book/the-answer_1.png
rename to public/assets/img/book/the-answer_1.png
diff --git a/assets/img/book/the-answer_2.png b/public/assets/img/book/the-answer_2.png
similarity index 100%
rename from assets/img/book/the-answer_2.png
rename to public/assets/img/book/the-answer_2.png
diff --git a/assets/img/book/the-essentials-of-investment.png b/public/assets/img/book/the-essentials-of-investment.png
similarity index 100%
rename from assets/img/book/the-essentials-of-investment.png
rename to public/assets/img/book/the-essentials-of-investment.png
diff --git a/assets/img/book/the-success-equation.png b/public/assets/img/book/the-success-equation.png
similarity index 100%
rename from assets/img/book/the-success-equation.png
rename to public/assets/img/book/the-success-equation.png
diff --git a/assets/img/book/the-success-equation_2.png b/public/assets/img/book/the-success-equation_2.png
similarity index 100%
rename from assets/img/book/the-success-equation_2.png
rename to public/assets/img/book/the-success-equation_2.png
diff --git a/assets/img/bs/bs-analysis-of-variance_1.png b/public/assets/img/business-statistics/bs-analysis-of-variance_1.png
similarity index 100%
rename from assets/img/bs/bs-analysis-of-variance_1.png
rename to public/assets/img/business-statistics/bs-analysis-of-variance_1.png
diff --git a/assets/img/bs/bs-analysis-of-variance_2.png b/public/assets/img/business-statistics/bs-analysis-of-variance_2.png
similarity index 100%
rename from assets/img/bs/bs-analysis-of-variance_2.png
rename to public/assets/img/business-statistics/bs-analysis-of-variance_2.png
diff --git a/assets/img/bs/bs-analysis-of-variance_3.png b/public/assets/img/business-statistics/bs-analysis-of-variance_3.png
similarity index 100%
rename from assets/img/bs/bs-analysis-of-variance_3.png
rename to public/assets/img/business-statistics/bs-analysis-of-variance_3.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_1.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_1.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_1.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_1.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_2.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_2.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_2.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_2.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_3.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_3.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_3.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_3.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_4.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_4.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_4.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_4.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_5.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_5.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_5.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_5.png
diff --git a/assets/img/bs/bs-continuous-probability-distribution_6.png b/public/assets/img/business-statistics/bs-continuous-probability-distribution_6.png
similarity index 100%
rename from assets/img/bs/bs-continuous-probability-distribution_6.png
rename to public/assets/img/business-statistics/bs-continuous-probability-distribution_6.png
diff --git a/assets/img/bs/bs-estimation-and-confidence-interval_1.png b/public/assets/img/business-statistics/bs-estimation-and-confidence-interval_1.png
similarity index 100%
rename from assets/img/bs/bs-estimation-and-confidence-interval_1.png
rename to public/assets/img/business-statistics/bs-estimation-and-confidence-interval_1.png
diff --git a/assets/img/bs/bs-estimation-and-confidence-interval_2.png b/public/assets/img/business-statistics/bs-estimation-and-confidence-interval_2.png
similarity index 100%
rename from assets/img/bs/bs-estimation-and-confidence-interval_2.png
rename to public/assets/img/business-statistics/bs-estimation-and-confidence-interval_2.png
diff --git a/assets/img/bs/bs-estimation-and-confidence-interval_3.png b/public/assets/img/business-statistics/bs-estimation-and-confidence-interval_3.png
similarity index 100%
rename from assets/img/bs/bs-estimation-and-confidence-interval_3.png
rename to public/assets/img/business-statistics/bs-estimation-and-confidence-interval_3.png
diff --git a/assets/img/bs/bs-hypothesis-testing_1.png b/public/assets/img/business-statistics/bs-hypothesis-testing_1.png
similarity index 100%
rename from assets/img/bs/bs-hypothesis-testing_1.png
rename to public/assets/img/business-statistics/bs-hypothesis-testing_1.png
diff --git a/assets/img/bs/bs-hypothesis-testing_2.png b/public/assets/img/business-statistics/bs-hypothesis-testing_2.png
similarity index 100%
rename from assets/img/bs/bs-hypothesis-testing_2.png
rename to public/assets/img/business-statistics/bs-hypothesis-testing_2.png
diff --git a/assets/img/bs/bs-hypothesis-testing_3.png b/public/assets/img/business-statistics/bs-hypothesis-testing_3.png
similarity index 100%
rename from assets/img/bs/bs-hypothesis-testing_3.png
rename to public/assets/img/business-statistics/bs-hypothesis-testing_3.png
diff --git a/assets/img/bs/bs-hypothesis-testing_4.png b/public/assets/img/business-statistics/bs-hypothesis-testing_4.png
similarity index 100%
rename from assets/img/bs/bs-hypothesis-testing_4.png
rename to public/assets/img/business-statistics/bs-hypothesis-testing_4.png
diff --git a/assets/img/bs/bs-hypothesis-testing_5.png b/public/assets/img/business-statistics/bs-hypothesis-testing_5.png
similarity index 100%
rename from assets/img/bs/bs-hypothesis-testing_5.png
rename to public/assets/img/business-statistics/bs-hypothesis-testing_5.png
diff --git a/assets/img/bs/bs-sampling-methods-and-central-limit-theorem_1.png b/public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_1.png
similarity index 100%
rename from assets/img/bs/bs-sampling-methods-and-central-limit-theorem_1.png
rename to public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_1.png
diff --git a/assets/img/bs/bs-sampling-methods-and-central-limit-theorem_2.png b/public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_2.png
similarity index 100%
rename from assets/img/bs/bs-sampling-methods-and-central-limit-theorem_2.png
rename to public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_2.png
diff --git a/assets/img/bs/bs-sampling-methods-and-central-limit-theorem_3.png b/public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_3.png
similarity index 100%
rename from assets/img/bs/bs-sampling-methods-and-central-limit-theorem_3.png
rename to public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_3.png
diff --git a/assets/img/bs/bs-sampling-methods-and-central-limit-theorem_4.png b/public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_4.png
similarity index 100%
rename from assets/img/bs/bs-sampling-methods-and-central-limit-theorem_4.png
rename to public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_4.png
diff --git a/assets/img/bs/bs-sampling-methods-and-central-limit-theorem_5.png b/public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_5.png
similarity index 100%
rename from assets/img/bs/bs-sampling-methods-and-central-limit-theorem_5.png
rename to public/assets/img/business-statistics/bs-sampling-methods-and-central-limit-theorem_5.png
diff --git a/assets/img/bs/bs-two-sample-hypothesis-test.png b/public/assets/img/business-statistics/bs-two-sample-hypothesis-test.png
similarity index 100%
rename from assets/img/bs/bs-two-sample-hypothesis-test.png
rename to public/assets/img/business-statistics/bs-two-sample-hypothesis-test.png
diff --git a/assets/img/bs/bs-what-is-statistics_1.png b/public/assets/img/business-statistics/bs-what-is-statistics_1.png
similarity index 100%
rename from assets/img/bs/bs-what-is-statistics_1.png
rename to public/assets/img/business-statistics/bs-what-is-statistics_1.png
diff --git a/assets/img/bs/bs-what-is-statistics_2.png b/public/assets/img/business-statistics/bs-what-is-statistics_2.png
similarity index 100%
rename from assets/img/bs/bs-what-is-statistics_2.png
rename to public/assets/img/business-statistics/bs-what-is-statistics_2.png
diff --git a/assets/img/bs/bs-what-is-statistics_3.png b/public/assets/img/business-statistics/bs-what-is-statistics_3.png
similarity index 100%
rename from assets/img/bs/bs-what-is-statistics_3.png
rename to public/assets/img/business-statistics/bs-what-is-statistics_3.png
diff --git a/assets/img/bs/business-statistics_textbook.png b/public/assets/img/business-statistics/business-statistics_textbook.png
similarity index 100%
rename from assets/img/bs/business-statistics_textbook.png
rename to public/assets/img/business-statistics/business-statistics_textbook.png
diff --git a/assets/img/goodcode/GoodCode-BadCode-2_1.png b/public/assets/img/clean-code/GoodCode-BadCode-2_1.png
similarity index 100%
rename from assets/img/goodcode/GoodCode-BadCode-2_1.png
rename to public/assets/img/clean-code/GoodCode-BadCode-2_1.png
diff --git a/assets/img/goodcode/GoodCode-BadCode-2_2.png b/public/assets/img/clean-code/GoodCode-BadCode-2_2.png
similarity index 100%
rename from assets/img/goodcode/GoodCode-BadCode-2_2.png
rename to public/assets/img/clean-code/GoodCode-BadCode-2_2.png
diff --git a/assets/img/goodcode/GoodCode_BadCode_book.png b/public/assets/img/clean-code/GoodCode_BadCode_book.png
similarity index 100%
rename from assets/img/goodcode/GoodCode_BadCode_book.png
rename to public/assets/img/clean-code/GoodCode_BadCode_book.png
diff --git a/assets/img/goodcode/Is-My-Code-That-Weird-3-1.png b/public/assets/img/clean-code/Is-My-Code-That-Weird-3-1.png
similarity index 100%
rename from assets/img/goodcode/Is-My-Code-That-Weird-3-1.png
rename to public/assets/img/clean-code/Is-My-Code-That-Weird-3-1.png
diff --git a/assets/img/goodcode/Is-My-Code-That-Weird-6-1.png b/public/assets/img/clean-code/Is-My-Code-That-Weird-6-1.png
similarity index 100%
rename from assets/img/goodcode/Is-My-Code-That-Weird-6-1.png
rename to public/assets/img/clean-code/Is-My-Code-That-Weird-6-1.png
diff --git a/assets/img/goodcode/Is-My-Code-That-Weird-6-2.png b/public/assets/img/clean-code/Is-My-Code-That-Weird-6-2.png
similarity index 100%
rename from assets/img/goodcode/Is-My-Code-That-Weird-6-2.png
rename to public/assets/img/clean-code/Is-My-Code-That-Weird-6-2.png
diff --git a/assets/img/goodcode/My-Code-That-Weird-1-1.jpeg b/public/assets/img/clean-code/My-Code-That-Weird-1-1.jpeg
similarity index 100%
rename from assets/img/goodcode/My-Code-That-Weird-1-1.jpeg
rename to public/assets/img/clean-code/My-Code-That-Weird-1-1.jpeg
diff --git a/assets/img/goodcode/TestCode-Strategy-Consideration-1.png b/public/assets/img/clean-code/TestCode-Strategy-Consideration-1.png
similarity index 100%
rename from assets/img/goodcode/TestCode-Strategy-Consideration-1.png
rename to public/assets/img/clean-code/TestCode-Strategy-Consideration-1.png
diff --git a/assets/img/competition/Entrepreneurship_Performance_Contest.png b/public/assets/img/competition/Entrepreneurship_Performance_Contest.png
similarity index 100%
rename from assets/img/competition/Entrepreneurship_Performance_Contest.png
rename to public/assets/img/competition/Entrepreneurship_Performance_Contest.png
diff --git a/assets/img/competition/Student_Design_Convergence_Major-Competition.png b/public/assets/img/competition/Student_Design_Convergence_Major-Competition.png
similarity index 100%
rename from assets/img/competition/Student_Design_Convergence_Major-Competition.png
rename to public/assets/img/competition/Student_Design_Convergence_Major-Competition.png
diff --git a/assets/img/competition/knu-student-design-Grand-Prize-Award.png b/public/assets/img/competition/knu-student-design-Grand-Prize-Award.png
similarity index 100%
rename from assets/img/competition/knu-student-design-Grand-Prize-Award.png
rename to public/assets/img/competition/knu-student-design-Grand-Prize-Award.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest.png b/public/assets/img/competition/knu-student-design-convergence-major-contest.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_1.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_1.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_1.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_1.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_2.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_2.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_2.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_2.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_3.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_3.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_3.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_3.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_4.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_4.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_4.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_4.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_5.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_5.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_5.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_5.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_6.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_6.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_6.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_6.png
diff --git a/assets/img/competition/knu-student-design-convergence-major-contest_result.png b/public/assets/img/competition/knu-student-design-convergence-major-contest_result.png
similarity index 100%
rename from assets/img/competition/knu-student-design-convergence-major-contest_result.png
rename to public/assets/img/competition/knu-student-design-convergence-major-contest_result.png
diff --git a/assets/img/competition/oss_karrier_homepage.png b/public/assets/img/competition/oss_karrier_homepage.png
similarity index 100%
rename from assets/img/competition/oss_karrier_homepage.png
rename to public/assets/img/competition/oss_karrier_homepage.png
diff --git a/assets/img/competition/oss_pass.png b/public/assets/img/competition/oss_pass.png
similarity index 100%
rename from assets/img/competition/oss_pass.png
rename to public/assets/img/competition/oss_pass.png
diff --git a/assets/img/datastructure/Priority-Queue-1.png b/public/assets/img/datastructure/Priority-Queue-1.png
similarity index 100%
rename from assets/img/datastructure/Priority-Queue-1.png
rename to public/assets/img/datastructure/Priority-Queue-1.png
diff --git a/assets/img/datastructure/Priority-Queue-2.png b/public/assets/img/datastructure/Priority-Queue-2.png
similarity index 100%
rename from assets/img/datastructure/Priority-Queue-2.png
rename to public/assets/img/datastructure/Priority-Queue-2.png
diff --git a/assets/img/datastructure/Priority-Queue-3.png b/public/assets/img/datastructure/Priority-Queue-3.png
similarity index 100%
rename from assets/img/datastructure/Priority-Queue-3.png
rename to public/assets/img/datastructure/Priority-Queue-3.png
diff --git a/assets/img/datastructure/Priority-Queue-4.png b/public/assets/img/datastructure/Priority-Queue-4.png
similarity index 100%
rename from assets/img/datastructure/Priority-Queue-4.png
rename to public/assets/img/datastructure/Priority-Queue-4.png
diff --git a/assets/img/datastructure/Priority-Queue-5.png b/public/assets/img/datastructure/Priority-Queue-5.png
similarity index 100%
rename from assets/img/datastructure/Priority-Queue-5.png
rename to public/assets/img/datastructure/Priority-Queue-5.png
diff --git a/assets/img/datastructure/graph-1.jpg b/public/assets/img/datastructure/graph-1.jpg
similarity index 100%
rename from assets/img/datastructure/graph-1.jpg
rename to public/assets/img/datastructure/graph-1.jpg
diff --git a/assets/img/datastructure/graph-2.png b/public/assets/img/datastructure/graph-2.png
similarity index 100%
rename from assets/img/datastructure/graph-2.png
rename to public/assets/img/datastructure/graph-2.png
diff --git a/assets/img/datastructure/graph-3.png b/public/assets/img/datastructure/graph-3.png
similarity index 100%
rename from assets/img/datastructure/graph-3.png
rename to public/assets/img/datastructure/graph-3.png
diff --git a/assets/img/datastructure/linkedList-deleteNode-1.png b/public/assets/img/datastructure/linkedList-deleteNode-1.png
similarity index 100%
rename from assets/img/datastructure/linkedList-deleteNode-1.png
rename to public/assets/img/datastructure/linkedList-deleteNode-1.png
diff --git a/assets/img/datastructure/linkedList-deleteNode-2.png b/public/assets/img/datastructure/linkedList-deleteNode-2.png
similarity index 100%
rename from assets/img/datastructure/linkedList-deleteNode-2.png
rename to public/assets/img/datastructure/linkedList-deleteNode-2.png
diff --git a/assets/img/datastructure/linkedList-insertNode-1.png b/public/assets/img/datastructure/linkedList-insertNode-1.png
similarity index 100%
rename from assets/img/datastructure/linkedList-insertNode-1.png
rename to public/assets/img/datastructure/linkedList-insertNode-1.png
diff --git a/assets/img/datastructure/linkedList-insertNode-2.png b/public/assets/img/datastructure/linkedList-insertNode-2.png
similarity index 100%
rename from assets/img/datastructure/linkedList-insertNode-2.png
rename to public/assets/img/datastructure/linkedList-insertNode-2.png
diff --git a/assets/img/datastructure/linkedList_stack_linkedlist.png b/public/assets/img/datastructure/linkedList_stack_linkedlist.png
similarity index 100%
rename from assets/img/datastructure/linkedList_stack_linkedlist.png
rename to public/assets/img/datastructure/linkedList_stack_linkedlist.png
diff --git a/assets/img/datastructure/linkedlist-1.jpg b/public/assets/img/datastructure/linkedlist-1.jpg
similarity index 100%
rename from assets/img/datastructure/linkedlist-1.jpg
rename to public/assets/img/datastructure/linkedlist-1.jpg
diff --git a/assets/img/datastructure/linkedlist-2.jpg b/public/assets/img/datastructure/linkedlist-2.jpg
similarity index 100%
rename from assets/img/datastructure/linkedlist-2.jpg
rename to public/assets/img/datastructure/linkedlist-2.jpg
diff --git a/assets/img/datastructure/tree-1.png b/public/assets/img/datastructure/tree-1.png
similarity index 100%
rename from assets/img/datastructure/tree-1.png
rename to public/assets/img/datastructure/tree-1.png
diff --git a/assets/img/datastructure/tree-2.jpg b/public/assets/img/datastructure/tree-2.jpg
similarity index 100%
rename from assets/img/datastructure/tree-2.jpg
rename to public/assets/img/datastructure/tree-2.jpg
diff --git a/assets/img/datastructure/tree-3.jpg b/public/assets/img/datastructure/tree-3.jpg
similarity index 100%
rename from assets/img/datastructure/tree-3.jpg
rename to public/assets/img/datastructure/tree-3.jpg
diff --git a/assets/img/datastructure/tree-4.png b/public/assets/img/datastructure/tree-4.png
similarity index 100%
rename from assets/img/datastructure/tree-4.png
rename to public/assets/img/datastructure/tree-4.png
diff --git a/assets/img/datastructure/tree-5.png b/public/assets/img/datastructure/tree-5.png
similarity index 100%
rename from assets/img/datastructure/tree-5.png
rename to public/assets/img/datastructure/tree-5.png
diff --git a/assets/img/datastructure/tree-6.jpg b/public/assets/img/datastructure/tree-6.jpg
similarity index 100%
rename from assets/img/datastructure/tree-6.jpg
rename to public/assets/img/datastructure/tree-6.jpg
diff --git a/assets/img/datastructure/tree-7.png b/public/assets/img/datastructure/tree-7.png
similarity index 100%
rename from assets/img/datastructure/tree-7.png
rename to public/assets/img/datastructure/tree-7.png
diff --git a/assets/img/datastructure/tree-8.png b/public/assets/img/datastructure/tree-8.png
similarity index 100%
rename from assets/img/datastructure/tree-8.png
rename to public/assets/img/datastructure/tree-8.png
diff --git a/assets/img/db/AI_Profile_DB_Migration.png b/public/assets/img/db/AI_Profile_DB_Migration.png
similarity index 100%
rename from assets/img/db/AI_Profile_DB_Migration.png
rename to public/assets/img/db/AI_Profile_DB_Migration.png
diff --git a/assets/img/db/DB-Concurrency-Issue-Scenario.png b/public/assets/img/db/DB-Concurrency-Issue-Scenario.png
similarity index 100%
rename from assets/img/db/DB-Concurrency-Issue-Scenario.png
rename to public/assets/img/db/DB-Concurrency-Issue-Scenario.png
diff --git a/assets/img/db/DB-Normalization-1.JPG b/public/assets/img/db/DB-Normalization-1.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-1.JPG
rename to public/assets/img/db/DB-Normalization-1.JPG
diff --git a/assets/img/db/DB-Normalization-10.JPG b/public/assets/img/db/DB-Normalization-10.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-10.JPG
rename to public/assets/img/db/DB-Normalization-10.JPG
diff --git a/assets/img/db/DB-Normalization-11.jpg b/public/assets/img/db/DB-Normalization-11.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-11.jpg
rename to public/assets/img/db/DB-Normalization-11.jpg
diff --git a/assets/img/db/DB-Normalization-12.jpg b/public/assets/img/db/DB-Normalization-12.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-12.jpg
rename to public/assets/img/db/DB-Normalization-12.jpg
diff --git a/assets/img/db/DB-Normalization-13.jpg b/public/assets/img/db/DB-Normalization-13.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-13.jpg
rename to public/assets/img/db/DB-Normalization-13.jpg
diff --git a/assets/img/db/DB-Normalization-14.jpg b/public/assets/img/db/DB-Normalization-14.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-14.jpg
rename to public/assets/img/db/DB-Normalization-14.jpg
diff --git a/assets/img/db/DB-Normalization-15.jpg b/public/assets/img/db/DB-Normalization-15.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-15.jpg
rename to public/assets/img/db/DB-Normalization-15.jpg
diff --git a/assets/img/db/DB-Normalization-16.jpg b/public/assets/img/db/DB-Normalization-16.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-16.jpg
rename to public/assets/img/db/DB-Normalization-16.jpg
diff --git a/assets/img/db/DB-Normalization-17.jpg b/public/assets/img/db/DB-Normalization-17.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-17.jpg
rename to public/assets/img/db/DB-Normalization-17.jpg
diff --git a/assets/img/db/DB-Normalization-2.jpg b/public/assets/img/db/DB-Normalization-2.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-2.jpg
rename to public/assets/img/db/DB-Normalization-2.jpg
diff --git a/assets/img/db/DB-Normalization-3.JPG b/public/assets/img/db/DB-Normalization-3.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-3.JPG
rename to public/assets/img/db/DB-Normalization-3.JPG
diff --git a/assets/img/db/DB-Normalization-4.JPG b/public/assets/img/db/DB-Normalization-4.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-4.JPG
rename to public/assets/img/db/DB-Normalization-4.JPG
diff --git a/assets/img/db/DB-Normalization-5.jpg b/public/assets/img/db/DB-Normalization-5.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-5.jpg
rename to public/assets/img/db/DB-Normalization-5.jpg
diff --git a/assets/img/db/DB-Normalization-6.jpg b/public/assets/img/db/DB-Normalization-6.jpg
similarity index 100%
rename from assets/img/db/DB-Normalization-6.jpg
rename to public/assets/img/db/DB-Normalization-6.jpg
diff --git a/assets/img/db/DB-Normalization-7.JPG b/public/assets/img/db/DB-Normalization-7.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-7.JPG
rename to public/assets/img/db/DB-Normalization-7.JPG
diff --git a/assets/img/db/DB-Normalization-8.JPG b/public/assets/img/db/DB-Normalization-8.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-8.JPG
rename to public/assets/img/db/DB-Normalization-8.JPG
diff --git a/assets/img/db/DB-Normalization-9.JPG b/public/assets/img/db/DB-Normalization-9.JPG
similarity index 100%
rename from assets/img/db/DB-Normalization-9.JPG
rename to public/assets/img/db/DB-Normalization-9.JPG
diff --git a/assets/img/db/db-locking-1.png b/public/assets/img/db/db-locking-1.png
similarity index 100%
rename from assets/img/db/db-locking-1.png
rename to public/assets/img/db/db-locking-1.png
diff --git a/assets/img/db/db-locking-2.png b/public/assets/img/db/db-locking-2.png
similarity index 100%
rename from assets/img/db/db-locking-2.png
rename to public/assets/img/db/db-locking-2.png
diff --git a/assets/img/db/db-locking-3.png b/public/assets/img/db/db-locking-3.png
similarity index 100%
rename from assets/img/db/db-locking-3.png
rename to public/assets/img/db/db-locking-3.png
diff --git a/assets/img/db/db-locking-4.png b/public/assets/img/db/db-locking-4.png
similarity index 100%
rename from assets/img/db/db-locking-4.png
rename to public/assets/img/db/db-locking-4.png
diff --git a/assets/img/db/db-locking-deadlock.png b/public/assets/img/db/db-locking-deadlock.png
similarity index 100%
rename from assets/img/db/db-locking-deadlock.png
rename to public/assets/img/db/db-locking-deadlock.png
diff --git a/assets/img/db/db-locking-optimistic-lock.png b/public/assets/img/db/db-locking-optimistic-lock.png
similarity index 100%
rename from assets/img/db/db-locking-optimistic-lock.png
rename to public/assets/img/db/db-locking-optimistic-lock.png
diff --git a/assets/img/db/db-locking-pessimistic-lock.png b/public/assets/img/db/db-locking-pessimistic-lock.png
similarity index 100%
rename from assets/img/db/db-locking-pessimistic-lock.png
rename to public/assets/img/db/db-locking-pessimistic-lock.png
diff --git a/assets/img/db/db-rdb-concept-1.jpg b/public/assets/img/db/db-rdb-concept-1.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-1.jpg
rename to public/assets/img/db/db-rdb-concept-1.jpg
diff --git a/assets/img/db/db-rdb-concept-2.jpg b/public/assets/img/db/db-rdb-concept-2.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-2.jpg
rename to public/assets/img/db/db-rdb-concept-2.jpg
diff --git a/assets/img/db/db-rdb-concept-key-1.jpg b/public/assets/img/db/db-rdb-concept-key-1.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-key-1.jpg
rename to public/assets/img/db/db-rdb-concept-key-1.jpg
diff --git a/assets/img/db/db-rdb-concept-key-2.jpg b/public/assets/img/db/db-rdb-concept-key-2.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-key-2.jpg
rename to public/assets/img/db/db-rdb-concept-key-2.jpg
diff --git a/assets/img/db/db-rdb-concept-key-3.jpg b/public/assets/img/db/db-rdb-concept-key-3.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-key-3.jpg
rename to public/assets/img/db/db-rdb-concept-key-3.jpg
diff --git a/assets/img/db/db-rdb-concept-key-4.jpg b/public/assets/img/db/db-rdb-concept-key-4.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-key-4.jpg
rename to public/assets/img/db/db-rdb-concept-key-4.jpg
diff --git a/assets/img/db/db-rdb-concept-key-5.jpg b/public/assets/img/db/db-rdb-concept-key-5.jpg
similarity index 100%
rename from assets/img/db/db-rdb-concept-key-5.jpg
rename to public/assets/img/db/db-rdb-concept-key-5.jpg
diff --git a/assets/img/db/db-rdb-nosql-1.png b/public/assets/img/db/db-rdb-nosql-1.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-1.png
rename to public/assets/img/db/db-rdb-nosql-1.png
diff --git a/assets/img/db/db-rdb-nosql-2.png b/public/assets/img/db/db-rdb-nosql-2.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-2.png
rename to public/assets/img/db/db-rdb-nosql-2.png
diff --git a/assets/img/db/db-rdb-nosql-3.png b/public/assets/img/db/db-rdb-nosql-3.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-3.png
rename to public/assets/img/db/db-rdb-nosql-3.png
diff --git a/assets/img/db/db-rdb-nosql-4.png b/public/assets/img/db/db-rdb-nosql-4.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-4.png
rename to public/assets/img/db/db-rdb-nosql-4.png
diff --git a/assets/img/db/db-rdb-nosql-5.png b/public/assets/img/db/db-rdb-nosql-5.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-5.png
rename to public/assets/img/db/db-rdb-nosql-5.png
diff --git a/assets/img/db/db-rdb-nosql-mongodb.png b/public/assets/img/db/db-rdb-nosql-mongodb.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-mongodb.png
rename to public/assets/img/db/db-rdb-nosql-mongodb.png
diff --git a/assets/img/db/db-rdb-nosql-redis.png b/public/assets/img/db/db-rdb-nosql-redis.png
similarity index 100%
rename from assets/img/db/db-rdb-nosql-redis.png
rename to public/assets/img/db/db-rdb-nosql-redis.png
diff --git a/assets/img/db/db-transaction-1.png b/public/assets/img/db/db-transaction-1.png
similarity index 100%
rename from assets/img/db/db-transaction-1.png
rename to public/assets/img/db/db-transaction-1.png
diff --git a/assets/img/db/db-transaction-isolation-level-1.jpg b/public/assets/img/db/db-transaction-isolation-level-1.jpg
similarity index 100%
rename from assets/img/db/db-transaction-isolation-level-1.jpg
rename to public/assets/img/db/db-transaction-isolation-level-1.jpg
diff --git a/assets/img/db/db-transaction-isolation-level-2.png b/public/assets/img/db/db-transaction-isolation-level-2.png
similarity index 100%
rename from assets/img/db/db-transaction-isolation-level-2.png
rename to public/assets/img/db/db-transaction-isolation-level-2.png
diff --git a/assets/img/db/flyway-db-migration-1.png b/public/assets/img/db/flyway-db-migration-1.png
similarity index 100%
rename from assets/img/db/flyway-db-migration-1.png
rename to public/assets/img/db/flyway-db-migration-1.png
diff --git a/assets/img/db/flyway-db-migration-2.png b/public/assets/img/db/flyway-db-migration-2.png
similarity index 100%
rename from assets/img/db/flyway-db-migration-2.png
rename to public/assets/img/db/flyway-db-migration-2.png
diff --git a/assets/img/db/flyway-db-migration-script-name.png b/public/assets/img/db/flyway-db-migration-script-name.png
similarity index 100%
rename from assets/img/db/flyway-db-migration-script-name.png
rename to public/assets/img/db/flyway-db-migration-script-name.png
diff --git a/assets/img/db/flyway.png b/public/assets/img/db/flyway.png
similarity index 100%
rename from assets/img/db/flyway.png
rename to public/assets/img/db/flyway.png
diff --git a/assets/img/db/flyway_db_1.jpg b/public/assets/img/db/flyway_db_1.jpg
similarity index 100%
rename from assets/img/db/flyway_db_1.jpg
rename to public/assets/img/db/flyway_db_1.jpg
diff --git a/assets/img/db/flyway_db_2.jpg b/public/assets/img/db/flyway_db_2.jpg
similarity index 100%
rename from assets/img/db/flyway_db_2.jpg
rename to public/assets/img/db/flyway_db_2.jpg
diff --git a/assets/img/db/what_is_horizontal_partitioning_in_database.png b/public/assets/img/db/what_is_horizontal_partitioning_in_database.png
similarity index 100%
rename from assets/img/db/what_is_horizontal_partitioning_in_database.png
rename to public/assets/img/db/what_is_horizontal_partitioning_in_database.png
diff --git a/assets/img/record/2023-bye-devfancy.png b/public/assets/img/dev-history/2023-bye-devfancy.png
similarity index 100%
rename from assets/img/record/2023-bye-devfancy.png
rename to public/assets/img/dev-history/2023-bye-devfancy.png
diff --git a/assets/img/record/record-cs-study.png b/public/assets/img/dev-history/record-cs-study.png
similarity index 100%
rename from assets/img/record/record-cs-study.png
rename to public/assets/img/dev-history/record-cs-study.png
diff --git a/assets/img/record/record-goodfriends-service_introduction.png b/public/assets/img/dev-history/record-goodfriends-service_introduction.png
similarity index 100%
rename from assets/img/record/record-goodfriends-service_introduction.png
rename to public/assets/img/dev-history/record-goodfriends-service_introduction.png
diff --git a/assets/img/record/record-goodfriends-tech-blog.png b/public/assets/img/dev-history/record-goodfriends-tech-blog.png
similarity index 100%
rename from assets/img/record/record-goodfriends-tech-blog.png
rename to public/assets/img/dev-history/record-goodfriends-tech-blog.png
diff --git a/assets/img/record/record-hibit-presentation.jpg b/public/assets/img/dev-history/record-hibit-presentation.jpg
similarity index 100%
rename from assets/img/record/record-hibit-presentation.jpg
rename to public/assets/img/dev-history/record-hibit-presentation.jpg
diff --git a/assets/img/record/record-hibit-profile.png b/public/assets/img/dev-history/record-hibit-profile.png
similarity index 100%
rename from assets/img/record/record-hibit-profile.png
rename to public/assets/img/dev-history/record-hibit-profile.png
diff --git a/assets/img/record/record-karrier-oss-sw-competition.png b/public/assets/img/dev-history/record-karrier-oss-sw-competition.png
similarity index 100%
rename from assets/img/record/record-karrier-oss-sw-competition.png
rename to public/assets/img/dev-history/record-karrier-oss-sw-competition.png
diff --git a/assets/img/record/record-knu-diploma.jpg b/public/assets/img/dev-history/record-knu-diploma.jpg
similarity index 100%
rename from assets/img/record/record-knu-diploma.jpg
rename to public/assets/img/dev-history/record-knu-diploma.jpg
diff --git a/assets/img/record/record-my-blog-2023.png b/public/assets/img/dev-history/record-my-blog-2023.png
similarity index 100%
rename from assets/img/record/record-my-blog-2023.png
rename to public/assets/img/dev-history/record-my-blog-2023.png
diff --git a/assets/img/record/record-oauth-oidc.png b/public/assets/img/dev-history/record-oauth-oidc.png
similarity index 100%
rename from assets/img/record/record-oauth-oidc.png
rename to public/assets/img/dev-history/record-oauth-oidc.png
diff --git a/assets/img/record/record-ob-team-hibit-introduction.png b/public/assets/img/dev-history/record-ob-team-hibit-introduction.png
similarity index 100%
rename from assets/img/record/record-ob-team-hibit-introduction.png
rename to public/assets/img/dev-history/record-ob-team-hibit-introduction.png
diff --git a/assets/img/record/record-tech-writing.png b/public/assets/img/dev-history/record-tech-writing.png
similarity index 100%
rename from assets/img/record/record-tech-writing.png
rename to public/assets/img/dev-history/record-tech-writing.png
diff --git a/assets/img/record/record-toss-slash22-jemin.png b/public/assets/img/dev-history/record-toss-slash22-jemin.png
similarity index 100%
rename from assets/img/record/record-toss-slash22-jemin.png
rename to public/assets/img/dev-history/record-toss-slash22-jemin.png
diff --git a/assets/img/record/record-usa-stock-market.png b/public/assets/img/dev-history/record-usa-stock-market.png
similarity index 100%
rename from assets/img/record/record-usa-stock-market.png
rename to public/assets/img/dev-history/record-usa-stock-market.png
diff --git a/assets/img/record/record-why-we-use-vueJs.png b/public/assets/img/dev-history/record-why-we-use-vueJs.png
similarity index 100%
rename from assets/img/record/record-why-we-use-vueJs.png
rename to public/assets/img/dev-history/record-why-we-use-vueJs.png
diff --git a/assets/img/record/record-woorifisa-certificate.jpg b/public/assets/img/dev-history/record-woorifisa-certificate.jpg
similarity index 100%
rename from assets/img/record/record-woorifisa-certificate.jpg
rename to public/assets/img/dev-history/record-woorifisa-certificate.jpg
diff --git a/assets/img/record/record-woowa_study.png b/public/assets/img/dev-history/record-woowa_study.png
similarity index 100%
rename from assets/img/record/record-woowa_study.png
rename to public/assets/img/dev-history/record-woowa_study.png
diff --git a/assets/img/record/record-woowastudy-my-code.png b/public/assets/img/dev-history/record-woowastudy-my-code.png
similarity index 100%
rename from assets/img/record/record-woowastudy-my-code.png
rename to public/assets/img/dev-history/record-woowastudy-my-code.png
diff --git a/assets/img/ef/ef-07-cryptography_1.png b/public/assets/img/electronic-finance/ef-07-cryptography_1.png
similarity index 100%
rename from assets/img/ef/ef-07-cryptography_1.png
rename to public/assets/img/electronic-finance/ef-07-cryptography_1.png
diff --git a/assets/img/ef/ef-07-cryptography_2.png b/public/assets/img/electronic-finance/ef-07-cryptography_2.png
similarity index 100%
rename from assets/img/ef/ef-07-cryptography_2.png
rename to public/assets/img/electronic-finance/ef-07-cryptography_2.png
diff --git a/assets/img/ef/ef-07-cryptography_3.png b/public/assets/img/electronic-finance/ef-07-cryptography_3.png
similarity index 100%
rename from assets/img/ef/ef-07-cryptography_3.png
rename to public/assets/img/electronic-finance/ef-07-cryptography_3.png
diff --git a/assets/img/ef/ef-07-cryptography_4.png b/public/assets/img/electronic-finance/ef-07-cryptography_4.png
similarity index 100%
rename from assets/img/ef/ef-07-cryptography_4.png
rename to public/assets/img/electronic-finance/ef-07-cryptography_4.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_1.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_1.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_1.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_1.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_10.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_10.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_10.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_10.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_11.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_11.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_11.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_11.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_12.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_12.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_12.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_12.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_13.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_13.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_13.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_13.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_14.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_14.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_14.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_14.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_15.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_15.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_15.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_15.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_16.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_16.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_16.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_16.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_17.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_17.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_17.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_17.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_18.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_18.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_18.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_18.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_2.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_2.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_2.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_2.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_3.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_3.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_3.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_3.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_4.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_4.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_4.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_4.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_5.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_5.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_5.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_5.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_6.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_6.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_6.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_6.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_7.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_7.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_7.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_7.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_8.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_8.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_8.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_8.png
diff --git a/assets/img/ef/ef-08-cryptocurrencies_9.png b/public/assets/img/electronic-finance/ef-08-cryptocurrencies_9.png
similarity index 100%
rename from assets/img/ef/ef-08-cryptocurrencies_9.png
rename to public/assets/img/electronic-finance/ef-08-cryptocurrencies_9.png
diff --git a/assets/img/ef/ef-09-digital-tokens_1.png b/public/assets/img/electronic-finance/ef-09-digital-tokens_1.png
similarity index 100%
rename from assets/img/ef/ef-09-digital-tokens_1.png
rename to public/assets/img/electronic-finance/ef-09-digital-tokens_1.png
diff --git a/assets/img/ef/ef-10-blockchain-technology.png b/public/assets/img/electronic-finance/ef-10-blockchain-technology.png
similarity index 100%
rename from assets/img/ef/ef-10-blockchain-technology.png
rename to public/assets/img/electronic-finance/ef-10-blockchain-technology.png
diff --git a/assets/img/essay/2026-01/culinary-class-wars.png b/public/assets/img/essay/2026-01/culinary-class-wars.png
similarity index 100%
rename from assets/img/essay/2026-01/culinary-class-wars.png
rename to public/assets/img/essay/2026-01/culinary-class-wars.png
diff --git a/assets/img/essay/2026-01/kudadak-system-architecture.png b/public/assets/img/essay/2026-01/kudadak-system-architecture.png
similarity index 100%
rename from assets/img/essay/2026-01/kudadak-system-architecture.png
rename to public/assets/img/essay/2026-01/kudadak-system-architecture.png
diff --git a/assets/img/essay/2026-01/ski.jpg b/public/assets/img/essay/2026-01/ski.jpg
similarity index 100%
rename from assets/img/essay/2026-01/ski.jpg
rename to public/assets/img/essay/2026-01/ski.jpg
diff --git a/assets/img/essay/2026-01/woowayouth_6th_ot.png b/public/assets/img/essay/2026-01/woowayouth_6th_ot.png
similarity index 100%
rename from assets/img/essay/2026-01/woowayouth_6th_ot.png
rename to public/assets/img/essay/2026-01/woowayouth_6th_ot.png
diff --git a/assets/img/etc/Foundations-Data_-Data_-Everywhere_certificate.png b/public/assets/img/etc/Foundations-Data_-Data_-Everywhere_certificate.png
similarity index 100%
rename from assets/img/etc/Foundations-Data_-Data_-Everywhere_certificate.png
rename to public/assets/img/etc/Foundations-Data_-Data_-Everywhere_certificate.png
diff --git a/assets/img/etc/Foundations-of-Project-Management_certificate.png b/public/assets/img/etc/Foundations-of-Project-Management_certificate.png
similarity index 100%
rename from assets/img/etc/Foundations-of-Project-Management_certificate.png
rename to public/assets/img/etc/Foundations-of-Project-Management_certificate.png
diff --git a/assets/img/etc/Foundations-of-User-Experience-_UX_-Design_certificate.png b/public/assets/img/etc/Foundations-of-User-Experience-_UX_-Design_certificate.png
similarity index 100%
rename from assets/img/etc/Foundations-of-User-Experience-_UX_-Design_certificate.png
rename to public/assets/img/etc/Foundations-of-User-Experience-_UX_-Design_certificate.png
diff --git a/assets/img/etc/Introduction-to-Back-End-Developmen_certificate.png b/public/assets/img/etc/Introduction-to-Back-End-Developmen_certificate.png
similarity index 100%
rename from assets/img/etc/Introduction-to-Back-End-Developmen_certificate.png
rename to public/assets/img/etc/Introduction-to-Back-End-Developmen_certificate.png
diff --git a/assets/img/etc/Introduction-to-Front-End-Development_certificate.png b/public/assets/img/etc/Introduction-to-Front-End-Development_certificate.png
similarity index 100%
rename from assets/img/etc/Introduction-to-Front-End-Development_certificate.png
rename to public/assets/img/etc/Introduction-to-Front-End-Development_certificate.png
diff --git a/assets/img/etc/aep_certification_junyongmoon.png b/public/assets/img/etc/aep_certification_junyongmoon.png
similarity index 100%
rename from assets/img/etc/aep_certification_junyongmoon.png
rename to public/assets/img/etc/aep_certification_junyongmoon.png
diff --git a/assets/img/etc/etc-liquid-syntax-error-1.png b/public/assets/img/etc/etc-liquid-syntax-error-1.png
similarity index 100%
rename from assets/img/etc/etc-liquid-syntax-error-1.png
rename to public/assets/img/etc/etc-liquid-syntax-error-1.png
diff --git a/assets/img/etc/etc-liquid-syntax-error-2.png b/public/assets/img/etc/etc-liquid-syntax-error-2.png
similarity index 100%
rename from assets/img/etc/etc-liquid-syntax-error-2.png
rename to public/assets/img/etc/etc-liquid-syntax-error-2.png
diff --git a/assets/img/etc/etc-liquid-syntax-error-3.png b/public/assets/img/etc/etc-liquid-syntax-error-3.png
similarity index 100%
rename from assets/img/etc/etc-liquid-syntax-error-3.png
rename to public/assets/img/etc/etc-liquid-syntax-error-3.png
diff --git a/assets/img/etc/etc-liquid-syntax-error-4.png b/public/assets/img/etc/etc-liquid-syntax-error-4.png
similarity index 100%
rename from assets/img/etc/etc-liquid-syntax-error-4.png
rename to public/assets/img/etc/etc-liquid-syntax-error-4.png
diff --git a/assets/img/etc/etc_chrome_bookmark.png b/public/assets/img/etc/etc_chrome_bookmark.png
similarity index 100%
rename from assets/img/etc/etc_chrome_bookmark.png
rename to public/assets/img/etc/etc_chrome_bookmark.png
diff --git a/assets/img/etc/etc_chrome_bookmark_1.png b/public/assets/img/etc/etc_chrome_bookmark_1.png
similarity index 100%
rename from assets/img/etc/etc_chrome_bookmark_1.png
rename to public/assets/img/etc/etc_chrome_bookmark_1.png
diff --git a/assets/img/etc/etc_chrome_bookmark_2.png b/public/assets/img/etc/etc_chrome_bookmark_2.png
similarity index 100%
rename from assets/img/etc/etc_chrome_bookmark_2.png
rename to public/assets/img/etc/etc_chrome_bookmark_2.png
diff --git a/assets/img/etc/etc_chrome_bookmark_3.png b/public/assets/img/etc/etc_chrome_bookmark_3.png
similarity index 100%
rename from assets/img/etc/etc_chrome_bookmark_3.png
rename to public/assets/img/etc/etc_chrome_bookmark_3.png
diff --git a/assets/img/etc/etc_chrome_bookmark_4.png b/public/assets/img/etc/etc_chrome_bookmark_4.png
similarity index 100%
rename from assets/img/etc/etc_chrome_bookmark_4.png
rename to public/assets/img/etc/etc_chrome_bookmark_4.png
diff --git a/assets/img/etc/geultto-9th-review-1.png b/public/assets/img/etc/geultto-9th-review-1.png
similarity index 100%
rename from assets/img/etc/geultto-9th-review-1.png
rename to public/assets/img/etc/geultto-9th-review-1.png
diff --git a/assets/img/etc/geultto-9th-review-2.png b/public/assets/img/etc/geultto-9th-review-2.png
similarity index 100%
rename from assets/img/etc/geultto-9th-review-2.png
rename to public/assets/img/etc/geultto-9th-review-2.png
diff --git a/assets/img/etc/geultto-9th-review-3.png b/public/assets/img/etc/geultto-9th-review-3.png
similarity index 100%
rename from assets/img/etc/geultto-9th-review-3.png
rename to public/assets/img/etc/geultto-9th-review-3.png
diff --git a/assets/img/etc/geultto_10th_No_More_Delays_Challenge.png b/public/assets/img/etc/geultto_10th_No_More_Delays_Challenge.png
similarity index 100%
rename from assets/img/etc/geultto_10th_No_More_Delays_Challenge.png
rename to public/assets/img/etc/geultto_10th_No_More_Delays_Challenge.png
diff --git a/assets/img/etc/geultto_10th_coffeechat.png b/public/assets/img/etc/geultto_10th_coffeechat.png
similarity index 100%
rename from assets/img/etc/geultto_10th_coffeechat.png
rename to public/assets/img/etc/geultto_10th_coffeechat.png
diff --git a/assets/img/etc/geultto_10th_kimjang.jpg b/public/assets/img/etc/geultto_10th_kimjang.jpg
similarity index 100%
rename from assets/img/etc/geultto_10th_kimjang.jpg
rename to public/assets/img/etc/geultto_10th_kimjang.jpg
diff --git a/assets/img/etc/geultto_10th_note.png b/public/assets/img/etc/geultto_10th_note.png
similarity index 100%
rename from assets/img/etc/geultto_10th_note.png
rename to public/assets/img/etc/geultto_10th_note.png
diff --git a/assets/img/etc/geultto_10th_retrospective.png b/public/assets/img/etc/geultto_10th_retrospective.png
similarity index 100%
rename from assets/img/etc/geultto_10th_retrospective.png
rename to public/assets/img/etc/geultto_10th_retrospective.png
diff --git a/assets/img/etc/geultto_10th_write_1.png b/public/assets/img/etc/geultto_10th_write_1.png
similarity index 100%
rename from assets/img/etc/geultto_10th_write_1.png
rename to public/assets/img/etc/geultto_10th_write_1.png
diff --git a/assets/img/etc/geultto_10th_write_2.png b/public/assets/img/etc/geultto_10th_write_2.png
similarity index 100%
rename from assets/img/etc/geultto_10th_write_2.png
rename to public/assets/img/etc/geultto_10th_write_2.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_0.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_0.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_0.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_0.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_1.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_1.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_1.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_1.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_2.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_2.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_2.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_2.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_3.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_3.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_3.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_3.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_4.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_4.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_4.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_4.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_5.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_5.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_5.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_5.png
diff --git a/assets/img/git/Git-My-Repository-Branch-Copy_6.png b/public/assets/img/git/Git-My-Repository-Branch-Copy_6.png
similarity index 100%
rename from assets/img/git/Git-My-Repository-Branch-Copy_6.png
rename to public/assets/img/git/Git-My-Repository-Branch-Copy_6.png
diff --git a/assets/img/git/Git-Version-Control-1.jpeg b/public/assets/img/git/Git-Version-Control-1.jpeg
similarity index 100%
rename from assets/img/git/Git-Version-Control-1.jpeg
rename to public/assets/img/git/Git-Version-Control-1.jpeg
diff --git a/assets/img/git/Git-Version-Control-2.png b/public/assets/img/git/Git-Version-Control-2.png
similarity index 100%
rename from assets/img/git/Git-Version-Control-2.png
rename to public/assets/img/git/Git-Version-Control-2.png
diff --git a/assets/img/git/Git_Workflow_1.png b/public/assets/img/git/Git_Workflow_1.png
similarity index 100%
rename from assets/img/git/Git_Workflow_1.png
rename to public/assets/img/git/Git_Workflow_1.png
diff --git a/assets/img/git/Git_Workflow_2.png b/public/assets/img/git/Git_Workflow_2.png
similarity index 100%
rename from assets/img/git/Git_Workflow_2.png
rename to public/assets/img/git/Git_Workflow_2.png
diff --git a/assets/img/git/Git_Workflow_3.png b/public/assets/img/git/Git_Workflow_3.png
similarity index 100%
rename from assets/img/git/Git_Workflow_3.png
rename to public/assets/img/git/Git_Workflow_3.png
diff --git a/assets/img/git/Git_Workflow_4.png b/public/assets/img/git/Git_Workflow_4.png
similarity index 100%
rename from assets/img/git/Git_Workflow_4.png
rename to public/assets/img/git/Git_Workflow_4.png
diff --git a/assets/img/git/Git_Workflow_5.png b/public/assets/img/git/Git_Workflow_5.png
similarity index 100%
rename from assets/img/git/Git_Workflow_5.png
rename to public/assets/img/git/Git_Workflow_5.png
diff --git a/assets/img/git/Git_Workflow_6.png b/public/assets/img/git/Git_Workflow_6.png
similarity index 100%
rename from assets/img/git/Git_Workflow_6.png
rename to public/assets/img/git/Git_Workflow_6.png
diff --git a/assets/img/git/git-docs-1-start-1.png b/public/assets/img/git/git-docs-1-start-1.png
similarity index 100%
rename from assets/img/git/git-docs-1-start-1.png
rename to public/assets/img/git/git-docs-1-start-1.png
diff --git a/assets/img/git/git-docs-1-start-2.png b/public/assets/img/git/git-docs-1-start-2.png
similarity index 100%
rename from assets/img/git/git-docs-1-start-2.png
rename to public/assets/img/git/git-docs-1-start-2.png
diff --git a/assets/img/git/git-docs-1-start-3.png b/public/assets/img/git/git-docs-1-start-3.png
similarity index 100%
rename from assets/img/git/git-docs-1-start-3.png
rename to public/assets/img/git/git-docs-1-start-3.png
diff --git a/assets/img/git/git-docs-1-start-4.png b/public/assets/img/git/git-docs-1-start-4.png
similarity index 100%
rename from assets/img/git/git-docs-1-start-4.png
rename to public/assets/img/git/git-docs-1-start-4.png
diff --git a/assets/img/git/git-docs-1-start-5.png b/public/assets/img/git/git-docs-1-start-5.png
similarity index 100%
rename from assets/img/git/git-docs-1-start-5.png
rename to public/assets/img/git/git-docs-1-start-5.png
diff --git a/assets/img/git/git-docs-branch-1.png b/public/assets/img/git/git-docs-branch-1.png
similarity index 100%
rename from assets/img/git/git-docs-branch-1.png
rename to public/assets/img/git/git-docs-branch-1.png
diff --git a/assets/img/git/git-docs-branch-2.png b/public/assets/img/git/git-docs-branch-2.png
similarity index 100%
rename from assets/img/git/git-docs-branch-2.png
rename to public/assets/img/git/git-docs-branch-2.png
diff --git a/assets/img/git/git-docs-branch-3.png b/public/assets/img/git/git-docs-branch-3.png
similarity index 100%
rename from assets/img/git/git-docs-branch-3.png
rename to public/assets/img/git/git-docs-branch-3.png
diff --git a/assets/img/git/git-docs-branch-4.png b/public/assets/img/git/git-docs-branch-4.png
similarity index 100%
rename from assets/img/git/git-docs-branch-4.png
rename to public/assets/img/git/git-docs-branch-4.png
diff --git a/assets/img/git/git-docs-branch-5.png b/public/assets/img/git/git-docs-branch-5.png
similarity index 100%
rename from assets/img/git/git-docs-branch-5.png
rename to public/assets/img/git/git-docs-branch-5.png
diff --git a/assets/img/git/git-master-merge-1.png b/public/assets/img/git/git-master-merge-1.png
similarity index 100%
rename from assets/img/git/git-master-merge-1.png
rename to public/assets/img/git/git-master-merge-1.png
diff --git a/assets/img/git/git-master-merge-10.png b/public/assets/img/git/git-master-merge-10.png
similarity index 100%
rename from assets/img/git/git-master-merge-10.png
rename to public/assets/img/git/git-master-merge-10.png
diff --git a/assets/img/git/git-master-merge-11.png b/public/assets/img/git/git-master-merge-11.png
similarity index 100%
rename from assets/img/git/git-master-merge-11.png
rename to public/assets/img/git/git-master-merge-11.png
diff --git a/assets/img/git/git-master-merge-2.png b/public/assets/img/git/git-master-merge-2.png
similarity index 100%
rename from assets/img/git/git-master-merge-2.png
rename to public/assets/img/git/git-master-merge-2.png
diff --git a/assets/img/git/git-master-merge-3.png b/public/assets/img/git/git-master-merge-3.png
similarity index 100%
rename from assets/img/git/git-master-merge-3.png
rename to public/assets/img/git/git-master-merge-3.png
diff --git a/assets/img/git/git-master-merge-4.png b/public/assets/img/git/git-master-merge-4.png
similarity index 100%
rename from assets/img/git/git-master-merge-4.png
rename to public/assets/img/git/git-master-merge-4.png
diff --git a/assets/img/git/git-master-merge-5.png b/public/assets/img/git/git-master-merge-5.png
similarity index 100%
rename from assets/img/git/git-master-merge-5.png
rename to public/assets/img/git/git-master-merge-5.png
diff --git a/assets/img/git/git-master-merge-6.png b/public/assets/img/git/git-master-merge-6.png
similarity index 100%
rename from assets/img/git/git-master-merge-6.png
rename to public/assets/img/git/git-master-merge-6.png
diff --git a/assets/img/git/git-master-merge-7.png b/public/assets/img/git/git-master-merge-7.png
similarity index 100%
rename from assets/img/git/git-master-merge-7.png
rename to public/assets/img/git/git-master-merge-7.png
diff --git a/assets/img/git/git-master-merge-8.png b/public/assets/img/git/git-master-merge-8.png
similarity index 100%
rename from assets/img/git/git-master-merge-8.png
rename to public/assets/img/git/git-master-merge-8.png
diff --git a/assets/img/git/git-master-merge-9.png b/public/assets/img/git/git-master-merge-9.png
similarity index 100%
rename from assets/img/git/git-master-merge-9.png
rename to public/assets/img/git/git-master-merge-9.png
diff --git a/assets/img/github_local_server.png b/public/assets/img/github_local_server.png
similarity index 100%
rename from assets/img/github_local_server.png
rename to public/assets/img/github_local_server.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-1.jpeg b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-1.jpeg
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-1.jpeg
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-1.jpeg
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-2.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-2.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-2.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-2.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-3.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-3.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-3.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-3.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-4.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-4.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-4.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-4.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-5.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-5.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-5.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-5.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-6.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-6.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-6.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-6.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-7.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-7.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-7.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-7.png
diff --git a/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-8.png b/public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-8.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-8.png
rename to public/assets/img/goodfriends/Goodfriends-EC2-Docker-Jenkins-8.png
diff --git a/assets/img/goodfriends/Goodfriends-Git-Flow-result.png b/public/assets/img/goodfriends/Goodfriends-Git-Flow-result.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Git-Flow-result.png
rename to public/assets/img/goodfriends/Goodfriends-Git-Flow-result.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-1.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-1.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-1.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-1.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-2.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-2.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-2.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-2.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-3.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-3.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-3.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-3.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-4.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-4.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-4.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-4.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-5.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-5.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-5.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-5.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-6.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-6.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-6.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-6.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-7.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-7.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-7.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-7.png
diff --git a/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-cerbot.png b/public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-cerbot.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-cerbot.png
rename to public/assets/img/goodfriends/Goodfriends-Nginx-SSL-HTTPS-cerbot.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_1.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_1.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_1.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_1.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_10.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_10.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_10.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_10.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_11.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_11.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_11.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_11.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_12.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_12.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_12.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_12.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_13.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_13.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_13.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_13.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_14.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_14.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_14.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_14.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_15.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_15.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_15.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_15.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_16.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_16.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_16.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_16.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_17.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_17.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_17.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_17.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_18.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_18.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_18.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_18.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_2.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_2.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_2.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_2.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_3.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_3.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_3.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_3.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_4.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_4.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_4.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_4.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_5.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_5.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_5.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_5.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_6.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_6.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_6.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_6.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_7.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_7.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_7.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_7.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_8.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_8.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_8.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_8.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_9.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_9.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_9.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_9.png
diff --git a/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_result.png b/public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_result.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_Aws_CloudWatch_result.png
rename to public/assets/img/goodfriends/Goodfriends_Aws_CloudWatch_result.png
diff --git a/assets/img/goodfriends/Goodfriends_RestController_result.png b/public/assets/img/goodfriends/Goodfriends_RestController_result.png
similarity index 100%
rename from assets/img/goodfriends/Goodfriends_RestController_result.png
rename to public/assets/img/goodfriends/Goodfriends_RestController_result.png
diff --git a/assets/img/goodfriends/agile_1.png b/public/assets/img/goodfriends/agile_1.png
similarity index 100%
rename from assets/img/goodfriends/agile_1.png
rename to public/assets/img/goodfriends/agile_1.png
diff --git a/assets/img/goodfriends/agile_2.png b/public/assets/img/goodfriends/agile_2.png
similarity index 100%
rename from assets/img/goodfriends/agile_2.png
rename to public/assets/img/goodfriends/agile_2.png
diff --git a/assets/img/goodfriends/agile_3.png b/public/assets/img/goodfriends/agile_3.png
similarity index 100%
rename from assets/img/goodfriends/agile_3.png
rename to public/assets/img/goodfriends/agile_3.png
diff --git a/assets/img/goodfriends/ddd_function_package_1.png b/public/assets/img/goodfriends/ddd_function_package_1.png
similarity index 100%
rename from assets/img/goodfriends/ddd_function_package_1.png
rename to public/assets/img/goodfriends/ddd_function_package_1.png
diff --git a/assets/img/goodfriends/ddd_function_package_2.png b/public/assets/img/goodfriends/ddd_function_package_2.png
similarity index 100%
rename from assets/img/goodfriends/ddd_function_package_2.png
rename to public/assets/img/goodfriends/ddd_function_package_2.png
diff --git a/assets/img/goodfriends/ddd_function_package_3.png b/public/assets/img/goodfriends/ddd_function_package_3.png
similarity index 100%
rename from assets/img/goodfriends/ddd_function_package_3.png
rename to public/assets/img/goodfriends/ddd_function_package_3.png
diff --git a/assets/img/goodfriends/event-storming-1.png b/public/assets/img/goodfriends/event-storming-1.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-1.png
rename to public/assets/img/goodfriends/event-storming-1.png
diff --git a/assets/img/goodfriends/event-storming-2.png b/public/assets/img/goodfriends/event-storming-2.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-2.png
rename to public/assets/img/goodfriends/event-storming-2.png
diff --git a/assets/img/goodfriends/event-storming-4.png b/public/assets/img/goodfriends/event-storming-4.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-4.png
rename to public/assets/img/goodfriends/event-storming-4.png
diff --git a/assets/img/goodfriends/event-storming-5.png b/public/assets/img/goodfriends/event-storming-5.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-5.png
rename to public/assets/img/goodfriends/event-storming-5.png
diff --git a/assets/img/goodfriends/event-storming-6.png b/public/assets/img/goodfriends/event-storming-6.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-6.png
rename to public/assets/img/goodfriends/event-storming-6.png
diff --git a/assets/img/goodfriends/event-storming-end.png b/public/assets/img/goodfriends/event-storming-end.png
similarity index 100%
rename from assets/img/goodfriends/event-storming-end.png
rename to public/assets/img/goodfriends/event-storming-end.png
diff --git a/assets/img/goodfriends/event-stroming-3.png b/public/assets/img/goodfriends/event-stroming-3.png
similarity index 100%
rename from assets/img/goodfriends/event-stroming-3.png
rename to public/assets/img/goodfriends/event-stroming-3.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-1.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-1.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-1.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-1.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-10.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-10.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-10.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-10.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-11.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-11.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-11.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-11.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-12.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-12.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-12.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-12.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-13.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-13.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-13.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-13.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-14.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-14.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-14.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-14.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-2.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-2.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-2.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-2.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-3.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-3.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-3.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-3.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-4.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-4.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-4.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-4.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-5.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-5.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-5.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-5.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-6.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-6.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-6.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-6.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-7.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-7.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-7.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-7.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-8.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-8.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-8.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-8.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-9.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-9.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-9.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-backend-9.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-1.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-1.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-1.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-1.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-2.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-2.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-2.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-2.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-3.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-3.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-3.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-3.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-4.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-4.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-4.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-4.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-5.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-5.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-5.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-5.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-6.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-6.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-6.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-6.png
diff --git a/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-7.png b/public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-7.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-7.png
rename to public/assets/img/goodfriends/goodfriends-jenkins-pipeline-frontend-7.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-1.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-1.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-1.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-1.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-10.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-10.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-10.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-10.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-11.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-11.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-11.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-11.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-12.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-12.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-12.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-12.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-13.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-13.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-13.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-13.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-14.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-14.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-14.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-14.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-15.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-15.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-15.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-15.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-16.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-16.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-16.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-16.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-17.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-17.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-17.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-17.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-18.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-18.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-18.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-18.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-19.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-19.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-19.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-19.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-2.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-2.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-2.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-2.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-20.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-20.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-20.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-20.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-21.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-21.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-21.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-21.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-3.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-3.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-3.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-3.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-4.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-4.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-4.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-4.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-5.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-5.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-5.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-5.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-6.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-6.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-6.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-6.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-7.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-7.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-7.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-7.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-8.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-8.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-8.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-8.png
diff --git a/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-9.png b/public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-9.png
similarity index 100%
rename from assets/img/goodfriends/goodfriends-pr-label-jenkins-build-9.png
rename to public/assets/img/goodfriends/goodfriends-pr-label-jenkins-build-9.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-0.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-0.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-0.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-0.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-1.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-1.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-1.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-1.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-2.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-2.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-2.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-2.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-1.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-1.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-1.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-1.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-2.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-2.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-2.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-3-2.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-4.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-4.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-4.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-4.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-5.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-5.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-5.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-5.png
diff --git a/assets/img/goodfriends/order-refactor-findAllMyProductOrders-6.png b/public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-6.png
similarity index 100%
rename from assets/img/goodfriends/order-refactor-findAllMyProductOrders-6.png
rename to public/assets/img/goodfriends/order-refactor-findAllMyProductOrders-6.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-1.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-1.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-1.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-1.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-2.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-2.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-2.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-2.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-3.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-3.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-3.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-3.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-4.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-4.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-4.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-4.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-5.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-5.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-5.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-5.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-6.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-6.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-6.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-6.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-7.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-7.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-7.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-7.png
diff --git a/assets/img/hibit/Hibit-Concurrency-Problem-Solving-8.png b/public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-8.png
similarity index 100%
rename from assets/img/hibit/Hibit-Concurrency-Problem-Solving-8.png
rename to public/assets/img/hibit/Hibit-Concurrency-Problem-Solving-8.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-1.png b/public/assets/img/hibit/Hibit-Performance-Testing-1.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-1.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-1.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-10.png b/public/assets/img/hibit/Hibit-Performance-Testing-10.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-10.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-10.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-2.png b/public/assets/img/hibit/Hibit-Performance-Testing-2.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-2.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-2.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-3.png b/public/assets/img/hibit/Hibit-Performance-Testing-3.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-3.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-3.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-4.png b/public/assets/img/hibit/Hibit-Performance-Testing-4.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-4.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-4.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-5.png b/public/assets/img/hibit/Hibit-Performance-Testing-5.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-5.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-5.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-6.png b/public/assets/img/hibit/Hibit-Performance-Testing-6.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-6.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-6.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-7.png b/public/assets/img/hibit/Hibit-Performance-Testing-7.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-7.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-7.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-8.png b/public/assets/img/hibit/Hibit-Performance-Testing-8.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-8.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-8.png
diff --git a/assets/img/hibit/Hibit-Performance-Testing-9.png b/public/assets/img/hibit/Hibit-Performance-Testing-9.png
similarity index 100%
rename from assets/img/hibit/Hibit-Performance-Testing-9.png
rename to public/assets/img/hibit/Hibit-Performance-Testing-9.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-0.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-0.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-0.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-0.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-1.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-1.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-1.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-1.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-2.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-2.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-2.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-2.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-3.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-3.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-3.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-3.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-4.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-4.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-4.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-4.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-5.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-5.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-5.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-5.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-6.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-6.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-6.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-6.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-7.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-7.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-7.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-7.png
diff --git a/assets/img/hibit/Hibit-Retrospective-Version2-8.png b/public/assets/img/hibit/Hibit-Retrospective-Version2-8.png
similarity index 100%
rename from assets/img/hibit/Hibit-Retrospective-Version2-8.png
rename to public/assets/img/hibit/Hibit-Retrospective-Version2-8.png
diff --git a/assets/img/hibit/Hibit-ViewManager-Abusing-1.png b/public/assets/img/hibit/Hibit-ViewManager-Abusing-1.png
similarity index 100%
rename from assets/img/hibit/Hibit-ViewManager-Abusing-1.png
rename to public/assets/img/hibit/Hibit-ViewManager-Abusing-1.png
diff --git a/assets/img/hibit/Hibit-ViewManager-Abusing-2.png b/public/assets/img/hibit/Hibit-ViewManager-Abusing-2.png
similarity index 100%
rename from assets/img/hibit/Hibit-ViewManager-Abusing-2.png
rename to public/assets/img/hibit/Hibit-ViewManager-Abusing-2.png
diff --git a/assets/img/hibit/Hibit-ViewManager-Abusing-3.png b/public/assets/img/hibit/Hibit-ViewManager-Abusing-3.png
similarity index 100%
rename from assets/img/hibit/Hibit-ViewManager-Abusing-3.png
rename to public/assets/img/hibit/Hibit-ViewManager-Abusing-3.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-1.png b/public/assets/img/hibit/hibit-spring-rest-docs-1.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-1.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-1.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-2.png b/public/assets/img/hibit/hibit-spring-rest-docs-2.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-2.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-2.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-3.png b/public/assets/img/hibit/hibit-spring-rest-docs-3.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-3.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-3.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-4.png b/public/assets/img/hibit/hibit-spring-rest-docs-4.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-4.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-4.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-5.png b/public/assets/img/hibit/hibit-spring-rest-docs-5.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-5.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-5.png
diff --git a/assets/img/hibit/hibit-spring-rest-docs-6.png b/public/assets/img/hibit/hibit-spring-rest-docs-6.png
similarity index 100%
rename from assets/img/hibit/hibit-spring-rest-docs-6.png
rename to public/assets/img/hibit/hibit-spring-rest-docs-6.png
diff --git a/assets/img/hibit/spring-rest-docs-plugin-ascii.png b/public/assets/img/hibit/spring-rest-docs-plugin-ascii.png
similarity index 100%
rename from assets/img/hibit/spring-rest-docs-plugin-ascii.png
rename to public/assets/img/hibit/spring-rest-docs-plugin-ascii.png
diff --git a/assets/img/http/http-1-basic-1.png b/public/assets/img/http/http-1-basic-1.png
similarity index 100%
rename from assets/img/http/http-1-basic-1.png
rename to public/assets/img/http/http-1-basic-1.png
diff --git a/assets/img/http/http-2-basic-1.png b/public/assets/img/http/http-2-basic-1.png
similarity index 100%
rename from assets/img/http/http-2-basic-1.png
rename to public/assets/img/http/http-2-basic-1.png
diff --git a/assets/img/http/http-2-basic-2.png b/public/assets/img/http/http-2-basic-2.png
similarity index 100%
rename from assets/img/http/http-2-basic-2.png
rename to public/assets/img/http/http-2-basic-2.png
diff --git a/assets/img/http/http-2-basic-3.png b/public/assets/img/http/http-2-basic-3.png
similarity index 100%
rename from assets/img/http/http-2-basic-3.png
rename to public/assets/img/http/http-2-basic-3.png
diff --git a/assets/img/http/http-5-status-code.png b/public/assets/img/http/http-5-status-code.png
similarity index 100%
rename from assets/img/http/http-5-status-code.png
rename to public/assets/img/http/http-5-status-code.png
diff --git a/assets/img/http/http-6-header1_1.png b/public/assets/img/http/http-6-header1_1.png
similarity index 100%
rename from assets/img/http/http-6-header1_1.png
rename to public/assets/img/http/http-6-header1_1.png
diff --git a/assets/img/http/http-6-header1_2.png b/public/assets/img/http/http-6-header1_2.png
similarity index 100%
rename from assets/img/http/http-6-header1_2.png
rename to public/assets/img/http/http-6-header1_2.png
diff --git a/assets/img/http/http-6-header2_0.png b/public/assets/img/http/http-6-header2_0.png
similarity index 100%
rename from assets/img/http/http-6-header2_0.png
rename to public/assets/img/http/http-6-header2_0.png
diff --git a/assets/img/http/http-6-header2_1.png b/public/assets/img/http/http-6-header2_1.png
similarity index 100%
rename from assets/img/http/http-6-header2_1.png
rename to public/assets/img/http/http-6-header2_1.png
diff --git a/assets/img/http/http-6-header2_2.png b/public/assets/img/http/http-6-header2_2.png
similarity index 100%
rename from assets/img/http/http-6-header2_2.png
rename to public/assets/img/http/http-6-header2_2.png
diff --git a/assets/img/http/http-6-header2_3.png b/public/assets/img/http/http-6-header2_3.png
similarity index 100%
rename from assets/img/http/http-6-header2_3.png
rename to public/assets/img/http/http-6-header2_3.png
diff --git a/assets/img/http/http-6-header2_4.png b/public/assets/img/http/http-6-header2_4.png
similarity index 100%
rename from assets/img/http/http-6-header2_4.png
rename to public/assets/img/http/http-6-header2_4.png
diff --git a/assets/img/http/http-6-header3_1.png b/public/assets/img/http/http-6-header3_1.png
similarity index 100%
rename from assets/img/http/http-6-header3_1.png
rename to public/assets/img/http/http-6-header3_1.png
diff --git a/assets/img/http/http-6-header3_2.png b/public/assets/img/http/http-6-header3_2.png
similarity index 100%
rename from assets/img/http/http-6-header3_2.png
rename to public/assets/img/http/http-6-header3_2.png
diff --git a/assets/img/http/http-6-header6_1.png b/public/assets/img/http/http-6-header6_1.png
similarity index 100%
rename from assets/img/http/http-6-header6_1.png
rename to public/assets/img/http/http-6-header6_1.png
diff --git a/assets/img/http/http-6-header8-1.png b/public/assets/img/http/http-6-header8-1.png
similarity index 100%
rename from assets/img/http/http-6-header8-1.png
rename to public/assets/img/http/http-6-header8-1.png
diff --git a/assets/img/http/http-6-header8-2.png b/public/assets/img/http/http-6-header8-2.png
similarity index 100%
rename from assets/img/http/http-6-header8-2.png
rename to public/assets/img/http/http-6-header8-2.png
diff --git a/assets/img/http/http-7-header2_1.png b/public/assets/img/http/http-7-header2_1.png
similarity index 100%
rename from assets/img/http/http-7-header2_1.png
rename to public/assets/img/http/http-7-header2_1.png
diff --git a/assets/img/http/http-7-header2_2.png b/public/assets/img/http/http-7-header2_2.png
similarity index 100%
rename from assets/img/http/http-7-header2_2.png
rename to public/assets/img/http/http-7-header2_2.png
diff --git a/assets/img/http/http-7-header2_3.png b/public/assets/img/http/http-7-header2_3.png
similarity index 100%
rename from assets/img/http/http-7-header2_3.png
rename to public/assets/img/http/http-7-header2_3.png
diff --git a/assets/img/http/http-7-header2_4.png b/public/assets/img/http/http-7-header2_4.png
similarity index 100%
rename from assets/img/http/http-7-header2_4.png
rename to public/assets/img/http/http-7-header2_4.png
diff --git a/assets/img/http/http-7-header2_5.png b/public/assets/img/http/http-7-header2_5.png
similarity index 100%
rename from assets/img/http/http-7-header2_5.png
rename to public/assets/img/http/http-7-header2_5.png
diff --git a/assets/img/http/http-7-header2_6.png b/public/assets/img/http/http-7-header2_6.png
similarity index 100%
rename from assets/img/http/http-7-header2_6.png
rename to public/assets/img/http/http-7-header2_6.png
diff --git a/assets/img/http/http-7-header2_7.png b/public/assets/img/http/http-7-header2_7.png
similarity index 100%
rename from assets/img/http/http-7-header2_7.png
rename to public/assets/img/http/http-7-header2_7.png
diff --git a/assets/img/http/http-7-header2_8.png b/public/assets/img/http/http-7-header2_8.png
similarity index 100%
rename from assets/img/http/http-7-header2_8.png
rename to public/assets/img/http/http-7-header2_8.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_1.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_1.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_1.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_1.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_2.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_2.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_2.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_2.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_3.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_3.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_3.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_3.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_4.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_4.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_4.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_4.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_5.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_5.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_5.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_5.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_6.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_6.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_6.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_6.png
diff --git a/assets/img/intellij/IntelliJ-Class-Diagram_7.png b/public/assets/img/intellij/IntelliJ-Class-Diagram_7.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Class-Diagram_7.png
rename to public/assets/img/intellij/IntelliJ-Class-Diagram_7.png
diff --git a/assets/img/intellij/IntelliJ-Connection-Git-Repository_1.png b/public/assets/img/intellij/IntelliJ-Connection-Git-Repository_1.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Connection-Git-Repository_1.png
rename to public/assets/img/intellij/IntelliJ-Connection-Git-Repository_1.png
diff --git a/assets/img/intellij/IntelliJ-Connection-Git-Repository_2.png b/public/assets/img/intellij/IntelliJ-Connection-Git-Repository_2.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Connection-Git-Repository_2.png
rename to public/assets/img/intellij/IntelliJ-Connection-Git-Repository_2.png
diff --git a/assets/img/intellij/IntelliJ-Connection-Git-Repository_3.png b/public/assets/img/intellij/IntelliJ-Connection-Git-Repository_3.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Connection-Git-Repository_3.png
rename to public/assets/img/intellij/IntelliJ-Connection-Git-Repository_3.png
diff --git a/assets/img/intellij/IntelliJ-Connection-Git-Repository_4.png b/public/assets/img/intellij/IntelliJ-Connection-Git-Repository_4.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Connection-Git-Repository_4.png
rename to public/assets/img/intellij/IntelliJ-Connection-Git-Repository_4.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_1.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_1.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_1.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_1.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_2.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_2.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_2.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_2.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3_2.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3_2.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3_2.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_3_2.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_4.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_4.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_4.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_4.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_5.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_5.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_5.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_5.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_6.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_6.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_6.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_6.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_7.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_7.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_7.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_7.png
diff --git a/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_8.png b/public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_8.png
similarity index 100%
rename from assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_8.png
rename to public/assets/img/intellij/IntelliJ-Jdk-Version-Change-M1-MacOS_8.png
diff --git a/assets/img/intellij/intellij-live-template-1.png b/public/assets/img/intellij/intellij-live-template-1.png
similarity index 100%
rename from assets/img/intellij/intellij-live-template-1.png
rename to public/assets/img/intellij/intellij-live-template-1.png
diff --git a/assets/img/intellij/intellij_shortKey_testCode.png b/public/assets/img/intellij/intellij_shortKey_testCode.png
similarity index 100%
rename from assets/img/intellij/intellij_shortKey_testCode.png
rename to public/assets/img/intellij/intellij_shortKey_testCode.png
diff --git a/assets/img/java/Java-Difference-Throw-Throws-1.png b/public/assets/img/java/Java-Difference-Throw-Throws-1.png
similarity index 100%
rename from assets/img/java/Java-Difference-Throw-Throws-1.png
rename to public/assets/img/java/Java-Difference-Throw-Throws-1.png
diff --git a/assets/img/java/hashCode-equals.png b/public/assets/img/java/hashCode-equals.png
similarity index 100%
rename from assets/img/java/hashCode-equals.png
rename to public/assets/img/java/hashCode-equals.png
diff --git a/assets/img/java/java-arrayList-linkedList-1.jpg b/public/assets/img/java/java-arrayList-linkedList-1.jpg
similarity index 100%
rename from assets/img/java/java-arrayList-linkedList-1.jpg
rename to public/assets/img/java/java-arrayList-linkedList-1.jpg
diff --git a/assets/img/java/java-arrayList-linkedList-2.png b/public/assets/img/java/java-arrayList-linkedList-2.png
similarity index 100%
rename from assets/img/java/java-arrayList-linkedList-2.png
rename to public/assets/img/java/java-arrayList-linkedList-2.png
diff --git a/assets/img/java/java_string_methods.png b/public/assets/img/java/java_string_methods.png
similarity index 100%
rename from assets/img/java/java_string_methods.png
rename to public/assets/img/java/java_string_methods.png
diff --git a/assets/img/java/queue.png b/public/assets/img/java/queue.png
similarity index 100%
rename from assets/img/java/queue.png
rename to public/assets/img/java/queue.png
diff --git a/assets/img/java/stack.png b/public/assets/img/java/stack.png
similarity index 100%
rename from assets/img/java/stack.png
rename to public/assets/img/java/stack.png
diff --git a/assets/img/javaScript/javaScript_2-3.png b/public/assets/img/javaScript/javaScript_2-3.png
similarity index 100%
rename from assets/img/javaScript/javaScript_2-3.png
rename to public/assets/img/javaScript/javaScript_2-3.png
diff --git a/assets/img/javaScript/javaScript_2_1.png b/public/assets/img/javaScript/javaScript_2_1.png
similarity index 100%
rename from assets/img/javaScript/javaScript_2_1.png
rename to public/assets/img/javaScript/javaScript_2_1.png
diff --git a/assets/img/javaScript/javaScript_2_2.png b/public/assets/img/javaScript/javaScript_2_2.png
similarity index 100%
rename from assets/img/javaScript/javaScript_2_2.png
rename to public/assets/img/javaScript/javaScript_2_2.png
diff --git a/assets/img/javaScript/javaScript_2_4.png b/public/assets/img/javaScript/javaScript_2_4.png
similarity index 100%
rename from assets/img/javaScript/javaScript_2_4.png
rename to public/assets/img/javaScript/javaScript_2_4.png
diff --git a/assets/img/jpa/JPA-Advanced-Mapping-1.png b/public/assets/img/jpa/JPA-Advanced-Mapping-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Advanced-Mapping-1.png
rename to public/assets/img/jpa/JPA-Advanced-Mapping-1.png
diff --git a/assets/img/jpa/JPA-Advanced-Mapping-2.png b/public/assets/img/jpa/JPA-Advanced-Mapping-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Advanced-Mapping-2.png
rename to public/assets/img/jpa/JPA-Advanced-Mapping-2.png
diff --git a/assets/img/jpa/JPA-Advanced-Mapping-3.png b/public/assets/img/jpa/JPA-Advanced-Mapping-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Advanced-Mapping-3.png
rename to public/assets/img/jpa/JPA-Advanced-Mapping-3.png
diff --git a/assets/img/jpa/JPA-Advanced-Mapping-4.png b/public/assets/img/jpa/JPA-Advanced-Mapping-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Advanced-Mapping-4.png
rename to public/assets/img/jpa/JPA-Advanced-Mapping-4.png
diff --git a/assets/img/jpa/JPA-Advanced-Mapping-5.png b/public/assets/img/jpa/JPA-Advanced-Mapping-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Advanced-Mapping-5.png
rename to public/assets/img/jpa/JPA-Advanced-Mapping-5.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-1.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-1.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-1.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-10.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-10.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-10.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-10.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-11.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-11.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-11.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-11.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-12.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-12.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-12.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-12.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-2.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-2.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-2.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-3.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-3.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-3.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-4.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-4.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-4.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-5.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-5.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-5.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-6.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-6.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-6.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-7.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-7.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-7.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-7.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-8.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-8.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-8.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-8.png
diff --git a/assets/img/jpa/JPA-Diverse-Relationship-Mapping-9.png b/public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-9.png
similarity index 100%
rename from assets/img/jpa/JPA-Diverse-Relationship-Mapping-9.png
rename to public/assets/img/jpa/JPA-Diverse-Relationship-Mapping-9.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-1.png b/public/assets/img/jpa/JPA-Entity-Mapping-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-1.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-1.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-2.png b/public/assets/img/jpa/JPA-Entity-Mapping-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-2.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-2.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-3.png b/public/assets/img/jpa/JPA-Entity-Mapping-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-3.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-3.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-4.png b/public/assets/img/jpa/JPA-Entity-Mapping-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-4.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-4.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-5.png b/public/assets/img/jpa/JPA-Entity-Mapping-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-5.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-5.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-6.png b/public/assets/img/jpa/JPA-Entity-Mapping-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-6.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-6.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-7.png b/public/assets/img/jpa/JPA-Entity-Mapping-7.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-7.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-7.png
diff --git a/assets/img/jpa/JPA-Entity-Mapping-8.png b/public/assets/img/jpa/JPA-Entity-Mapping-8.png
similarity index 100%
rename from assets/img/jpa/JPA-Entity-Mapping-8.png
rename to public/assets/img/jpa/JPA-Entity-Mapping-8.png
diff --git a/assets/img/jpa/JPA-EntityGraph-1.png b/public/assets/img/jpa/JPA-EntityGraph-1.png
similarity index 100%
rename from assets/img/jpa/JPA-EntityGraph-1.png
rename to public/assets/img/jpa/JPA-EntityGraph-1.png
diff --git a/assets/img/jpa/JPA-EntityGraph-2.png b/public/assets/img/jpa/JPA-EntityGraph-2.png
similarity index 100%
rename from assets/img/jpa/JPA-EntityGraph-2.png
rename to public/assets/img/jpa/JPA-EntityGraph-2.png
diff --git a/assets/img/jpa/JPA-EntityGraph-3.png b/public/assets/img/jpa/JPA-EntityGraph-3.png
similarity index 100%
rename from assets/img/jpa/JPA-EntityGraph-3.png
rename to public/assets/img/jpa/JPA-EntityGraph-3.png
diff --git a/assets/img/jpa/JPA-EntityGraph-4.png b/public/assets/img/jpa/JPA-EntityGraph-4.png
similarity index 100%
rename from assets/img/jpa/JPA-EntityGraph-4.png
rename to public/assets/img/jpa/JPA-EntityGraph-4.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-1.png b/public/assets/img/jpa/JPA-Persistence-Context-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-1.png
rename to public/assets/img/jpa/JPA-Persistence-Context-1.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-10.png b/public/assets/img/jpa/JPA-Persistence-Context-10.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-10.png
rename to public/assets/img/jpa/JPA-Persistence-Context-10.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-11.png b/public/assets/img/jpa/JPA-Persistence-Context-11.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-11.png
rename to public/assets/img/jpa/JPA-Persistence-Context-11.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-2.png b/public/assets/img/jpa/JPA-Persistence-Context-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-2.png
rename to public/assets/img/jpa/JPA-Persistence-Context-2.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-3.png b/public/assets/img/jpa/JPA-Persistence-Context-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-3.png
rename to public/assets/img/jpa/JPA-Persistence-Context-3.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-4.png b/public/assets/img/jpa/JPA-Persistence-Context-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-4.png
rename to public/assets/img/jpa/JPA-Persistence-Context-4.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-5.png b/public/assets/img/jpa/JPA-Persistence-Context-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-5.png
rename to public/assets/img/jpa/JPA-Persistence-Context-5.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-6.png b/public/assets/img/jpa/JPA-Persistence-Context-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-6.png
rename to public/assets/img/jpa/JPA-Persistence-Context-6.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-7.png b/public/assets/img/jpa/JPA-Persistence-Context-7.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-7.png
rename to public/assets/img/jpa/JPA-Persistence-Context-7.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-8.png b/public/assets/img/jpa/JPA-Persistence-Context-8.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-8.png
rename to public/assets/img/jpa/JPA-Persistence-Context-8.png
diff --git a/assets/img/jpa/JPA-Persistence-Context-9.png b/public/assets/img/jpa/JPA-Persistence-Context-9.png
similarity index 100%
rename from assets/img/jpa/JPA-Persistence-Context-9.png
rename to public/assets/img/jpa/JPA-Persistence-Context-9.png
diff --git a/assets/img/jpa/JPA-Proxy-1.png b/public/assets/img/jpa/JPA-Proxy-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-1.png
rename to public/assets/img/jpa/JPA-Proxy-1.png
diff --git a/assets/img/jpa/JPA-Proxy-2.png b/public/assets/img/jpa/JPA-Proxy-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-2.png
rename to public/assets/img/jpa/JPA-Proxy-2.png
diff --git a/assets/img/jpa/JPA-Proxy-3.png b/public/assets/img/jpa/JPA-Proxy-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-3.png
rename to public/assets/img/jpa/JPA-Proxy-3.png
diff --git a/assets/img/jpa/JPA-Proxy-4.png b/public/assets/img/jpa/JPA-Proxy-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-4.png
rename to public/assets/img/jpa/JPA-Proxy-4.png
diff --git a/assets/img/jpa/JPA-Proxy-5.png b/public/assets/img/jpa/JPA-Proxy-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-5.png
rename to public/assets/img/jpa/JPA-Proxy-5.png
diff --git a/assets/img/jpa/JPA-Proxy-6.png b/public/assets/img/jpa/JPA-Proxy-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-6.png
rename to public/assets/img/jpa/JPA-Proxy-6.png
diff --git a/assets/img/jpa/JPA-Proxy-7.png b/public/assets/img/jpa/JPA-Proxy-7.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-7.png
rename to public/assets/img/jpa/JPA-Proxy-7.png
diff --git a/assets/img/jpa/JPA-Proxy-8.png b/public/assets/img/jpa/JPA-Proxy-8.png
similarity index 100%
rename from assets/img/jpa/JPA-Proxy-8.png
rename to public/assets/img/jpa/JPA-Proxy-8.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-1.png b/public/assets/img/jpa/JPA-Relationship-Mapping-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-1.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-1.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-2.png b/public/assets/img/jpa/JPA-Relationship-Mapping-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-2.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-2.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-3.png b/public/assets/img/jpa/JPA-Relationship-Mapping-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-3.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-3.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-4.png b/public/assets/img/jpa/JPA-Relationship-Mapping-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-4.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-4.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-5.png b/public/assets/img/jpa/JPA-Relationship-Mapping-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-5.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-5.png
diff --git a/assets/img/jpa/JPA-Relationship-Mapping-6.png b/public/assets/img/jpa/JPA-Relationship-Mapping-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Relationship-Mapping-6.png
rename to public/assets/img/jpa/JPA-Relationship-Mapping-6.png
diff --git a/assets/img/jpa/JPA-Value-Type-1.png b/public/assets/img/jpa/JPA-Value-Type-1.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-1.png
rename to public/assets/img/jpa/JPA-Value-Type-1.png
diff --git a/assets/img/jpa/JPA-Value-Type-10.png b/public/assets/img/jpa/JPA-Value-Type-10.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-10.png
rename to public/assets/img/jpa/JPA-Value-Type-10.png
diff --git a/assets/img/jpa/JPA-Value-Type-11.png b/public/assets/img/jpa/JPA-Value-Type-11.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-11.png
rename to public/assets/img/jpa/JPA-Value-Type-11.png
diff --git a/assets/img/jpa/JPA-Value-Type-12.png b/public/assets/img/jpa/JPA-Value-Type-12.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-12.png
rename to public/assets/img/jpa/JPA-Value-Type-12.png
diff --git a/assets/img/jpa/JPA-Value-Type-13.png b/public/assets/img/jpa/JPA-Value-Type-13.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-13.png
rename to public/assets/img/jpa/JPA-Value-Type-13.png
diff --git a/assets/img/jpa/JPA-Value-Type-2.png b/public/assets/img/jpa/JPA-Value-Type-2.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-2.png
rename to public/assets/img/jpa/JPA-Value-Type-2.png
diff --git a/assets/img/jpa/JPA-Value-Type-3.png b/public/assets/img/jpa/JPA-Value-Type-3.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-3.png
rename to public/assets/img/jpa/JPA-Value-Type-3.png
diff --git a/assets/img/jpa/JPA-Value-Type-4.png b/public/assets/img/jpa/JPA-Value-Type-4.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-4.png
rename to public/assets/img/jpa/JPA-Value-Type-4.png
diff --git a/assets/img/jpa/JPA-Value-Type-5.png b/public/assets/img/jpa/JPA-Value-Type-5.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-5.png
rename to public/assets/img/jpa/JPA-Value-Type-5.png
diff --git a/assets/img/jpa/JPA-Value-Type-6.png b/public/assets/img/jpa/JPA-Value-Type-6.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-6.png
rename to public/assets/img/jpa/JPA-Value-Type-6.png
diff --git a/assets/img/jpa/JPA-Value-Type-7.png b/public/assets/img/jpa/JPA-Value-Type-7.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-7.png
rename to public/assets/img/jpa/JPA-Value-Type-7.png
diff --git a/assets/img/jpa/JPA-Value-Type-8.png b/public/assets/img/jpa/JPA-Value-Type-8.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-8.png
rename to public/assets/img/jpa/JPA-Value-Type-8.png
diff --git a/assets/img/jpa/JPA-Value-Type-9.png b/public/assets/img/jpa/JPA-Value-Type-9.png
similarity index 100%
rename from assets/img/jpa/JPA-Value-Type-9.png
rename to public/assets/img/jpa/JPA-Value-Type-9.png
diff --git a/assets/img/kafka/Kafka-Consumer-1.png b/public/assets/img/kafka/Kafka-Consumer-1.png
similarity index 100%
rename from assets/img/kafka/Kafka-Consumer-1.png
rename to public/assets/img/kafka/Kafka-Consumer-1.png
diff --git a/assets/img/kafka/Kafka-Consumer-2.png b/public/assets/img/kafka/Kafka-Consumer-2.png
similarity index 100%
rename from assets/img/kafka/Kafka-Consumer-2.png
rename to public/assets/img/kafka/Kafka-Consumer-2.png
diff --git a/assets/img/kafka/Kafka-Consumer-3.png b/public/assets/img/kafka/Kafka-Consumer-3.png
similarity index 100%
rename from assets/img/kafka/Kafka-Consumer-3.png
rename to public/assets/img/kafka/Kafka-Consumer-3.png
diff --git a/assets/img/kafka/Kafka-Consumer-4.png b/public/assets/img/kafka/Kafka-Consumer-4.png
similarity index 100%
rename from assets/img/kafka/Kafka-Consumer-4.png
rename to public/assets/img/kafka/Kafka-Consumer-4.png
diff --git a/assets/img/kafka/Kafka-Consumer-5.png b/public/assets/img/kafka/Kafka-Consumer-5.png
similarity index 100%
rename from assets/img/kafka/Kafka-Consumer-5.png
rename to public/assets/img/kafka/Kafka-Consumer-5.png
diff --git a/assets/img/kafka/Kafka-Installation-Sizing-Guide-1.png b/public/assets/img/kafka/Kafka-Installation-Sizing-Guide-1.png
similarity index 100%
rename from assets/img/kafka/Kafka-Installation-Sizing-Guide-1.png
rename to public/assets/img/kafka/Kafka-Installation-Sizing-Guide-1.png
diff --git a/assets/img/kafka/Kafka-Installation-Sizing-Guide-2.png b/public/assets/img/kafka/Kafka-Installation-Sizing-Guide-2.png
similarity index 100%
rename from assets/img/kafka/Kafka-Installation-Sizing-Guide-2.png
rename to public/assets/img/kafka/Kafka-Installation-Sizing-Guide-2.png
diff --git a/assets/img/kafka/Kafka-Producer-3-1.png b/public/assets/img/kafka/Kafka-Producer-3-1.png
similarity index 100%
rename from assets/img/kafka/Kafka-Producer-3-1.png
rename to public/assets/img/kafka/Kafka-Producer-3-1.png
diff --git a/assets/img/kafka/Kafka-Producer-3-2.png b/public/assets/img/kafka/Kafka-Producer-3-2.png
similarity index 100%
rename from assets/img/kafka/Kafka-Producer-3-2.png
rename to public/assets/img/kafka/Kafka-Producer-3-2.png
diff --git a/assets/img/kafka/Kafka-Producer-Test-1.png b/public/assets/img/kafka/Kafka-Producer-Test-1.png
similarity index 100%
rename from assets/img/kafka/Kafka-Producer-Test-1.png
rename to public/assets/img/kafka/Kafka-Producer-Test-1.png
diff --git a/assets/img/kafka/Kafka-Producer-Test-2.png b/public/assets/img/kafka/Kafka-Producer-Test-2.png
similarity index 100%
rename from assets/img/kafka/Kafka-Producer-Test-2.png
rename to public/assets/img/kafka/Kafka-Producer-Test-2.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-1.png b/public/assets/img/kafka/Kafka-Why-and-Concept-1.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-1.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-1.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-2.png b/public/assets/img/kafka/Kafka-Why-and-Concept-2.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-2.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-2.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-3.png b/public/assets/img/kafka/Kafka-Why-and-Concept-3.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-3.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-3.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-4.png b/public/assets/img/kafka/Kafka-Why-and-Concept-4.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-4.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-4.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-5.png b/public/assets/img/kafka/Kafka-Why-and-Concept-5.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-5.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-5.png
diff --git a/assets/img/kafka/Kafka-Why-and-Concept-6.png b/public/assets/img/kafka/Kafka-Why-and-Concept-6.png
similarity index 100%
rename from assets/img/kafka/Kafka-Why-and-Concept-6.png
rename to public/assets/img/kafka/Kafka-Why-and-Concept-6.png
diff --git a/assets/img/kakaopay/kakaopay_logo.png b/public/assets/img/kakaopay/kakaopay_logo.png
similarity index 100%
rename from assets/img/kakaopay/kakaopay_logo.png
rename to public/assets/img/kakaopay/kakaopay_logo.png
diff --git a/assets/img/kakaopay/kakaopay_qr.png b/public/assets/img/kakaopay/kakaopay_qr.png
similarity index 100%
rename from assets/img/kakaopay/kakaopay_qr.png
rename to public/assets/img/kakaopay/kakaopay_qr.png
diff --git a/assets/img/leetcode/LeetCode_Grind169_questions.png b/public/assets/img/leetcode/LeetCode_Grind169_questions.png
similarity index 100%
rename from assets/img/leetcode/LeetCode_Grind169_questions.png
rename to public/assets/img/leetcode/LeetCode_Grind169_questions.png
diff --git a/assets/img/linux/Linux-Nvidia-Smi-memory.png b/public/assets/img/linux/Linux-Nvidia-Smi-memory.png
similarity index 100%
rename from assets/img/linux/Linux-Nvidia-Smi-memory.png
rename to public/assets/img/linux/Linux-Nvidia-Smi-memory.png
diff --git a/assets/img/linux/Linux-Nvidia-Smi-temperature.png b/public/assets/img/linux/Linux-Nvidia-Smi-temperature.png
similarity index 100%
rename from assets/img/linux/Linux-Nvidia-Smi-temperature.png
rename to public/assets/img/linux/Linux-Nvidia-Smi-temperature.png
diff --git a/assets/img/linux/Linux-Nvidia-Smi-utilization.png b/public/assets/img/linux/Linux-Nvidia-Smi-utilization.png
similarity index 100%
rename from assets/img/linux/Linux-Nvidia-Smi-utilization.png
rename to public/assets/img/linux/Linux-Nvidia-Smi-utilization.png
diff --git a/assets/img/linux/Linux-Nvidia-Smi-watch.png b/public/assets/img/linux/Linux-Nvidia-Smi-watch.png
similarity index 100%
rename from assets/img/linux/Linux-Nvidia-Smi-watch.png
rename to public/assets/img/linux/Linux-Nvidia-Smi-watch.png
diff --git a/assets/img/linux/Linux-Nvidia-Smi.png b/public/assets/img/linux/Linux-Nvidia-Smi.png
similarity index 100%
rename from assets/img/linux/Linux-Nvidia-Smi.png
rename to public/assets/img/linux/Linux-Nvidia-Smi.png
diff --git a/assets/img/logo.png b/public/assets/img/logo.png
similarity index 100%
rename from assets/img/logo.png
rename to public/assets/img/logo.png
diff --git a/assets/img/logo/about.png b/public/assets/img/logo/about.png
similarity index 100%
rename from assets/img/logo/about.png
rename to public/assets/img/logo/about.png
diff --git a/assets/img/logo/archives.png b/public/assets/img/logo/archives.png
similarity index 100%
rename from assets/img/logo/archives.png
rename to public/assets/img/logo/archives.png
diff --git a/assets/img/logo/book.png b/public/assets/img/logo/book.png
similarity index 100%
rename from assets/img/logo/book.png
rename to public/assets/img/logo/book.png
diff --git a/assets/img/logo/calender.png b/public/assets/img/logo/calender.png
similarity index 100%
rename from assets/img/logo/calender.png
rename to public/assets/img/logo/calender.png
diff --git a/assets/img/logo/categories.png b/public/assets/img/logo/categories.png
similarity index 100%
rename from assets/img/logo/categories.png
rename to public/assets/img/logo/categories.png
diff --git a/assets/img/logo/coffee.png b/public/assets/img/logo/coffee.png
similarity index 100%
rename from assets/img/logo/coffee.png
rename to public/assets/img/logo/coffee.png
diff --git a/assets/img/logo/collaboration.png b/public/assets/img/logo/collaboration.png
similarity index 100%
rename from assets/img/logo/collaboration.png
rename to public/assets/img/logo/collaboration.png
diff --git a/assets/img/logo/desktop.png b/public/assets/img/logo/desktop.png
similarity index 100%
rename from assets/img/logo/desktop.png
rename to public/assets/img/logo/desktop.png
diff --git a/assets/img/logo/edit.png b/public/assets/img/logo/edit.png
similarity index 100%
rename from assets/img/logo/edit.png
rename to public/assets/img/logo/edit.png
diff --git a/assets/img/logo/email.png b/public/assets/img/logo/email.png
similarity index 100%
rename from assets/img/logo/email.png
rename to public/assets/img/logo/email.png
diff --git a/assets/img/logo/facebook.png b/public/assets/img/logo/facebook.png
similarity index 100%
rename from assets/img/logo/facebook.png
rename to public/assets/img/logo/facebook.png
diff --git a/assets/img/logo/github.png b/public/assets/img/logo/github.png
similarity index 100%
rename from assets/img/logo/github.png
rename to public/assets/img/logo/github.png
diff --git a/assets/img/logo/gym.png b/public/assets/img/logo/gym.png
similarity index 100%
rename from assets/img/logo/gym.png
rename to public/assets/img/logo/gym.png
diff --git a/assets/img/logo/hand-holding-seedling.png b/public/assets/img/logo/hand-holding-seedling.png
similarity index 100%
rename from assets/img/logo/hand-holding-seedling.png
rename to public/assets/img/logo/hand-holding-seedling.png
diff --git a/assets/img/logo/handshake.png b/public/assets/img/logo/handshake.png
similarity index 100%
rename from assets/img/logo/handshake.png
rename to public/assets/img/logo/handshake.png
diff --git a/assets/img/logo/home.png b/public/assets/img/logo/home.png
similarity index 100%
rename from assets/img/logo/home.png
rename to public/assets/img/logo/home.png
diff --git a/assets/img/logo/instagram.png b/public/assets/img/logo/instagram.png
similarity index 100%
rename from assets/img/logo/instagram.png
rename to public/assets/img/logo/instagram.png
diff --git a/assets/img/logo/itdaa-logo.png b/public/assets/img/logo/itdaa-logo.png
similarity index 100%
rename from assets/img/logo/itdaa-logo.png
rename to public/assets/img/logo/itdaa-logo.png
diff --git a/assets/img/logo/kakaobank-logo.png b/public/assets/img/logo/kakaobank-logo.png
similarity index 100%
rename from assets/img/logo/kakaobank-logo.png
rename to public/assets/img/logo/kakaobank-logo.png
diff --git a/assets/img/logo/kakaotalk.png b/public/assets/img/logo/kakaotalk.png
similarity index 100%
rename from assets/img/logo/kakaotalk.png
rename to public/assets/img/logo/kakaotalk.png
diff --git a/assets/img/logo/line-logo.png b/public/assets/img/logo/line-logo.png
similarity index 100%
rename from assets/img/logo/line-logo.png
rename to public/assets/img/logo/line-logo.png
diff --git a/assets/img/logo/linkedin.png b/public/assets/img/logo/linkedin.png
similarity index 100%
rename from assets/img/logo/linkedin.png
rename to public/assets/img/logo/linkedin.png
diff --git a/assets/img/logo/mentoring.png b/public/assets/img/logo/mentoring.png
similarity index 100%
rename from assets/img/logo/mentoring.png
rename to public/assets/img/logo/mentoring.png
diff --git a/assets/img/logo/palette.png b/public/assets/img/logo/palette.png
similarity index 100%
rename from assets/img/logo/palette.png
rename to public/assets/img/logo/palette.png
diff --git a/assets/img/logo/rocket-lunch.png b/public/assets/img/logo/rocket-lunch.png
similarity index 100%
rename from assets/img/logo/rocket-lunch.png
rename to public/assets/img/logo/rocket-lunch.png
diff --git a/assets/img/logo/search.png b/public/assets/img/logo/search.png
similarity index 100%
rename from assets/img/logo/search.png
rename to public/assets/img/logo/search.png
diff --git a/assets/img/logo/woorifis-logo.png b/public/assets/img/logo/woorifis-logo.png
similarity index 100%
rename from assets/img/logo/woorifis-logo.png
rename to public/assets/img/logo/woorifis-logo.png
diff --git a/assets/img/mjy/moonjunyong.JPG b/public/assets/img/mjy/moonjunyong.JPG
similarity index 100%
rename from assets/img/mjy/moonjunyong.JPG
rename to public/assets/img/mjy/moonjunyong.JPG
diff --git a/assets/img/mysql/mysql-concept-1.png b/public/assets/img/mysql/mysql-concept-1.png
similarity index 100%
rename from assets/img/mysql/mysql-concept-1.png
rename to public/assets/img/mysql/mysql-concept-1.png
diff --git a/assets/img/mysql/mysql-installation-sakila-download.png b/public/assets/img/mysql/mysql-installation-sakila-download.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-sakila-download.png
rename to public/assets/img/mysql/mysql-installation-sakila-download.png
diff --git a/assets/img/mysql/mysql-installation-sakila-path.png b/public/assets/img/mysql/mysql-installation-sakila-path.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-sakila-path.png
rename to public/assets/img/mysql/mysql-installation-sakila-path.png
diff --git a/assets/img/mysql/mysql-installation-sakila-show-db.png b/public/assets/img/mysql/mysql-installation-sakila-show-db.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-sakila-show-db.png
rename to public/assets/img/mysql/mysql-installation-sakila-show-db.png
diff --git a/assets/img/mysql/mysql-installation-workbench-2.png b/public/assets/img/mysql/mysql-installation-workbench-2.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-workbench-2.png
rename to public/assets/img/mysql/mysql-installation-workbench-2.png
diff --git a/assets/img/mysql/mysql-installation-workbench-3.png b/public/assets/img/mysql/mysql-installation-workbench-3.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-workbench-3.png
rename to public/assets/img/mysql/mysql-installation-workbench-3.png
diff --git a/assets/img/mysql/mysql-installation-workbench.png b/public/assets/img/mysql/mysql-installation-workbench.png
similarity index 100%
rename from assets/img/mysql/mysql-installation-workbench.png
rename to public/assets/img/mysql/mysql-installation-workbench.png
diff --git a/assets/img/mysql/mysql-practice.png b/public/assets/img/mysql/mysql-practice.png
similarity index 100%
rename from assets/img/mysql/mysql-practice.png
rename to public/assets/img/mysql/mysql-practice.png
diff --git a/assets/img/mysql/mysql-sakila-database-diagram.png b/public/assets/img/mysql/mysql-sakila-database-diagram.png
similarity index 100%
rename from assets/img/mysql/mysql-sakila-database-diagram.png
rename to public/assets/img/mysql/mysql-sakila-database-diagram.png
diff --git a/assets/img/mysql/mysql-sakila-schema.png b/public/assets/img/mysql/mysql-sakila-schema.png
similarity index 100%
rename from assets/img/mysql/mysql-sakila-schema.png
rename to public/assets/img/mysql/mysql-sakila-schema.png
diff --git a/assets/img/network/network-OSI7-hierarchy-1.png b/public/assets/img/network/network-OSI7-hierarchy-1.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-1.png
rename to public/assets/img/network/network-OSI7-hierarchy-1.png
diff --git a/assets/img/network/network-OSI7-hierarchy-2.png b/public/assets/img/network/network-OSI7-hierarchy-2.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-2.png
rename to public/assets/img/network/network-OSI7-hierarchy-2.png
diff --git a/assets/img/network/network-OSI7-hierarchy-3.png b/public/assets/img/network/network-OSI7-hierarchy-3.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-3.png
rename to public/assets/img/network/network-OSI7-hierarchy-3.png
diff --git a/assets/img/network/network-OSI7-hierarchy-4.png b/public/assets/img/network/network-OSI7-hierarchy-4.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-4.png
rename to public/assets/img/network/network-OSI7-hierarchy-4.png
diff --git a/assets/img/network/network-OSI7-hierarchy-5.png b/public/assets/img/network/network-OSI7-hierarchy-5.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-5.png
rename to public/assets/img/network/network-OSI7-hierarchy-5.png
diff --git a/assets/img/network/network-OSI7-hierarchy-6.png b/public/assets/img/network/network-OSI7-hierarchy-6.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-6.png
rename to public/assets/img/network/network-OSI7-hierarchy-6.png
diff --git a/assets/img/network/network-OSI7-hierarchy-7.png b/public/assets/img/network/network-OSI7-hierarchy-7.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-7.png
rename to public/assets/img/network/network-OSI7-hierarchy-7.png
diff --git a/assets/img/network/network-OSI7-hierarchy-8.png b/public/assets/img/network/network-OSI7-hierarchy-8.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-8.png
rename to public/assets/img/network/network-OSI7-hierarchy-8.png
diff --git a/assets/img/network/network-OSI7-hierarchy-9.png b/public/assets/img/network/network-OSI7-hierarchy-9.png
similarity index 100%
rename from assets/img/network/network-OSI7-hierarchy-9.png
rename to public/assets/img/network/network-OSI7-hierarchy-9.png
diff --git a/assets/img/network/network-cookie-and-session-1.png b/public/assets/img/network/network-cookie-and-session-1.png
similarity index 100%
rename from assets/img/network/network-cookie-and-session-1.png
rename to public/assets/img/network/network-cookie-and-session-1.png
diff --git a/assets/img/network/network-cookie-and-session-2.png b/public/assets/img/network/network-cookie-and-session-2.png
similarity index 100%
rename from assets/img/network/network-cookie-and-session-2.png
rename to public/assets/img/network/network-cookie-and-session-2.png
diff --git a/assets/img/network/network-dns-1.png b/public/assets/img/network/network-dns-1.png
similarity index 100%
rename from assets/img/network/network-dns-1.png
rename to public/assets/img/network/network-dns-1.png
diff --git a/assets/img/network/network-dns-2.png b/public/assets/img/network/network-dns-2.png
similarity index 100%
rename from assets/img/network/network-dns-2.png
rename to public/assets/img/network/network-dns-2.png
diff --git a/assets/img/network/network-dns-3.png b/public/assets/img/network/network-dns-3.png
similarity index 100%
rename from assets/img/network/network-dns-3.png
rename to public/assets/img/network/network-dns-3.png
diff --git a/assets/img/network/network-dns-4.png b/public/assets/img/network/network-dns-4.png
similarity index 100%
rename from assets/img/network/network-dns-4.png
rename to public/assets/img/network/network-dns-4.png
diff --git a/assets/img/network/network-http-http1.0_http1.1.png b/public/assets/img/network/network-http-http1.0_http1.1.png
similarity index 100%
rename from assets/img/network/network-http-http1.0_http1.1.png
rename to public/assets/img/network/network-http-http1.0_http1.1.png
diff --git a/assets/img/network/network-http-http2-multiplexing1.png b/public/assets/img/network/network-http-http2-multiplexing1.png
similarity index 100%
rename from assets/img/network/network-http-http2-multiplexing1.png
rename to public/assets/img/network/network-http-http2-multiplexing1.png
diff --git a/assets/img/network/network-http-http2-multiplexing2.png b/public/assets/img/network/network-http-http2-multiplexing2.png
similarity index 100%
rename from assets/img/network/network-http-http2-multiplexing2.png
rename to public/assets/img/network/network-http-http2-multiplexing2.png
diff --git a/assets/img/network/network-http-http2_spdy.png b/public/assets/img/network/network-http-http2_spdy.png
similarity index 100%
rename from assets/img/network/network-http-http2_spdy.png
rename to public/assets/img/network/network-http-http2_spdy.png
diff --git a/assets/img/network/network-http-http3-1.png b/public/assets/img/network/network-http-http3-1.png
similarity index 100%
rename from assets/img/network/network-http-http3-1.png
rename to public/assets/img/network/network-http-http3-1.png
diff --git a/assets/img/network/network-http-http3-2.png b/public/assets/img/network/network-http-http3-2.png
similarity index 100%
rename from assets/img/network/network-http-http3-2.png
rename to public/assets/img/network/network-http-http3-2.png
diff --git a/assets/img/network/network-http-http3-3.png b/public/assets/img/network/network-http-http3-3.png
similarity index 100%
rename from assets/img/network/network-http-http3-3.png
rename to public/assets/img/network/network-http-http3-3.png
diff --git a/assets/img/network/network-http-pipelining.png b/public/assets/img/network/network-http-pipelining.png
similarity index 100%
rename from assets/img/network/network-http-pipelining.png
rename to public/assets/img/network/network-http-pipelining.png
diff --git a/assets/img/network/network-http2-binary_protocol.png b/public/assets/img/network/network-http2-binary_protocol.png
similarity index 100%
rename from assets/img/network/network-http2-binary_protocol.png
rename to public/assets/img/network/network-http2-binary_protocol.png
diff --git a/assets/img/network/network-load-balancing-1.png b/public/assets/img/network/network-load-balancing-1.png
similarity index 100%
rename from assets/img/network/network-load-balancing-1.png
rename to public/assets/img/network/network-load-balancing-1.png
diff --git a/assets/img/network/network-load-balancing-2.png b/public/assets/img/network/network-load-balancing-2.png
similarity index 100%
rename from assets/img/network/network-load-balancing-2.png
rename to public/assets/img/network/network-load-balancing-2.png
diff --git a/assets/img/network/network-load-balancing-3.png b/public/assets/img/network/network-load-balancing-3.png
similarity index 100%
rename from assets/img/network/network-load-balancing-3.png
rename to public/assets/img/network/network-load-balancing-3.png
diff --git a/assets/img/network/network-load-balancing-4.png b/public/assets/img/network/network-load-balancing-4.png
similarity index 100%
rename from assets/img/network/network-load-balancing-4.png
rename to public/assets/img/network/network-load-balancing-4.png
diff --git a/assets/img/network/network-load-balancing-5.gif b/public/assets/img/network/network-load-balancing-5.gif
similarity index 100%
rename from assets/img/network/network-load-balancing-5.gif
rename to public/assets/img/network/network-load-balancing-5.gif
diff --git a/assets/img/network/network-proxy-server-1.png b/public/assets/img/network/network-proxy-server-1.png
similarity index 100%
rename from assets/img/network/network-proxy-server-1.png
rename to public/assets/img/network/network-proxy-server-1.png
diff --git a/assets/img/network/network-proxy-server-2.png b/public/assets/img/network/network-proxy-server-2.png
similarity index 100%
rename from assets/img/network/network-proxy-server-2.png
rename to public/assets/img/network/network-proxy-server-2.png
diff --git a/assets/img/network/network-proxy-server-3.png b/public/assets/img/network/network-proxy-server-3.png
similarity index 100%
rename from assets/img/network/network-proxy-server-3.png
rename to public/assets/img/network/network-proxy-server-3.png
diff --git a/assets/img/network/network-proxy-server-4.png b/public/assets/img/network/network-proxy-server-4.png
similarity index 100%
rename from assets/img/network/network-proxy-server-4.png
rename to public/assets/img/network/network-proxy-server-4.png
diff --git a/assets/img/network/network-proxy-server-5.png b/public/assets/img/network/network-proxy-server-5.png
similarity index 100%
rename from assets/img/network/network-proxy-server-5.png
rename to public/assets/img/network/network-proxy-server-5.png
diff --git a/assets/img/network/network-proxy-server-6.png b/public/assets/img/network/network-proxy-server-6.png
similarity index 100%
rename from assets/img/network/network-proxy-server-6.png
rename to public/assets/img/network/network-proxy-server-6.png
diff --git a/assets/img/network/network-tcp-and-udp-1.jpg b/public/assets/img/network/network-tcp-and-udp-1.jpg
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-1.jpg
rename to public/assets/img/network/network-tcp-and-udp-1.jpg
diff --git a/assets/img/network/network-tcp-and-udp-2.jpg b/public/assets/img/network/network-tcp-and-udp-2.jpg
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-2.jpg
rename to public/assets/img/network/network-tcp-and-udp-2.jpg
diff --git a/assets/img/network/network-tcp-and-udp-3.png b/public/assets/img/network/network-tcp-and-udp-3.png
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-3.png
rename to public/assets/img/network/network-tcp-and-udp-3.png
diff --git a/assets/img/network/network-tcp-and-udp-4.png b/public/assets/img/network/network-tcp-and-udp-4.png
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-4.png
rename to public/assets/img/network/network-tcp-and-udp-4.png
diff --git a/assets/img/network/network-tcp-and-udp-5.png b/public/assets/img/network/network-tcp-and-udp-5.png
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-5.png
rename to public/assets/img/network/network-tcp-and-udp-5.png
diff --git a/assets/img/network/network-tcp-and-udp-6.png b/public/assets/img/network/network-tcp-and-udp-6.png
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-6.png
rename to public/assets/img/network/network-tcp-and-udp-6.png
diff --git a/assets/img/network/network-tcp-and-udp-7.png b/public/assets/img/network/network-tcp-and-udp-7.png
similarity index 100%
rename from assets/img/network/network-tcp-and-udp-7.png
rename to public/assets/img/network/network-tcp-and-udp-7.png
diff --git a/assets/img/network/network_cors_1_naver_origin.png b/public/assets/img/network/network_cors_1_naver_origin.png
similarity index 100%
rename from assets/img/network/network_cors_1_naver_origin.png
rename to public/assets/img/network/network_cors_1_naver_origin.png
diff --git a/assets/img/network/network_cors_2_sop_structure.png b/public/assets/img/network/network_cors_2_sop_structure.png
similarity index 100%
rename from assets/img/network/network_cors_2_sop_structure.png
rename to public/assets/img/network/network_cors_2_sop_structure.png
diff --git a/assets/img/network/network_cors_3_structure.png b/public/assets/img/network/network_cors_3_structure.png
similarity index 100%
rename from assets/img/network/network_cors_3_structure.png
rename to public/assets/img/network/network_cors_3_structure.png
diff --git a/assets/img/network/network_cors_4_http_option_method.png b/public/assets/img/network/network_cors_4_http_option_method.png
similarity index 100%
rename from assets/img/network/network_cors_4_http_option_method.png
rename to public/assets/img/network/network_cors_4_http_option_method.png
diff --git a/assets/img/network/network_cors_5_simple_requests.png b/public/assets/img/network/network_cors_5_simple_requests.png
similarity index 100%
rename from assets/img/network/network_cors_5_simple_requests.png
rename to public/assets/img/network/network_cors_5_simple_requests.png
diff --git a/assets/img/network/network_cors_6_preflighted_requests.png b/public/assets/img/network/network_cors_6_preflighted_requests.png
similarity index 100%
rename from assets/img/network/network_cors_6_preflighted_requests.png
rename to public/assets/img/network/network_cors_6_preflighted_requests.png
diff --git a/assets/img/os/os-1-and-2-Introduction_1.png b/public/assets/img/os/os-1-and-2-Introduction_1.png
similarity index 100%
rename from assets/img/os/os-1-and-2-Introduction_1.png
rename to public/assets/img/os/os-1-and-2-Introduction_1.png
diff --git a/assets/img/os/os-1-and-2-Introduction_2.png b/public/assets/img/os/os-1-and-2-Introduction_2.png
similarity index 100%
rename from assets/img/os/os-1-and-2-Introduction_2.png
rename to public/assets/img/os/os-1-and-2-Introduction_2.png
diff --git a/assets/img/os/os-1-and-2-Introduction_3.png b/public/assets/img/os/os-1-and-2-Introduction_3.png
similarity index 100%
rename from assets/img/os/os-1-and-2-Introduction_3.png
rename to public/assets/img/os/os-1-and-2-Introduction_3.png
diff --git a/assets/img/os/os-1-and-2-Introduction_4.png b/public/assets/img/os/os-1-and-2-Introduction_4.png
similarity index 100%
rename from assets/img/os/os-1-and-2-Introduction_4.png
rename to public/assets/img/os/os-1-and-2-Introduction_4.png
diff --git a/assets/img/os/os-13-address-space-1.png b/public/assets/img/os/os-13-address-space-1.png
similarity index 100%
rename from assets/img/os/os-13-address-space-1.png
rename to public/assets/img/os/os-13-address-space-1.png
diff --git a/assets/img/os/os-13-address-space-2.png b/public/assets/img/os/os-13-address-space-2.png
similarity index 100%
rename from assets/img/os/os-13-address-space-2.png
rename to public/assets/img/os/os-13-address-space-2.png
diff --git a/assets/img/os/os-13-address-space-3.png b/public/assets/img/os/os-13-address-space-3.png
similarity index 100%
rename from assets/img/os/os-13-address-space-3.png
rename to public/assets/img/os/os-13-address-space-3.png
diff --git a/assets/img/os/os-13-address-space-4.png b/public/assets/img/os/os-13-address-space-4.png
similarity index 100%
rename from assets/img/os/os-13-address-space-4.png
rename to public/assets/img/os/os-13-address-space-4.png
diff --git a/assets/img/os/os-15-address-translation-1.png b/public/assets/img/os/os-15-address-translation-1.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-1.png
rename to public/assets/img/os/os-15-address-translation-1.png
diff --git a/assets/img/os/os-15-address-translation-2.png b/public/assets/img/os/os-15-address-translation-2.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-2.png
rename to public/assets/img/os/os-15-address-translation-2.png
diff --git a/assets/img/os/os-15-address-translation-3.png b/public/assets/img/os/os-15-address-translation-3.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-3.png
rename to public/assets/img/os/os-15-address-translation-3.png
diff --git a/assets/img/os/os-15-address-translation-4.png b/public/assets/img/os/os-15-address-translation-4.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-4.png
rename to public/assets/img/os/os-15-address-translation-4.png
diff --git a/assets/img/os/os-15-address-translation-5.png b/public/assets/img/os/os-15-address-translation-5.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-5.png
rename to public/assets/img/os/os-15-address-translation-5.png
diff --git a/assets/img/os/os-15-address-translation-6.png b/public/assets/img/os/os-15-address-translation-6.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-6.png
rename to public/assets/img/os/os-15-address-translation-6.png
diff --git a/assets/img/os/os-15-address-translation-7.png b/public/assets/img/os/os-15-address-translation-7.png
similarity index 100%
rename from assets/img/os/os-15-address-translation-7.png
rename to public/assets/img/os/os-15-address-translation-7.png
diff --git a/assets/img/os/os-16-segmentation-1.png b/public/assets/img/os/os-16-segmentation-1.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-1.png
rename to public/assets/img/os/os-16-segmentation-1.png
diff --git a/assets/img/os/os-16-segmentation-2.png b/public/assets/img/os/os-16-segmentation-2.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-2.png
rename to public/assets/img/os/os-16-segmentation-2.png
diff --git a/assets/img/os/os-16-segmentation-3.png b/public/assets/img/os/os-16-segmentation-3.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-3.png
rename to public/assets/img/os/os-16-segmentation-3.png
diff --git a/assets/img/os/os-16-segmentation-4.png b/public/assets/img/os/os-16-segmentation-4.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-4.png
rename to public/assets/img/os/os-16-segmentation-4.png
diff --git a/assets/img/os/os-16-segmentation-5.png b/public/assets/img/os/os-16-segmentation-5.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-5.png
rename to public/assets/img/os/os-16-segmentation-5.png
diff --git a/assets/img/os/os-16-segmentation-6.png b/public/assets/img/os/os-16-segmentation-6.png
similarity index 100%
rename from assets/img/os/os-16-segmentation-6.png
rename to public/assets/img/os/os-16-segmentation-6.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-1.png b/public/assets/img/os/os-20-paging-smaller-tables-1.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-1.png
rename to public/assets/img/os/os-20-paging-smaller-tables-1.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-2.png b/public/assets/img/os/os-20-paging-smaller-tables-2.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-2.png
rename to public/assets/img/os/os-20-paging-smaller-tables-2.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-3.png b/public/assets/img/os/os-20-paging-smaller-tables-3.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-3.png
rename to public/assets/img/os/os-20-paging-smaller-tables-3.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-4.png b/public/assets/img/os/os-20-paging-smaller-tables-4.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-4.png
rename to public/assets/img/os/os-20-paging-smaller-tables-4.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-5.png b/public/assets/img/os/os-20-paging-smaller-tables-5.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-5.png
rename to public/assets/img/os/os-20-paging-smaller-tables-5.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-6.png b/public/assets/img/os/os-20-paging-smaller-tables-6.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-6.png
rename to public/assets/img/os/os-20-paging-smaller-tables-6.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-7.png b/public/assets/img/os/os-20-paging-smaller-tables-7.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-7.png
rename to public/assets/img/os/os-20-paging-smaller-tables-7.png
diff --git a/assets/img/os/os-20-paging-smaller-tables-8.png b/public/assets/img/os/os-20-paging-smaller-tables-8.png
similarity index 100%
rename from assets/img/os/os-20-paging-smaller-tables-8.png
rename to public/assets/img/os/os-20-paging-smaller-tables-8.png
diff --git a/assets/img/os/os-21-swapping-1.png b/public/assets/img/os/os-21-swapping-1.png
similarity index 100%
rename from assets/img/os/os-21-swapping-1.png
rename to public/assets/img/os/os-21-swapping-1.png
diff --git a/assets/img/os/os-21-swapping-10.png b/public/assets/img/os/os-21-swapping-10.png
similarity index 100%
rename from assets/img/os/os-21-swapping-10.png
rename to public/assets/img/os/os-21-swapping-10.png
diff --git a/assets/img/os/os-21-swapping-2.png b/public/assets/img/os/os-21-swapping-2.png
similarity index 100%
rename from assets/img/os/os-21-swapping-2.png
rename to public/assets/img/os/os-21-swapping-2.png
diff --git a/assets/img/os/os-21-swapping-3.png b/public/assets/img/os/os-21-swapping-3.png
similarity index 100%
rename from assets/img/os/os-21-swapping-3.png
rename to public/assets/img/os/os-21-swapping-3.png
diff --git a/assets/img/os/os-21-swapping-4.png b/public/assets/img/os/os-21-swapping-4.png
similarity index 100%
rename from assets/img/os/os-21-swapping-4.png
rename to public/assets/img/os/os-21-swapping-4.png
diff --git a/assets/img/os/os-21-swapping-5.png b/public/assets/img/os/os-21-swapping-5.png
similarity index 100%
rename from assets/img/os/os-21-swapping-5.png
rename to public/assets/img/os/os-21-swapping-5.png
diff --git a/assets/img/os/os-21-swapping-6.png b/public/assets/img/os/os-21-swapping-6.png
similarity index 100%
rename from assets/img/os/os-21-swapping-6.png
rename to public/assets/img/os/os-21-swapping-6.png
diff --git a/assets/img/os/os-21-swapping-7.png b/public/assets/img/os/os-21-swapping-7.png
similarity index 100%
rename from assets/img/os/os-21-swapping-7.png
rename to public/assets/img/os/os-21-swapping-7.png
diff --git a/assets/img/os/os-21-swapping-8.png b/public/assets/img/os/os-21-swapping-8.png
similarity index 100%
rename from assets/img/os/os-21-swapping-8.png
rename to public/assets/img/os/os-21-swapping-8.png
diff --git a/assets/img/os/os-21-swapping-9.png b/public/assets/img/os/os-21-swapping-9.png
similarity index 100%
rename from assets/img/os/os-21-swapping-9.png
rename to public/assets/img/os/os-21-swapping-9.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_1.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_1.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_1.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_1.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_2.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_2.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_2.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_2.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_3.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_3.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_3.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_3.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_4.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_4.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_4.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_4.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_5.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_5.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_5.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_5.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_6.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_6.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_6.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_6.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_7.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_7.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_7.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_7.png
diff --git a/assets/img/os/os-3-Intro-to-Computing-Systems_8.png b/public/assets/img/os/os-3-Intro-to-Computing-Systems_8.png
similarity index 100%
rename from assets/img/os/os-3-Intro-to-Computing-Systems_8.png
rename to public/assets/img/os/os-3-Intro-to-Computing-Systems_8.png
diff --git a/assets/img/os/os-4-and-5-Process_1.png b/public/assets/img/os/os-4-and-5-Process_1.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_1.png
rename to public/assets/img/os/os-4-and-5-Process_1.png
diff --git a/assets/img/os/os-4-and-5-Process_2.png b/public/assets/img/os/os-4-and-5-Process_2.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_2.png
rename to public/assets/img/os/os-4-and-5-Process_2.png
diff --git a/assets/img/os/os-4-and-5-Process_3.png b/public/assets/img/os/os-4-and-5-Process_3.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_3.png
rename to public/assets/img/os/os-4-and-5-Process_3.png
diff --git a/assets/img/os/os-4-and-5-Process_4.png b/public/assets/img/os/os-4-and-5-Process_4.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_4.png
rename to public/assets/img/os/os-4-and-5-Process_4.png
diff --git a/assets/img/os/os-4-and-5-Process_5.png b/public/assets/img/os/os-4-and-5-Process_5.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_5.png
rename to public/assets/img/os/os-4-and-5-Process_5.png
diff --git a/assets/img/os/os-4-and-5-Process_6.png b/public/assets/img/os/os-4-and-5-Process_6.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_6.png
rename to public/assets/img/os/os-4-and-5-Process_6.png
diff --git a/assets/img/os/os-4-and-5-Process_6_2.png b/public/assets/img/os/os-4-and-5-Process_6_2.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_6_2.png
rename to public/assets/img/os/os-4-and-5-Process_6_2.png
diff --git a/assets/img/os/os-4-and-5-Process_7.png b/public/assets/img/os/os-4-and-5-Process_7.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_7.png
rename to public/assets/img/os/os-4-and-5-Process_7.png
diff --git a/assets/img/os/os-4-and-5-Process_8.png b/public/assets/img/os/os-4-and-5-Process_8.png
similarity index 100%
rename from assets/img/os/os-4-and-5-Process_8.png
rename to public/assets/img/os/os-4-and-5-Process_8.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_1.png b/public/assets/img/os/os-6-Limited-Direct-Execution_1.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_1.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_1.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_2.png b/public/assets/img/os/os-6-Limited-Direct-Execution_2.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_2.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_2.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_3.png b/public/assets/img/os/os-6-Limited-Direct-Execution_3.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_3.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_3.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_4.png b/public/assets/img/os/os-6-Limited-Direct-Execution_4.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_4.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_4.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_5.png b/public/assets/img/os/os-6-Limited-Direct-Execution_5.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_5.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_5.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_6.png b/public/assets/img/os/os-6-Limited-Direct-Execution_6.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_6.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_6.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_7.png b/public/assets/img/os/os-6-Limited-Direct-Execution_7.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_7.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_7.png
diff --git a/assets/img/os/os-6-Limited-Direct-Execution_8.png b/public/assets/img/os/os-6-Limited-Direct-Execution_8.png
similarity index 100%
rename from assets/img/os/os-6-Limited-Direct-Execution_8.png
rename to public/assets/img/os/os-6-Limited-Direct-Execution_8.png
diff --git a/assets/img/os/os-7-Scheduling_0.png b/public/assets/img/os/os-7-Scheduling_0.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_0.png
rename to public/assets/img/os/os-7-Scheduling_0.png
diff --git a/assets/img/os/os-7-Scheduling_1.png b/public/assets/img/os/os-7-Scheduling_1.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_1.png
rename to public/assets/img/os/os-7-Scheduling_1.png
diff --git a/assets/img/os/os-7-Scheduling_2.png b/public/assets/img/os/os-7-Scheduling_2.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_2.png
rename to public/assets/img/os/os-7-Scheduling_2.png
diff --git a/assets/img/os/os-7-Scheduling_3.png b/public/assets/img/os/os-7-Scheduling_3.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_3.png
rename to public/assets/img/os/os-7-Scheduling_3.png
diff --git a/assets/img/os/os-7-Scheduling_4.png b/public/assets/img/os/os-7-Scheduling_4.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_4.png
rename to public/assets/img/os/os-7-Scheduling_4.png
diff --git a/assets/img/os/os-7-Scheduling_5.png b/public/assets/img/os/os-7-Scheduling_5.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_5.png
rename to public/assets/img/os/os-7-Scheduling_5.png
diff --git a/assets/img/os/os-7-Scheduling_6.png b/public/assets/img/os/os-7-Scheduling_6.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_6.png
rename to public/assets/img/os/os-7-Scheduling_6.png
diff --git a/assets/img/os/os-7-Scheduling_7.png b/public/assets/img/os/os-7-Scheduling_7.png
similarity index 100%
rename from assets/img/os/os-7-Scheduling_7.png
rename to public/assets/img/os/os-7-Scheduling_7.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_1.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_1.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_1.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_1.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_2.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_2.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_2.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_2.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_3.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_3.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_3.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_3.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_4.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_4.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_4.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_4.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_5.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_5.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_5.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_5.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_6.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_6.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_6.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_6.png
diff --git a/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_7.png b/public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_7.png
similarity index 100%
rename from assets/img/os/os-8-The-Multi-Level-Feedback-Queue_7.png
rename to public/assets/img/os/os-8-The-Multi-Level-Feedback-Queue_7.png
diff --git a/assets/img/os/os-concurrency-problem-1.png b/public/assets/img/os/os-concurrency-problem-1.png
similarity index 100%
rename from assets/img/os/os-concurrency-problem-1.png
rename to public/assets/img/os/os-concurrency-problem-1.png
diff --git a/assets/img/os/os-concurrency-problem-2.png b/public/assets/img/os/os-concurrency-problem-2.png
similarity index 100%
rename from assets/img/os/os-concurrency-problem-2.png
rename to public/assets/img/os/os-concurrency-problem-2.png
diff --git a/assets/img/os/os-concurrency-process-single-multi-thread.png b/public/assets/img/os/os-concurrency-process-single-multi-thread.png
similarity index 100%
rename from assets/img/os/os-concurrency-process-single-multi-thread.png
rename to public/assets/img/os/os-concurrency-process-single-multi-thread.png
diff --git a/assets/img/os/os-concurrency-process-thread.png b/public/assets/img/os/os-concurrency-process-thread.png
similarity index 100%
rename from assets/img/os/os-concurrency-process-thread.png
rename to public/assets/img/os/os-concurrency-process-thread.png
diff --git a/assets/img/os/os-concurrency-process-why-multi-thread.png b/public/assets/img/os/os-concurrency-process-why-multi-thread.png
similarity index 100%
rename from assets/img/os/os-concurrency-process-why-multi-thread.png
rename to public/assets/img/os/os-concurrency-process-why-multi-thread.png
diff --git a/assets/img/os/os-concurrency-solution.png b/public/assets/img/os/os-concurrency-solution.png
similarity index 100%
rename from assets/img/os/os-concurrency-solution.png
rename to public/assets/img/os/os-concurrency-solution.png
diff --git a/assets/img/os/os-concurrency-switching-thread.png b/public/assets/img/os/os-concurrency-switching-thread.png
similarity index 100%
rename from assets/img/os/os-concurrency-switching-thread.png
rename to public/assets/img/os/os-concurrency-switching-thread.png
diff --git a/assets/img/os/os-concurrency-thread-concept.png b/public/assets/img/os/os-concurrency-thread-concept.png
similarity index 100%
rename from assets/img/os/os-concurrency-thread-concept.png
rename to public/assets/img/os/os-concurrency-thread-concept.png
diff --git a/assets/img/os/os-page-table-entry.png b/public/assets/img/os/os-page-table-entry.png
similarity index 100%
rename from assets/img/os/os-page-table-entry.png
rename to public/assets/img/os/os-page-table-entry.png
diff --git a/assets/img/os/os-paging-too-slow.png b/public/assets/img/os/os-paging-too-slow.png
similarity index 100%
rename from assets/img/os/os-paging-too-slow.png
rename to public/assets/img/os/os-paging-too-slow.png
diff --git a/assets/img/os/os-tlb-1.png b/public/assets/img/os/os-tlb-1.png
similarity index 100%
rename from assets/img/os/os-tlb-1.png
rename to public/assets/img/os/os-tlb-1.png
diff --git a/assets/img/os/os-tlb-2.png b/public/assets/img/os/os-tlb-2.png
similarity index 100%
rename from assets/img/os/os-tlb-2.png
rename to public/assets/img/os/os-tlb-2.png
diff --git a/assets/img/os/os-tlb-3.png b/public/assets/img/os/os-tlb-3.png
similarity index 100%
rename from assets/img/os/os-tlb-3.png
rename to public/assets/img/os/os-tlb-3.png
diff --git a/assets/img/os/os-tlb-cache.png b/public/assets/img/os/os-tlb-cache.png
similarity index 100%
rename from assets/img/os/os-tlb-cache.png
rename to public/assets/img/os/os-tlb-cache.png
diff --git a/assets/img/os/os-tlb-context-switching-to-solve-problem-2.png b/public/assets/img/os/os-tlb-context-switching-to-solve-problem-2.png
similarity index 100%
rename from assets/img/os/os-tlb-context-switching-to-solve-problem-2.png
rename to public/assets/img/os/os-tlb-context-switching-to-solve-problem-2.png
diff --git a/assets/img/os/os-tlb-context-switching-to-solve-problem.png b/public/assets/img/os/os-tlb-context-switching-to-solve-problem.png
similarity index 100%
rename from assets/img/os/os-tlb-context-switching-to-solve-problem.png
rename to public/assets/img/os/os-tlb-context-switching-to-solve-problem.png
diff --git a/assets/img/os/os-tlb-ex-accessing-an-array.png b/public/assets/img/os/os-tlb-ex-accessing-an-array.png
similarity index 100%
rename from assets/img/os/os-tlb-ex-accessing-an-array.png
rename to public/assets/img/os/os-tlb-ex-accessing-an-array.png
diff --git a/assets/img/os/os-tlb-issue-1.png b/public/assets/img/os/os-tlb-issue-1.png
similarity index 100%
rename from assets/img/os/os-tlb-issue-1.png
rename to public/assets/img/os/os-tlb-issue-1.png
diff --git a/assets/img/os/os-tlb-issue-2.png b/public/assets/img/os/os-tlb-issue-2.png
similarity index 100%
rename from assets/img/os/os-tlb-issue-2.png
rename to public/assets/img/os/os-tlb-issue-2.png
diff --git a/assets/img/os/os-tlb-issue-3.png b/public/assets/img/os/os-tlb-issue-3.png
similarity index 100%
rename from assets/img/os/os-tlb-issue-3.png
rename to public/assets/img/os/os-tlb-issue-3.png
diff --git a/assets/img/os/os-tlb-locality-1.png b/public/assets/img/os/os-tlb-locality-1.png
similarity index 100%
rename from assets/img/os/os-tlb-locality-1.png
rename to public/assets/img/os/os-tlb-locality-1.png
diff --git a/assets/img/os/os-tlb-locality-2.png b/public/assets/img/os/os-tlb-locality-2.png
similarity index 100%
rename from assets/img/os/os-tlb-locality-2.png
rename to public/assets/img/os/os-tlb-locality-2.png
diff --git a/assets/img/os/os-tlb-replacement-policy-LRU.png .png b/public/assets/img/os/os-tlb-replacement-policy-LRU.png .png
similarity index 100%
rename from assets/img/os/os-tlb-replacement-policy-LRU.png .png
rename to public/assets/img/os/os-tlb-replacement-policy-LRU.png .png
diff --git a/assets/img/os/os_paging_1.png b/public/assets/img/os/os_paging_1.png
similarity index 100%
rename from assets/img/os/os_paging_1.png
rename to public/assets/img/os/os_paging_1.png
diff --git a/assets/img/os/os_paging_1_2.png b/public/assets/img/os/os_paging_1_2.png
similarity index 100%
rename from assets/img/os/os_paging_1_2.png
rename to public/assets/img/os/os_paging_1_2.png
diff --git a/assets/img/os/os_paging_2.png b/public/assets/img/os/os_paging_2.png
similarity index 100%
rename from assets/img/os/os_paging_2.png
rename to public/assets/img/os/os_paging_2.png
diff --git a/assets/img/os/os_paging_3.png b/public/assets/img/os/os_paging_3.png
similarity index 100%
rename from assets/img/os/os_paging_3.png
rename to public/assets/img/os/os_paging_3.png
diff --git a/assets/img/os/os_paging_4.png b/public/assets/img/os/os_paging_4.png
similarity index 100%
rename from assets/img/os/os_paging_4.png
rename to public/assets/img/os/os_paging_4.png
diff --git a/assets/img/os/os_paging_5.png b/public/assets/img/os/os_paging_5.png
similarity index 100%
rename from assets/img/os/os_paging_5.png
rename to public/assets/img/os/os_paging_5.png
diff --git a/assets/img/ps/probability-and-statistics-for-engineers-and-scientists_textbook.png b/public/assets/img/probability-statistics/probability-and-statistics-for-engineers-and-scientists_textbook.png
similarity index 100%
rename from assets/img/ps/probability-and-statistics-for-engineers-and-scientists_textbook.png
rename to public/assets/img/probability-statistics/probability-and-statistics-for-engineers-and-scientists_textbook.png
diff --git a/assets/img/ps/ps-02-random-variables_1.png b/public/assets/img/probability-statistics/ps-02-random-variables_1.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_1.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_1.png
diff --git a/assets/img/ps/ps-02-random-variables_10.png b/public/assets/img/probability-statistics/ps-02-random-variables_10.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_10.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_10.png
diff --git a/assets/img/ps/ps-02-random-variables_2.png b/public/assets/img/probability-statistics/ps-02-random-variables_2.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_2.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_2.png
diff --git a/assets/img/ps/ps-02-random-variables_3.png b/public/assets/img/probability-statistics/ps-02-random-variables_3.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_3.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_3.png
diff --git a/assets/img/ps/ps-02-random-variables_4.png b/public/assets/img/probability-statistics/ps-02-random-variables_4.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_4.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_4.png
diff --git a/assets/img/ps/ps-02-random-variables_5.png b/public/assets/img/probability-statistics/ps-02-random-variables_5.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_5.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_5.png
diff --git a/assets/img/ps/ps-02-random-variables_6.png b/public/assets/img/probability-statistics/ps-02-random-variables_6.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_6.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_6.png
diff --git a/assets/img/ps/ps-02-random-variables_7.png b/public/assets/img/probability-statistics/ps-02-random-variables_7.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_7.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_7.png
diff --git a/assets/img/ps/ps-02-random-variables_8.png b/public/assets/img/probability-statistics/ps-02-random-variables_8.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_8.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_8.png
diff --git a/assets/img/ps/ps-02-random-variables_9.png b/public/assets/img/probability-statistics/ps-02-random-variables_9.png
similarity index 100%
rename from assets/img/ps/ps-02-random-variables_9.png
rename to public/assets/img/probability-statistics/ps-02-random-variables_9.png
diff --git a/assets/img/ps/ps-03-discrete-probability-distributions_1.png b/public/assets/img/probability-statistics/ps-03-discrete-probability-distributions_1.png
similarity index 100%
rename from assets/img/ps/ps-03-discrete-probability-distributions_1.png
rename to public/assets/img/probability-statistics/ps-03-discrete-probability-distributions_1.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_1.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_1.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_1.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_1.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_2.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_2.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_2.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_2.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_3.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_3.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_3.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_3.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_4.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_4.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_4.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_4.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_5.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_5.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_5.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_5.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_6.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_6.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_6.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_6.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_7.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_7.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_7.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_7.png
diff --git a/assets/img/ps/ps-04-continuous-probability-distributions_8.png b/public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_8.png
similarity index 100%
rename from assets/img/ps/ps-04-continuous-probability-distributions_8.png
rename to public/assets/img/probability-statistics/ps-04-continuous-probability-distributions_8.png
diff --git a/assets/img/ps/ps-weekly-schedule.png b/public/assets/img/probability-statistics/ps-weekly-schedule.png
similarity index 100%
rename from assets/img/ps/ps-weekly-schedule.png
rename to public/assets/img/probability-statistics/ps-weekly-schedule.png
diff --git "a/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_1.png" "b/public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_1.png"
similarity index 100%
rename from "assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_1.png"
rename to "public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_1.png"
diff --git "a/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_2.png" "b/public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_2.png"
similarity index 100%
rename from "assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_2.png"
rename to "public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_2.png"
diff --git "a/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_3.png" "b/public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_3.png"
similarity index 100%
rename from "assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_3.png"
rename to "public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_3.png"
diff --git "a/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_4.png" "b/public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_4.png"
similarity index 100%
rename from "assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_4.png"
rename to "public/assets/img/programmers/[Programmers] 92341. \354\243\274\354\260\250 \354\232\224\352\270\210 \352\263\204\354\202\260_4.png"
diff --git a/assets/img/retrospective/Geultto_3_passed.png b/public/assets/img/retrospective/Geultto_3_passed.png
similarity index 100%
rename from assets/img/retrospective/Geultto_3_passed.png
rename to public/assets/img/retrospective/Geultto_3_passed.png
diff --git a/assets/img/retrospective/Retrospective-2024-Chrismas.png b/public/assets/img/retrospective/Retrospective-2024-Chrismas.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-Chrismas.png
rename to public/assets/img/retrospective/Retrospective-2024-Chrismas.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-1.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-1.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-1.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-1.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-10.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-10.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-10.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-10.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-12.jpg b/public/assets/img/retrospective/Retrospective-2024-first-quarter-12.jpg
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-12.jpg
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-12.jpg
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-13.jpg b/public/assets/img/retrospective/Retrospective-2024-first-quarter-13.jpg
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-13.jpg
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-13.jpg
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-2.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-2.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-2.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-2.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-3.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-3.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-3.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-3.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-4.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-4.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-4.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-4.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-5.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-5.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-5.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-5.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-6.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-6.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-6.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-6.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-7.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-7.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-7.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-7.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-8.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-8.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-8.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-8.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter-9.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter-9.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter-9.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter-9.png
diff --git a/assets/img/retrospective/Retrospective-2024-first-quarter.png b/public/assets/img/retrospective/Retrospective-2024-first-quarter.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-first-quarter.png
rename to public/assets/img/retrospective/Retrospective-2024-first-quarter.png
diff --git a/assets/img/retrospective/Retrospective-2024-plan.png b/public/assets/img/retrospective/Retrospective-2024-plan.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024-plan.png
rename to public/assets/img/retrospective/Retrospective-2024-plan.png
diff --git a/assets/img/retrospective/Retrospective-2024_TIL.png b/public/assets/img/retrospective/Retrospective-2024_TIL.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024_TIL.png
rename to public/assets/img/retrospective/Retrospective-2024_TIL.png
diff --git a/assets/img/retrospective/Retrospective-2024_TIL_after_party.png b/public/assets/img/retrospective/Retrospective-2024_TIL_after_party.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2024_TIL_after_party.png
rename to public/assets/img/retrospective/Retrospective-2024_TIL_after_party.png
diff --git a/assets/img/retrospective/Retrospective-2025.png b/public/assets/img/retrospective/Retrospective-2025.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-2025.png
rename to public/assets/img/retrospective/Retrospective-2025.png
diff --git a/assets/img/retrospective/Retrospective-Leetcode-Notion.png b/public/assets/img/retrospective/Retrospective-Leetcode-Notion.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-Leetcode-Notion.png
rename to public/assets/img/retrospective/Retrospective-Leetcode-Notion.png
diff --git a/assets/img/retrospective/Retrospective-Leetcode.png b/public/assets/img/retrospective/Retrospective-Leetcode.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-Leetcode.png
rename to public/assets/img/retrospective/Retrospective-Leetcode.png
diff --git a/assets/img/retrospective/Retrospective-Multiverse.png b/public/assets/img/retrospective/Retrospective-Multiverse.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-Multiverse.png
rename to public/assets/img/retrospective/Retrospective-Multiverse.png
diff --git a/assets/img/retrospective/Retrospective-SIPE-3th-OT.png b/public/assets/img/retrospective/Retrospective-SIPE-3th-OT.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-SIPE-3th-OT.png
rename to public/assets/img/retrospective/Retrospective-SIPE-3th-OT.png
diff --git a/assets/img/retrospective/Retrospective-SIPE-3th-Recruiting.png b/public/assets/img/retrospective/Retrospective-SIPE-3th-Recruiting.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-SIPE-3th-Recruiting.png
rename to public/assets/img/retrospective/Retrospective-SIPE-3th-Recruiting.png
diff --git a/assets/img/retrospective/Retrospective-Writing.png b/public/assets/img/retrospective/Retrospective-Writing.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-Writing.png
rename to public/assets/img/retrospective/Retrospective-Writing.png
diff --git a/assets/img/retrospective/Retrospective-geultto-10th-paper-airplanet.png b/public/assets/img/retrospective/Retrospective-geultto-10th-paper-airplanet.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-geultto-10th-paper-airplanet.png
rename to public/assets/img/retrospective/Retrospective-geultto-10th-paper-airplanet.png
diff --git a/assets/img/retrospective/Retrospective-geultto-10th-ttobot.png b/public/assets/img/retrospective/Retrospective-geultto-10th-ttobot.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-geultto-10th-ttobot.png
rename to public/assets/img/retrospective/Retrospective-geultto-10th-ttobot.png
diff --git a/assets/img/retrospective/Retrospective-kpt.png b/public/assets/img/retrospective/Retrospective-kpt.png
similarity index 100%
rename from assets/img/retrospective/Retrospective-kpt.png
rename to public/assets/img/retrospective/Retrospective-kpt.png
diff --git a/assets/img/retrospective/SIPE_3_passed.png b/public/assets/img/retrospective/SIPE_3_passed.png
similarity index 100%
rename from assets/img/retrospective/SIPE_3_passed.png
rename to public/assets/img/retrospective/SIPE_3_passed.png
diff --git a/assets/img/retrospective/geultto_home.png b/public/assets/img/retrospective/geultto_home.png
similarity index 100%
rename from assets/img/retrospective/geultto_home.png
rename to public/assets/img/retrospective/geultto_home.png
diff --git a/assets/img/retrospective/sipe_home.png b/public/assets/img/retrospective/sipe_home.png
similarity index 100%
rename from assets/img/retrospective/sipe_home.png
rename to public/assets/img/retrospective/sipe_home.png
diff --git a/assets/img/sipe/Sipe_Attendance_Excel.png b/public/assets/img/sipe/Sipe_Attendance_Excel.png
similarity index 100%
rename from assets/img/sipe/Sipe_Attendance_Excel.png
rename to public/assets/img/sipe/Sipe_Attendance_Excel.png
diff --git a/assets/img/sipe/Sipe_Mission_Example.png b/public/assets/img/sipe/Sipe_Mission_Example.png
similarity index 100%
rename from assets/img/sipe/Sipe_Mission_Example.png
rename to public/assets/img/sipe/Sipe_Mission_Example.png
diff --git a/assets/img/sipe/Sipethon_Elice.png b/public/assets/img/sipe/Sipethon_Elice.png
similarity index 100%
rename from assets/img/sipe/Sipethon_Elice.png
rename to public/assets/img/sipe/Sipethon_Elice.png
diff --git a/assets/img/sipe/Sipethon_Idea_List.png b/public/assets/img/sipe/Sipethon_Idea_List.png
similarity index 100%
rename from assets/img/sipe/Sipethon_Idea_List.png
rename to public/assets/img/sipe/Sipethon_Idea_List.png
diff --git a/assets/img/sipe/Sipethon_Presentation.png b/public/assets/img/sipe/Sipethon_Presentation.png
similarity index 100%
rename from assets/img/sipe/Sipethon_Presentation.png
rename to public/assets/img/sipe/Sipethon_Presentation.png
diff --git a/assets/img/sipe/Sipethon_SlackBot_Result_1.png b/public/assets/img/sipe/Sipethon_SlackBot_Result_1.png
similarity index 100%
rename from assets/img/sipe/Sipethon_SlackBot_Result_1.png
rename to public/assets/img/sipe/Sipethon_SlackBot_Result_1.png
diff --git a/assets/img/sipe/Sipethon_SlackBot_Result_2.png b/public/assets/img/sipe/Sipethon_SlackBot_Result_2.png
similarity index 100%
rename from assets/img/sipe/Sipethon_SlackBot_Result_2.png
rename to public/assets/img/sipe/Sipethon_SlackBot_Result_2.png
diff --git a/assets/img/sipe/Sipethon_SlackBot_Result_3.png b/public/assets/img/sipe/Sipethon_SlackBot_Result_3.png
similarity index 100%
rename from assets/img/sipe/Sipethon_SlackBot_Result_3.png
rename to public/assets/img/sipe/Sipethon_SlackBot_Result_3.png
diff --git a/assets/img/sipe/Sipethon_Team3_Meeting.png b/public/assets/img/sipe/Sipethon_Team3_Meeting.png
similarity index 100%
rename from assets/img/sipe/Sipethon_Team3_Meeting.png
rename to public/assets/img/sipe/Sipethon_Team3_Meeting.png
diff --git a/assets/img/sipe/Sipethon_Team3_Mission_PreWork.png b/public/assets/img/sipe/Sipethon_Team3_Mission_PreWork.png
similarity index 100%
rename from assets/img/sipe/Sipethon_Team3_Mission_PreWork.png
rename to public/assets/img/sipe/Sipethon_Team3_Mission_PreWork.png
diff --git a/assets/img/sipe/Sipethon_crycheeseburger.png b/public/assets/img/sipe/Sipethon_crycheeseburger.png
similarity index 100%
rename from assets/img/sipe/Sipethon_crycheeseburger.png
rename to public/assets/img/sipe/Sipethon_crycheeseburger.png
diff --git a/assets/img/spring/Spring-Core-Principle-4-1.png b/public/assets/img/spring/Spring-Core-Principle-4-1.png
similarity index 100%
rename from assets/img/spring/Spring-Core-Principle-4-1.png
rename to public/assets/img/spring/Spring-Core-Principle-4-1.png
diff --git a/assets/img/spring/Spring-Core-Principle-4-2.png b/public/assets/img/spring/Spring-Core-Principle-4-2.png
similarity index 100%
rename from assets/img/spring/Spring-Core-Principle-4-2.png
rename to public/assets/img/spring/Spring-Core-Principle-4-2.png
diff --git a/assets/img/spring/Spring-Core-Principle-4-3.png b/public/assets/img/spring/Spring-Core-Principle-4-3.png
similarity index 100%
rename from assets/img/spring/Spring-Core-Principle-4-3.png
rename to public/assets/img/spring/Spring-Core-Principle-4-3.png
diff --git a/assets/img/spring/Spring-DB-ConnectionPool-DataSource-1.png b/public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-1.png
similarity index 100%
rename from assets/img/spring/Spring-DB-ConnectionPool-DataSource-1.png
rename to public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-1.png
diff --git a/assets/img/spring/Spring-DB-ConnectionPool-DataSource-2.png b/public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-2.png
similarity index 100%
rename from assets/img/spring/Spring-DB-ConnectionPool-DataSource-2.png
rename to public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-2.png
diff --git a/assets/img/spring/Spring-DB-ConnectionPool-DataSource-3.png b/public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-3.png
similarity index 100%
rename from assets/img/spring/Spring-DB-ConnectionPool-DataSource-3.png
rename to public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-3.png
diff --git a/assets/img/spring/Spring-DB-ConnectionPool-DataSource-4.png b/public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-4.png
similarity index 100%
rename from assets/img/spring/Spring-DB-ConnectionPool-DataSource-4.png
rename to public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-4.png
diff --git a/assets/img/spring/Spring-DB-ConnectionPool-DataSource-5.png b/public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-5.png
similarity index 100%
rename from assets/img/spring/Spring-DB-ConnectionPool-DataSource-5.png
rename to public/assets/img/spring/Spring-DB-ConnectionPool-DataSource-5.png
diff --git a/assets/img/spring/Spring-DB-Transaction-1.png b/public/assets/img/spring/Spring-DB-Transaction-1.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-1.png
rename to public/assets/img/spring/Spring-DB-Transaction-1.png
diff --git a/assets/img/spring/Spring-DB-Transaction-10.png b/public/assets/img/spring/Spring-DB-Transaction-10.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-10.png
rename to public/assets/img/spring/Spring-DB-Transaction-10.png
diff --git a/assets/img/spring/Spring-DB-Transaction-2.png b/public/assets/img/spring/Spring-DB-Transaction-2.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-2.png
rename to public/assets/img/spring/Spring-DB-Transaction-2.png
diff --git a/assets/img/spring/Spring-DB-Transaction-3.png b/public/assets/img/spring/Spring-DB-Transaction-3.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-3.png
rename to public/assets/img/spring/Spring-DB-Transaction-3.png
diff --git a/assets/img/spring/Spring-DB-Transaction-4.png b/public/assets/img/spring/Spring-DB-Transaction-4.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-4.png
rename to public/assets/img/spring/Spring-DB-Transaction-4.png
diff --git a/assets/img/spring/Spring-DB-Transaction-5.png b/public/assets/img/spring/Spring-DB-Transaction-5.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-5.png
rename to public/assets/img/spring/Spring-DB-Transaction-5.png
diff --git a/assets/img/spring/Spring-DB-Transaction-6.png b/public/assets/img/spring/Spring-DB-Transaction-6.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-6.png
rename to public/assets/img/spring/Spring-DB-Transaction-6.png
diff --git a/assets/img/spring/Spring-DB-Transaction-7.png b/public/assets/img/spring/Spring-DB-Transaction-7.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-7.png
rename to public/assets/img/spring/Spring-DB-Transaction-7.png
diff --git a/assets/img/spring/Spring-DB-Transaction-8.png b/public/assets/img/spring/Spring-DB-Transaction-8.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-8.png
rename to public/assets/img/spring/Spring-DB-Transaction-8.png
diff --git a/assets/img/spring/Spring-DB-Transaction-9.png b/public/assets/img/spring/Spring-DB-Transaction-9.png
similarity index 100%
rename from assets/img/spring/Spring-DB-Transaction-9.png
rename to public/assets/img/spring/Spring-DB-Transaction-9.png
diff --git a/assets/img/spring/Spring-JDBC-1.png b/public/assets/img/spring/Spring-JDBC-1.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-1.png
rename to public/assets/img/spring/Spring-JDBC-1.png
diff --git a/assets/img/spring/Spring-JDBC-10.png b/public/assets/img/spring/Spring-JDBC-10.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-10.png
rename to public/assets/img/spring/Spring-JDBC-10.png
diff --git a/assets/img/spring/Spring-JDBC-11.png b/public/assets/img/spring/Spring-JDBC-11.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-11.png
rename to public/assets/img/spring/Spring-JDBC-11.png
diff --git a/assets/img/spring/Spring-JDBC-12.png b/public/assets/img/spring/Spring-JDBC-12.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-12.png
rename to public/assets/img/spring/Spring-JDBC-12.png
diff --git a/assets/img/spring/Spring-JDBC-13.png b/public/assets/img/spring/Spring-JDBC-13.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-13.png
rename to public/assets/img/spring/Spring-JDBC-13.png
diff --git a/assets/img/spring/Spring-JDBC-14.png b/public/assets/img/spring/Spring-JDBC-14.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-14.png
rename to public/assets/img/spring/Spring-JDBC-14.png
diff --git a/assets/img/spring/Spring-JDBC-2-2.png b/public/assets/img/spring/Spring-JDBC-2-2.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-2-2.png
rename to public/assets/img/spring/Spring-JDBC-2-2.png
diff --git a/assets/img/spring/Spring-JDBC-2.png b/public/assets/img/spring/Spring-JDBC-2.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-2.png
rename to public/assets/img/spring/Spring-JDBC-2.png
diff --git a/assets/img/spring/Spring-JDBC-3.png b/public/assets/img/spring/Spring-JDBC-3.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-3.png
rename to public/assets/img/spring/Spring-JDBC-3.png
diff --git a/assets/img/spring/Spring-JDBC-4.png b/public/assets/img/spring/Spring-JDBC-4.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-4.png
rename to public/assets/img/spring/Spring-JDBC-4.png
diff --git a/assets/img/spring/Spring-JDBC-5.png b/public/assets/img/spring/Spring-JDBC-5.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-5.png
rename to public/assets/img/spring/Spring-JDBC-5.png
diff --git a/assets/img/spring/Spring-JDBC-6.png b/public/assets/img/spring/Spring-JDBC-6.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-6.png
rename to public/assets/img/spring/Spring-JDBC-6.png
diff --git a/assets/img/spring/Spring-JDBC-7.png b/public/assets/img/spring/Spring-JDBC-7.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-7.png
rename to public/assets/img/spring/Spring-JDBC-7.png
diff --git a/assets/img/spring/Spring-JDBC-8.png b/public/assets/img/spring/Spring-JDBC-8.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-8.png
rename to public/assets/img/spring/Spring-JDBC-8.png
diff --git a/assets/img/spring/Spring-JDBC-9.png b/public/assets/img/spring/Spring-JDBC-9.png
similarity index 100%
rename from assets/img/spring/Spring-JDBC-9.png
rename to public/assets/img/spring/Spring-JDBC-9.png
diff --git a/assets/img/spring/Spring-mvc-1.png b/public/assets/img/spring/Spring-mvc-1.png
similarity index 100%
rename from assets/img/spring/Spring-mvc-1.png
rename to public/assets/img/spring/Spring-mvc-1.png
diff --git a/assets/img/spring/Spring-mvc-2.png b/public/assets/img/spring/Spring-mvc-2.png
similarity index 100%
rename from assets/img/spring/Spring-mvc-2.png
rename to public/assets/img/spring/Spring-mvc-2.png
diff --git a/assets/img/spring/Spring-mvc-3.png b/public/assets/img/spring/Spring-mvc-3.png
similarity index 100%
rename from assets/img/spring/Spring-mvc-3.png
rename to public/assets/img/spring/Spring-mvc-3.png
diff --git a/assets/img/spring/Spring-mvc-4.png b/public/assets/img/spring/Spring-mvc-4.png
similarity index 100%
rename from assets/img/spring/Spring-mvc-4.png
rename to public/assets/img/spring/Spring-mvc-4.png
diff --git a/assets/img/spring/spring-core-principle-4-2-1.md.png b/public/assets/img/spring/spring-core-principle-4-2-1.md.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-4-2-1.md.png
rename to public/assets/img/spring/spring-core-principle-4-2-1.md.png
diff --git a/assets/img/spring/spring-core-principle-5-1.png b/public/assets/img/spring/spring-core-principle-5-1.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-5-1.png
rename to public/assets/img/spring/spring-core-principle-5-1.png
diff --git a/assets/img/spring/spring-core-principle-5-2.png b/public/assets/img/spring/spring-core-principle-5-2.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-5-2.png
rename to public/assets/img/spring/spring-core-principle-5-2.png
diff --git a/assets/img/spring/spring-core-principle-9_1.png b/public/assets/img/spring/spring-core-principle-9_1.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_1.png
rename to public/assets/img/spring/spring-core-principle-9_1.png
diff --git a/assets/img/spring/spring-core-principle-9_2.png b/public/assets/img/spring/spring-core-principle-9_2.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_2.png
rename to public/assets/img/spring/spring-core-principle-9_2.png
diff --git a/assets/img/spring/spring-core-principle-9_3.png b/public/assets/img/spring/spring-core-principle-9_3.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_3.png
rename to public/assets/img/spring/spring-core-principle-9_3.png
diff --git a/assets/img/spring/spring-core-principle-9_4.png b/public/assets/img/spring/spring-core-principle-9_4.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_4.png
rename to public/assets/img/spring/spring-core-principle-9_4.png
diff --git a/assets/img/spring/spring-core-principle-9_5.png b/public/assets/img/spring/spring-core-principle-9_5.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_5.png
rename to public/assets/img/spring/spring-core-principle-9_5.png
diff --git a/assets/img/spring/spring-core-principle-9_6.png b/public/assets/img/spring/spring-core-principle-9_6.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-9_6.png
rename to public/assets/img/spring/spring-core-principle-9_6.png
diff --git a/assets/img/spring/spring-core-principle-section3-1.png b/public/assets/img/spring/spring-core-principle-section3-1.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-section3-1.png
rename to public/assets/img/spring/spring-core-principle-section3-1.png
diff --git a/assets/img/spring/spring-core-principle-section3-2.png b/public/assets/img/spring/spring-core-principle-section3-2.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-section3-2.png
rename to public/assets/img/spring/spring-core-principle-section3-2.png
diff --git a/assets/img/spring/spring-core-principle-section3-3.png b/public/assets/img/spring/spring-core-principle-section3-3.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-section3-3.png
rename to public/assets/img/spring/spring-core-principle-section3-3.png
diff --git a/assets/img/spring/spring-core-principle-section3-4.png b/public/assets/img/spring/spring-core-principle-section3-4.png
similarity index 100%
rename from assets/img/spring/spring-core-principle-section3-4.png
rename to public/assets/img/spring/spring-core-principle-section3-4.png
diff --git a/assets/img/spring/spring-logback-structure-1.png b/public/assets/img/spring/spring-logback-structure-1.png
similarity index 100%
rename from assets/img/spring/spring-logback-structure-1.png
rename to public/assets/img/spring/spring-logback-structure-1.png
diff --git a/assets/img/spring/spring-logback-structure-2.png b/public/assets/img/spring/spring-logback-structure-2.png
similarity index 100%
rename from assets/img/spring/spring-logback-structure-2.png
rename to public/assets/img/spring/spring-logback-structure-2.png
diff --git a/assets/img/spring/spring-logback-structure-3.png b/public/assets/img/spring/spring-logback-structure-3.png
similarity index 100%
rename from assets/img/spring/spring-logback-structure-3.png
rename to public/assets/img/spring/spring-logback-structure-3.png
diff --git a/assets/img/spring/spring-mvc-concept_1.png b/public/assets/img/spring/spring-mvc-concept_1.png
similarity index 100%
rename from assets/img/spring/spring-mvc-concept_1.png
rename to public/assets/img/spring/spring-mvc-concept_1.png
diff --git a/assets/img/spring/spring-mvc-concept_2.png b/public/assets/img/spring/spring-mvc-concept_2.png
similarity index 100%
rename from assets/img/spring/spring-mvc-concept_2.png
rename to public/assets/img/spring/spring-mvc-concept_2.png
diff --git a/assets/img/spring/spring-mvc-concept_3.png b/public/assets/img/spring/spring-mvc-concept_3.png
similarity index 100%
rename from assets/img/spring/spring-mvc-concept_3.png
rename to public/assets/img/spring/spring-mvc-concept_3.png
diff --git a/assets/img/spring/spring-mvc-concept_4.png b/public/assets/img/spring/spring-mvc-concept_4.png
similarity index 100%
rename from assets/img/spring/spring-mvc-concept_4.png
rename to public/assets/img/spring/spring-mvc-concept_4.png
diff --git a/assets/img/springboot/springboot-h2-db-install-1.png b/public/assets/img/springboot/springboot-h2-db-install-1.png
similarity index 100%
rename from assets/img/springboot/springboot-h2-db-install-1.png
rename to public/assets/img/springboot/springboot-h2-db-install-1.png
diff --git a/assets/img/springboot/springboot-h2-db-install-2.png b/public/assets/img/springboot/springboot-h2-db-install-2.png
similarity index 100%
rename from assets/img/springboot/springboot-h2-db-install-2.png
rename to public/assets/img/springboot/springboot-h2-db-install-2.png
diff --git a/assets/img/springboot/springboot-h2-db-install-3.png b/public/assets/img/springboot/springboot-h2-db-install-3.png
similarity index 100%
rename from assets/img/springboot/springboot-h2-db-install-3.png
rename to public/assets/img/springboot/springboot-h2-db-install-3.png
diff --git a/assets/img/springboot/springboot-jpa2-advance-collection-1.png b/public/assets/img/springboot/springboot-jpa2-advance-collection-1.png
similarity index 100%
rename from assets/img/springboot/springboot-jpa2-advance-collection-1.png
rename to public/assets/img/springboot/springboot-jpa2-advance-collection-1.png
diff --git a/assets/img/springboot/springboot-logging-filter-format-1.png b/public/assets/img/springboot/springboot-logging-filter-format-1.png
similarity index 100%
rename from assets/img/springboot/springboot-logging-filter-format-1.png
rename to public/assets/img/springboot/springboot-logging-filter-format-1.png
diff --git a/assets/img/springboot/springboot-logging-filter-format-2.png b/public/assets/img/springboot/springboot-logging-filter-format-2.png
similarity index 100%
rename from assets/img/springboot/springboot-logging-filter-format-2.png
rename to public/assets/img/springboot/springboot-logging-filter-format-2.png
diff --git a/assets/img/springboot/springboot-logging-filter-interceptor.png b/public/assets/img/springboot/springboot-logging-filter-interceptor.png
similarity index 100%
rename from assets/img/springboot/springboot-logging-filter-interceptor.png
rename to public/assets/img/springboot/springboot-logging-filter-interceptor.png
diff --git a/assets/img/springboot/springboot-logging-filter-traceId.png b/public/assets/img/springboot/springboot-logging-filter-traceId.png
similarity index 100%
rename from assets/img/springboot/springboot-logging-filter-traceId.png
rename to public/assets/img/springboot/springboot-logging-filter-traceId.png
diff --git a/assets/img/springboot/springboot-multi-module-core-api.png b/public/assets/img/springboot/springboot-multi-module-core-api.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module-core-api.png
rename to public/assets/img/springboot/springboot-multi-module-core-api.png
diff --git a/assets/img/springboot/springboot-multi-module-domain-in-core-api.png b/public/assets/img/springboot/springboot-multi-module-domain-in-core-api.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module-domain-in-core-api.png
rename to public/assets/img/springboot/springboot-multi-module-domain-in-core-api.png
diff --git a/assets/img/springboot/springboot-multi-module-intelliJ.png b/public/assets/img/springboot/springboot-multi-module-intelliJ.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module-intelliJ.png
rename to public/assets/img/springboot/springboot-multi-module-intelliJ.png
diff --git a/assets/img/springboot/springboot-multi-module-logback-xml-loglevel.png b/public/assets/img/springboot/springboot-multi-module-logback-xml-loglevel.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module-logback-xml-loglevel.png
rename to public/assets/img/springboot/springboot-multi-module-logback-xml-loglevel.png
diff --git a/assets/img/springboot/springboot-multi-module-logback-xml.png b/public/assets/img/springboot/springboot-multi-module-logback-xml.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module-logback-xml.png
rename to public/assets/img/springboot/springboot-multi-module-logback-xml.png
diff --git a/assets/img/springboot/springboot-multi-module.png b/public/assets/img/springboot/springboot-multi-module.png
similarity index 100%
rename from assets/img/springboot/springboot-multi-module.png
rename to public/assets/img/springboot/springboot-multi-module.png
diff --git a/assets/img/springboot/springboot_merge.png b/public/assets/img/springboot/springboot_merge.png
similarity index 100%
rename from assets/img/springboot/springboot_merge.png
rename to public/assets/img/springboot/springboot_merge.png
diff --git a/assets/img/sql/sql-right-join.png b/public/assets/img/sql/sql-right-join.png
similarity index 100%
rename from assets/img/sql/sql-right-join.png
rename to public/assets/img/sql/sql-right-join.png
diff --git a/assets/img/technical_writing/Technical-Writing-Seminar-Review-1.png b/public/assets/img/technical_writing/Technical-Writing-Seminar-Review-1.png
similarity index 100%
rename from assets/img/technical_writing/Technical-Writing-Seminar-Review-1.png
rename to public/assets/img/technical_writing/Technical-Writing-Seminar-Review-1.png
diff --git a/assets/img/technology/DDD-Serenade-7th-Certificate.png b/public/assets/img/technology/DDD-Serenade-7th-Certificate.png
similarity index 100%
rename from assets/img/technology/DDD-Serenade-7th-Certificate.png
rename to public/assets/img/technology/DDD-Serenade-7th-Certificate.png
diff --git a/assets/img/technology/DDD-Week1-Review-And-EventStorming-1.png b/public/assets/img/technology/DDD-Week1-Review-And-EventStorming-1.png
similarity index 100%
rename from assets/img/technology/DDD-Week1-Review-And-EventStorming-1.png
rename to public/assets/img/technology/DDD-Week1-Review-And-EventStorming-1.png
diff --git a/assets/img/technology/DDD-Week1-Review-And-EventStorming-2.png b/public/assets/img/technology/DDD-Week1-Review-And-EventStorming-2.png
similarity index 100%
rename from assets/img/technology/DDD-Week1-Review-And-EventStorming-2.png
rename to public/assets/img/technology/DDD-Week1-Review-And-EventStorming-2.png
diff --git a/assets/img/technology/DDD-Week1-Review-And-EventStorming-3.png b/public/assets/img/technology/DDD-Week1-Review-And-EventStorming-3.png
similarity index 100%
rename from assets/img/technology/DDD-Week1-Review-And-EventStorming-3.png
rename to public/assets/img/technology/DDD-Week1-Review-And-EventStorming-3.png
diff --git a/assets/img/technology/DDD-Week1-Review-And-EventStorming-4.png b/public/assets/img/technology/DDD-Week1-Review-And-EventStorming-4.png
similarity index 100%
rename from assets/img/technology/DDD-Week1-Review-And-EventStorming-4.png
rename to public/assets/img/technology/DDD-Week1-Review-And-EventStorming-4.png
diff --git a/assets/img/technology/DDD_Serenade_7th_Week2_1.png b/public/assets/img/technology/DDD_Serenade_7th_Week2_1.png
similarity index 100%
rename from assets/img/technology/DDD_Serenade_7th_Week2_1.png
rename to public/assets/img/technology/DDD_Serenade_7th_Week2_1.png
diff --git a/assets/img/technology/DDD_Serenade_7th_Week2_2.png b/public/assets/img/technology/DDD_Serenade_7th_Week2_2.png
similarity index 100%
rename from assets/img/technology/DDD_Serenade_7th_Week2_2.png
rename to public/assets/img/technology/DDD_Serenade_7th_Week2_2.png
diff --git a/assets/img/technology/GitHub-Branch-Protection-Rule_1.png b/public/assets/img/technology/GitHub-Branch-Protection-Rule_1.png
similarity index 100%
rename from assets/img/technology/GitHub-Branch-Protection-Rule_1.png
rename to public/assets/img/technology/GitHub-Branch-Protection-Rule_1.png
diff --git a/assets/img/technology/GitHub-Branch-Protection-Rule_2.png b/public/assets/img/technology/GitHub-Branch-Protection-Rule_2.png
similarity index 100%
rename from assets/img/technology/GitHub-Branch-Protection-Rule_2.png
rename to public/assets/img/technology/GitHub-Branch-Protection-Rule_2.png
diff --git a/assets/img/technology/GitHub-Branch-Protection-Rule_3.png b/public/assets/img/technology/GitHub-Branch-Protection-Rule_3.png
similarity index 100%
rename from assets/img/technology/GitHub-Branch-Protection-Rule_3.png
rename to public/assets/img/technology/GitHub-Branch-Protection-Rule_3.png
diff --git a/assets/img/technology/GitHub-Branch-Protection-Rule_4.png b/public/assets/img/technology/GitHub-Branch-Protection-Rule_4.png
similarity index 100%
rename from assets/img/technology/GitHub-Branch-Protection-Rule_4.png
rename to public/assets/img/technology/GitHub-Branch-Protection-Rule_4.png
diff --git a/assets/img/technology/GitHub-Branch-Protection-Rule_5.png b/public/assets/img/technology/GitHub-Branch-Protection-Rule_5.png
similarity index 100%
rename from assets/img/technology/GitHub-Branch-Protection-Rule_5.png
rename to public/assets/img/technology/GitHub-Branch-Protection-Rule_5.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_1.png b/public/assets/img/technology/Google-Research-Console-Verification_1.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_1.png
rename to public/assets/img/technology/Google-Research-Console-Verification_1.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_2.png b/public/assets/img/technology/Google-Research-Console-Verification_2.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_2.png
rename to public/assets/img/technology/Google-Research-Console-Verification_2.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_3.png b/public/assets/img/technology/Google-Research-Console-Verification_3.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_3.png
rename to public/assets/img/technology/Google-Research-Console-Verification_3.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_4.png b/public/assets/img/technology/Google-Research-Console-Verification_4.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_4.png
rename to public/assets/img/technology/Google-Research-Console-Verification_4.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_4_2.png b/public/assets/img/technology/Google-Research-Console-Verification_4_2.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_4_2.png
rename to public/assets/img/technology/Google-Research-Console-Verification_4_2.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_5.png b/public/assets/img/technology/Google-Research-Console-Verification_5.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_5.png
rename to public/assets/img/technology/Google-Research-Console-Verification_5.png
diff --git a/assets/img/technology/Google-Research-Console-Verification_6.png b/public/assets/img/technology/Google-Research-Console-Verification_6.png
similarity index 100%
rename from assets/img/technology/Google-Research-Console-Verification_6.png
rename to public/assets/img/technology/Google-Research-Console-Verification_6.png
diff --git a/assets/img/technology/Inflearn-Gemini-Dev-Commerce-Backend-Review-Certificate.png b/public/assets/img/technology/Inflearn-Gemini-Dev-Commerce-Backend-Review-Certificate.png
similarity index 100%
rename from assets/img/technology/Inflearn-Gemini-Dev-Commerce-Backend-Review-Certificate.png
rename to public/assets/img/technology/Inflearn-Gemini-Dev-Commerce-Backend-Review-Certificate.png
diff --git a/assets/img/technology/NGINX-1.png b/public/assets/img/technology/NGINX-1.png
similarity index 100%
rename from assets/img/technology/NGINX-1.png
rename to public/assets/img/technology/NGINX-1.png
diff --git a/assets/img/technology/NGINX-2.png b/public/assets/img/technology/NGINX-2.png
similarity index 100%
rename from assets/img/technology/NGINX-2.png
rename to public/assets/img/technology/NGINX-2.png
diff --git a/assets/img/technology/NGINX-3.png b/public/assets/img/technology/NGINX-3.png
similarity index 100%
rename from assets/img/technology/NGINX-3.png
rename to public/assets/img/technology/NGINX-3.png
diff --git a/assets/img/technology/NGINX-4.png b/public/assets/img/technology/NGINX-4.png
similarity index 100%
rename from assets/img/technology/NGINX-4.png
rename to public/assets/img/technology/NGINX-4.png
diff --git a/assets/img/technology/NGINX-5.png b/public/assets/img/technology/NGINX-5.png
similarity index 100%
rename from assets/img/technology/NGINX-5.png
rename to public/assets/img/technology/NGINX-5.png
diff --git a/assets/img/technology/Performance-ConCept-Load-Test-Type.png b/public/assets/img/technology/Performance-ConCept-Load-Test-Type.png
similarity index 100%
rename from assets/img/technology/Performance-ConCept-Load-Test-Type.png
rename to public/assets/img/technology/Performance-ConCept-Load-Test-Type.png
diff --git a/assets/img/technology/Performance-Concept-Common-Throughput-Curve.png b/public/assets/img/technology/Performance-Concept-Common-Throughput-Curve.png
similarity index 100%
rename from assets/img/technology/Performance-Concept-Common-Throughput-Curve.png
rename to public/assets/img/technology/Performance-Concept-Common-Throughput-Curve.png
diff --git a/assets/img/technology/Set-Cookie_1.png b/public/assets/img/technology/Set-Cookie_1.png
similarity index 100%
rename from assets/img/technology/Set-Cookie_1.png
rename to public/assets/img/technology/Set-Cookie_1.png
diff --git a/assets/img/technology/Set-Cookie_2.png b/public/assets/img/technology/Set-Cookie_2.png
similarity index 100%
rename from assets/img/technology/Set-Cookie_2.png
rename to public/assets/img/technology/Set-Cookie_2.png
diff --git a/assets/img/technology/Technology-HTTPS-1.png b/public/assets/img/technology/Technology-HTTPS-1.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-1.png
rename to public/assets/img/technology/Technology-HTTPS-1.png
diff --git a/assets/img/technology/Technology-HTTPS-2.png b/public/assets/img/technology/Technology-HTTPS-2.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-2.png
rename to public/assets/img/technology/Technology-HTTPS-2.png
diff --git a/assets/img/technology/Technology-HTTPS-3.png b/public/assets/img/technology/Technology-HTTPS-3.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-3.png
rename to public/assets/img/technology/Technology-HTTPS-3.png
diff --git a/assets/img/technology/Technology-HTTPS-4.png b/public/assets/img/technology/Technology-HTTPS-4.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-4.png
rename to public/assets/img/technology/Technology-HTTPS-4.png
diff --git a/assets/img/technology/Technology-HTTPS-5.png b/public/assets/img/technology/Technology-HTTPS-5.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-5.png
rename to public/assets/img/technology/Technology-HTTPS-5.png
diff --git a/assets/img/technology/Technology-HTTPS-not-secure.png b/public/assets/img/technology/Technology-HTTPS-not-secure.png
similarity index 100%
rename from assets/img/technology/Technology-HTTPS-not-secure.png
rename to public/assets/img/technology/Technology-HTTPS-not-secure.png
diff --git a/assets/img/technology/Technology-Performance-Testing-1.png b/public/assets/img/technology/Technology-Performance-Testing-1.png
similarity index 100%
rename from assets/img/technology/Technology-Performance-Testing-1.png
rename to public/assets/img/technology/Technology-Performance-Testing-1.png
diff --git a/assets/img/technology/Technology-Performance-Testing-2.png b/public/assets/img/technology/Technology-Performance-Testing-2.png
similarity index 100%
rename from assets/img/technology/Technology-Performance-Testing-2.png
rename to public/assets/img/technology/Technology-Performance-Testing-2.png
diff --git a/assets/img/technology/Technology-Performance-Testing-3.png b/public/assets/img/technology/Technology-Performance-Testing-3.png
similarity index 100%
rename from assets/img/technology/Technology-Performance-Testing-3.png
rename to public/assets/img/technology/Technology-Performance-Testing-3.png
diff --git a/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-1.png b/public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-1.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-1.png
rename to public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-1.png
diff --git a/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-2.png b/public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-2.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-2.png
rename to public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-2.png
diff --git a/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-3.png b/public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-3.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-3.png
rename to public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-3.png
diff --git a/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-4.png b/public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-4.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-4.png
rename to public/assets/img/technology/circuit-breaker/circuit-breaker-concept-and-apply-springboot-kotlin-4.png
diff --git a/assets/img/technology/circuit-breaker/circuit-breeaker-monitoring-metrics.png b/public/assets/img/technology/circuit-breaker/circuit-breeaker-monitoring-metrics.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/circuit-breeaker-monitoring-metrics.png
rename to public/assets/img/technology/circuit-breaker/circuit-breeaker-monitoring-metrics.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-naverpay-order.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-naverpay-order.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-naverpay-order.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-naverpay-order.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-500-error.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-500-error.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-500-error.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-500-error.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-200-success.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-200-success.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-200-success.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-200-success.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-400-fail.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-400-fail.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-400-fail.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-400-fail.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-rule.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-rule.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-rule.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-mocking-rule.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-pg.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-pg.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-pg.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-payment-pg.png
diff --git a/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-testcode-success.png b/public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-testcode-success.png
similarity index 100%
rename from assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-testcode-success.png
rename to public/assets/img/technology/circuit-breaker/springboot-kotlin-external-api-circuit-breaker-testcode-success.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-1.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-1.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-1.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-1.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-2.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-2.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-2.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-2.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-3.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-3.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-3.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-3.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-4.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-4.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-4.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-4.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-5.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-5.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-5.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-5.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-6.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-6.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-6.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-6.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-7.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-7.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-7.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-7.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-8.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-8.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-8.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-8.png
diff --git a/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-9.png b/public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-9.png
similarity index 100%
rename from assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-9.png
rename to public/assets/img/technology/daanggn/Daanggn-Tech-MeetUp-2024-Ops-Dev-Team-9.png
diff --git a/assets/img/technology/google-research-console-vertification-rss.png b/public/assets/img/technology/google-research-console-vertification-rss.png
similarity index 100%
rename from assets/img/technology/google-research-console-vertification-rss.png
rename to public/assets/img/technology/google-research-console-vertification-rss.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-1-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-3.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-3.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-3.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-2-3.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-api-server-3-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-3-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-api-server-3-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-api-server-3-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-1-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-3.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-3.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-3.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-2-3.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-3-1-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-cpu-2-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-cpu-2-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-cpu-2-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-cpu-2-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-lag.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-lag.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-lag.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-lag.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-monitoring.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-monitoring.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-monitoring.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-consumer-server-monitoring.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-db-server-monitoring-3-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-db-server-monitoring-3-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-db-server-monitoring-3-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-db-server-monitoring-3-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-infra-and-db-server-monitoring-3-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-infra-and-db-server-monitoring-3-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-infra-and-db-server-monitoring-3-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-infra-and-db-server-monitoring-3-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-infra-server-monitoring-3-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-infra-server-monitoring-3-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-infra-server-monitoring-3-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-infra-server-monitoring-3-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-1-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-2.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-2-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-3-1.png b/public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-3-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-load-test-k6-result-3-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-load-test-k6-result-3-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-monitoring-promethues.png b/public/assets/img/technology/kudadak/coupon-issue-monitoring-promethues.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-monitoring-promethues.png
rename to public/assets/img/technology/kudadak/coupon-issue-monitoring-promethues.png
diff --git a/assets/img/technology/kudadak/coupon-issue-redis-config.png b/public/assets/img/technology/kudadak/coupon-issue-redis-config.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-redis-config.png
rename to public/assets/img/technology/kudadak/coupon-issue-redis-config.png
diff --git a/assets/img/technology/kudadak/coupon-issue-redis-distributed-lock.png b/public/assets/img/technology/kudadak/coupon-issue-redis-distributed-lock.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-redis-distributed-lock.png
rename to public/assets/img/technology/kudadak/coupon-issue-redis-distributed-lock.png
diff --git a/assets/img/technology/kudadak/coupon-issue-redis-rate-limiter.png b/public/assets/img/technology/kudadak/coupon-issue-redis-rate-limiter.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-redis-rate-limiter.png
rename to public/assets/img/technology/kudadak/coupon-issue-redis-rate-limiter.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-db-hikaricp.png b/public/assets/img/technology/kudadak/coupon-issue-system-db-hikaricp.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-db-hikaricp.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-db-hikaricp.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-1.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-2.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-3.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-3.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-3.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-3.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-failure.png.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-failure.png.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-failure.png.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-failure.png.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-success.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-success.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-success.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-consumer-success.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-failed-event-table.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-failed-event-table.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-failed-event-table.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-failed-event-table.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-table.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-table.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-table.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-db-coupon-issue-table.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-k6-result.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-k6-result.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-k6-result.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-k6-result.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-1.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-1.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-1.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-1.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-2.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-2.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-2.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-monitoring-2.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-sequence-diagram.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-sequence-diagram.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-sequence-diagram.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-sequence-diagram.png
diff --git a/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-test-code-success.png b/public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-test-code-success.png
similarity index 100%
rename from assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-test-code-success.png
rename to public/assets/img/technology/kudadak/coupon-issue-system-kafka-dlq-test-code-success.png
diff --git a/assets/img/technology/kudadak/kudadak-aws-ec2-t3.png b/public/assets/img/technology/kudadak/kudadak-aws-ec2-t3.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-aws-ec2-t3.png
rename to public/assets/img/technology/kudadak/kudadak-aws-ec2-t3.png
diff --git a/assets/img/technology/kudadak/kudadak-coupon-issue-system-ddd-strategy-design.png b/public/assets/img/technology/kudadak/kudadak-coupon-issue-system-ddd-strategy-design.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-coupon-issue-system-ddd-strategy-design.png
rename to public/assets/img/technology/kudadak/kudadak-coupon-issue-system-ddd-strategy-design.png
diff --git a/assets/img/technology/kudadak/kudadak-coupon-issue-system-multi-module.png b/public/assets/img/technology/kudadak/kudadak-coupon-issue-system-multi-module.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-coupon-issue-system-multi-module.png
rename to public/assets/img/technology/kudadak/kudadak-coupon-issue-system-multi-module.png
diff --git a/assets/img/technology/kudadak/kudadak-db-monitoring-cpu.png b/public/assets/img/technology/kudadak/kudadak-db-monitoring-cpu.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-db-monitoring-cpu.png
rename to public/assets/img/technology/kudadak/kudadak-db-monitoring-cpu.png
diff --git a/assets/img/technology/kudadak/kudadak-monitoring-architecture-1.png b/public/assets/img/technology/kudadak/kudadak-monitoring-architecture-1.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-monitoring-architecture-1.png
rename to public/assets/img/technology/kudadak/kudadak-monitoring-architecture-1.png
diff --git a/assets/img/technology/kudadak/kudadak-monitoring-architecture-2.png b/public/assets/img/technology/kudadak/kudadak-monitoring-architecture-2.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-monitoring-architecture-2.png
rename to public/assets/img/technology/kudadak/kudadak-monitoring-architecture-2.png
diff --git a/assets/img/technology/kudadak/kudadak-process-workflow-0.png b/public/assets/img/technology/kudadak/kudadak-process-workflow-0.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-process-workflow-0.png
rename to public/assets/img/technology/kudadak/kudadak-process-workflow-0.png
diff --git a/assets/img/technology/kudadak/kudadak-process-workflow-1.png b/public/assets/img/technology/kudadak/kudadak-process-workflow-1.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-process-workflow-1.png
rename to public/assets/img/technology/kudadak/kudadak-process-workflow-1.png
diff --git a/assets/img/technology/kudadak/kudadak-process-workflow-2.png b/public/assets/img/technology/kudadak/kudadak-process-workflow-2.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-process-workflow-2.png
rename to public/assets/img/technology/kudadak/kudadak-process-workflow-2.png
diff --git a/assets/img/technology/kudadak/kudadak-process-workflow-3.png b/public/assets/img/technology/kudadak/kudadak-process-workflow-3.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-process-workflow-3.png
rename to public/assets/img/technology/kudadak/kudadak-process-workflow-3.png
diff --git a/assets/img/technology/kudadak/kudadak-system-architecture-1.png b/public/assets/img/technology/kudadak/kudadak-system-architecture-1.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-system-architecture-1.png
rename to public/assets/img/technology/kudadak/kudadak-system-architecture-1.png
diff --git a/assets/img/technology/kudadak/kudadak-system-architecture-2.png b/public/assets/img/technology/kudadak/kudadak-system-architecture-2.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-system-architecture-2.png
rename to public/assets/img/technology/kudadak/kudadak-system-architecture-2.png
diff --git a/assets/img/technology/kudadak/kudadak-system-architecture-3.png b/public/assets/img/technology/kudadak/kudadak-system-architecture-3.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-system-architecture-3.png
rename to public/assets/img/technology/kudadak/kudadak-system-architecture-3.png
diff --git a/assets/img/technology/kudadak/kudadak-system-architecture-4.png b/public/assets/img/technology/kudadak/kudadak-system-architecture-4.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-system-architecture-4.png
rename to public/assets/img/technology/kudadak/kudadak-system-architecture-4.png
diff --git a/assets/img/technology/kudadak/kudadak-system-architecture-k6.png b/public/assets/img/technology/kudadak/kudadak-system-architecture-k6.png
similarity index 100%
rename from assets/img/technology/kudadak/kudadak-system-architecture-k6.png
rename to public/assets/img/technology/kudadak/kudadak-system-architecture-k6.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-alert-set-conditions.png b/public/assets/img/technology/sentry/spring-boot-sentry-alert-set-conditions.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-alert-set-conditions.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-alert-set-conditions.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-client-keys-dsn.png b/public/assets/img/technology/sentry/spring-boot-sentry-client-keys-dsn.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-client-keys-dsn.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-client-keys-dsn.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-errorCode-alert.png b/public/assets/img/technology/sentry/spring-boot-sentry-errorCode-alert.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-errorCode-alert.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-errorCode-alert.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-errorCode-issue-filtering.png b/public/assets/img/technology/sentry/spring-boot-sentry-errorCode-issue-filtering.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-errorCode-issue-filtering.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-errorCode-issue-filtering.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-feed.png b/public/assets/img/technology/sentry/spring-boot-sentry-feed.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-feed.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-feed.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-grafana-loki-label-globalTraceId.png b/public/assets/img/technology/sentry/spring-boot-sentry-grafana-loki-label-globalTraceId.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-grafana-loki-label-globalTraceId.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-grafana-loki-label-globalTraceId.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-issues-breadcrumbs.png b/public/assets/img/technology/sentry/spring-boot-sentry-issues-breadcrumbs.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-issues-breadcrumbs.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-issues-breadcrumbs.png
diff --git a/assets/img/technology/sentry/spring-boot-sentry-tags-globalTraceId.png b/public/assets/img/technology/sentry/spring-boot-sentry-tags-globalTraceId.png
similarity index 100%
rename from assets/img/technology/sentry/spring-boot-sentry-tags-globalTraceId.png
rename to public/assets/img/technology/sentry/spring-boot-sentry-tags-globalTraceId.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-1.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-1.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-1.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-1.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-10.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-10.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-10.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-10.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-11.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-11.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-11.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-11.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-12.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-12.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-12.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-12.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-13.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-13.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-13.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-13.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-14.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-14.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-14.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-14.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-15.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-15.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-15.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-15.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-16.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-16.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-16.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-16.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-17.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-17.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-17.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-17.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-18.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-18.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-18.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-18.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-19.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-19.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-19.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-19.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-2.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-2.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-2.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-2.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-20.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-20.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-20.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-20.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-21.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-21.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-21.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-21.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-22.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-22.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-22.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-22.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-3.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-3.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-3.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-3.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-4.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-4.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-4.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-4.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-5.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-5.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-5.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-5.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-6.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-6.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-6.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-6.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-7.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-7.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-7.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-7.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-8.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-8.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-8.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-8.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-9.png b/public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-9.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-9.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Compensating-Transaction-9.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-1.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-1.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-1.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-1.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-2.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-2.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-2.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-2.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-3.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-3.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-3.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-3.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-4.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-4.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-4.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-4.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-5.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-5.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-5.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-5.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-6.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-6.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-6.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-6.png
diff --git a/assets/img/technology/slash/Toss-Slash-24-Migration-7.png b/public/assets/img/technology/slash/Toss-Slash-24-Migration-7.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash-24-Migration-7.png
rename to public/assets/img/technology/slash/Toss-Slash-24-Migration-7.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-1.png b/public/assets/img/technology/slash/Toss-Slash22-Server-1.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-1.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-1.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-10.png b/public/assets/img/technology/slash/Toss-Slash22-Server-10.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-10.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-10.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-11.png b/public/assets/img/technology/slash/Toss-Slash22-Server-11.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-11.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-11.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-12.png b/public/assets/img/technology/slash/Toss-Slash22-Server-12.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-12.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-12.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-13.png b/public/assets/img/technology/slash/Toss-Slash22-Server-13.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-13.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-13.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-14.png b/public/assets/img/technology/slash/Toss-Slash22-Server-14.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-14.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-14.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-15.png b/public/assets/img/technology/slash/Toss-Slash22-Server-15.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-15.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-15.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-16.png b/public/assets/img/technology/slash/Toss-Slash22-Server-16.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-16.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-16.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-17.png b/public/assets/img/technology/slash/Toss-Slash22-Server-17.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-17.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-17.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-18.png b/public/assets/img/technology/slash/Toss-Slash22-Server-18.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-18.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-18.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-19.png b/public/assets/img/technology/slash/Toss-Slash22-Server-19.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-19.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-19.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-2.png b/public/assets/img/technology/slash/Toss-Slash22-Server-2.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-2.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-2.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-20.png b/public/assets/img/technology/slash/Toss-Slash22-Server-20.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-20.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-20.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-3.png b/public/assets/img/technology/slash/Toss-Slash22-Server-3.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-3.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-3.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-4.png b/public/assets/img/technology/slash/Toss-Slash22-Server-4.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-4.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-4.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-5.png b/public/assets/img/technology/slash/Toss-Slash22-Server-5.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-5.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-5.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-6.png b/public/assets/img/technology/slash/Toss-Slash22-Server-6.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-6.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-6.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-7.png b/public/assets/img/technology/slash/Toss-Slash22-Server-7.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-7.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-7.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-8.png b/public/assets/img/technology/slash/Toss-Slash22-Server-8.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-8.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-8.png
diff --git a/assets/img/technology/slash/Toss-Slash22-Server-9.png b/public/assets/img/technology/slash/Toss-Slash22-Server-9.png
similarity index 100%
rename from assets/img/technology/slash/Toss-Slash22-Server-9.png
rename to public/assets/img/technology/slash/Toss-Slash22-Server-9.png
diff --git a/assets/img/technology/technology-archtecture-springboot-prometheus-grafana.png b/public/assets/img/technology/technology-archtecture-springboot-prometheus-grafana.png
similarity index 100%
rename from assets/img/technology/technology-archtecture-springboot-prometheus-grafana.png
rename to public/assets/img/technology/technology-archtecture-springboot-prometheus-grafana.png
diff --git a/assets/img/technology/technology-docker-compose-yml-grafana.png b/public/assets/img/technology/technology-docker-compose-yml-grafana.png
similarity index 100%
rename from assets/img/technology/technology-docker-compose-yml-grafana.png
rename to public/assets/img/technology/technology-docker-compose-yml-grafana.png
diff --git a/assets/img/technology/technology-github-readme_1.png b/public/assets/img/technology/technology-github-readme_1.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_1.png
rename to public/assets/img/technology/technology-github-readme_1.png
diff --git a/assets/img/technology/technology-github-readme_2.png b/public/assets/img/technology/technology-github-readme_2.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_2.png
rename to public/assets/img/technology/technology-github-readme_2.png
diff --git a/assets/img/technology/technology-github-readme_5.png b/public/assets/img/technology/technology-github-readme_5.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_5.png
rename to public/assets/img/technology/technology-github-readme_5.png
diff --git a/assets/img/technology/technology-github-readme_github_stats.png b/public/assets/img/technology/technology-github-readme_github_stats.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_github_stats.png
rename to public/assets/img/technology/technology-github-readme_github_stats.png
diff --git a/assets/img/technology/technology-github-readme_header.png b/public/assets/img/technology/technology-github-readme_header.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_header.png
rename to public/assets/img/technology/technology-github-readme_header.png
diff --git a/assets/img/technology/technology-github-readme_main.png b/public/assets/img/technology/technology-github-readme_main.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_main.png
rename to public/assets/img/technology/technology-github-readme_main.png
diff --git a/assets/img/technology/technology-github-readme_profile_view.png b/public/assets/img/technology/technology-github-readme_profile_view.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_profile_view.png
rename to public/assets/img/technology/technology-github-readme_profile_view.png
diff --git a/assets/img/technology/technology-github-readme_result.png b/public/assets/img/technology/technology-github-readme_result.png
similarity index 100%
rename from assets/img/technology/technology-github-readme_result.png
rename to public/assets/img/technology/technology-github-readme_result.png
diff --git a/assets/img/technology/technology-grafana-coupon-api-dashboard.png b/public/assets/img/technology/technology-grafana-coupon-api-dashboard.png
similarity index 100%
rename from assets/img/technology/technology-grafana-coupon-api-dashboard.png
rename to public/assets/img/technology/technology-grafana-coupon-api-dashboard.png
diff --git a/assets/img/technology/technology-grafana-coupon-kafka-consumer-dashboard.png b/public/assets/img/technology/technology-grafana-coupon-kafka-consumer-dashboard.png
similarity index 100%
rename from assets/img/technology/technology-grafana-coupon-kafka-consumer-dashboard.png
rename to public/assets/img/technology/technology-grafana-coupon-kafka-consumer-dashboard.png
diff --git a/assets/img/technology/technology-k6-coupon-create-test-js.png b/public/assets/img/technology/technology-k6-coupon-create-test-js.png
similarity index 100%
rename from assets/img/technology/technology-k6-coupon-create-test-js.png
rename to public/assets/img/technology/technology-k6-coupon-create-test-js.png
diff --git a/assets/img/technology/technology-k6-coupon-issue-test-js.png b/public/assets/img/technology/technology-k6-coupon-issue-test-js.png
similarity index 100%
rename from assets/img/technology/technology-k6-coupon-issue-test-js.png
rename to public/assets/img/technology/technology-k6-coupon-issue-test-js.png
diff --git a/assets/img/technology/technology-monitoring-build-gradle.png b/public/assets/img/technology/technology-monitoring-build-gradle.png
similarity index 100%
rename from assets/img/technology/technology-monitoring-build-gradle.png
rename to public/assets/img/technology/technology-monitoring-build-gradle.png
diff --git a/assets/img/technology/technology-monitoring-yml.png b/public/assets/img/technology/technology-monitoring-yml.png
similarity index 100%
rename from assets/img/technology/technology-monitoring-yml.png
rename to public/assets/img/technology/technology-monitoring-yml.png
diff --git a/assets/img/technology/technology-prometheus-target-up.png b/public/assets/img/technology/technology-prometheus-target-up.png
similarity index 100%
rename from assets/img/technology/technology-prometheus-target-up.png
rename to public/assets/img/technology/technology-prometheus-target-up.png
diff --git a/assets/img/technology/technology-prometheus-yml.png b/public/assets/img/technology/technology-prometheus-yml.png
similarity index 100%
rename from assets/img/technology/technology-prometheus-yml.png
rename to public/assets/img/technology/technology-prometheus-yml.png
diff --git a/assets/img/technology/technology_docker_desktop_grafana_k6.png b/public/assets/img/technology/technology_docker_desktop_grafana_k6.png
similarity index 100%
rename from assets/img/technology/technology_docker_desktop_grafana_k6.png
rename to public/assets/img/technology/technology_docker_desktop_grafana_k6.png
diff --git a/assets/img/technology/technology_grafana_k6.png b/public/assets/img/technology/technology_grafana_k6.png
similarity index 100%
rename from assets/img/technology/technology_grafana_k6.png
rename to public/assets/img/technology/technology_grafana_k6.png
diff --git a/assets/img/technology/technology_k6_Constant_VUs_Result.png b/public/assets/img/technology/technology_k6_Constant_VUs_Result.png
similarity index 100%
rename from assets/img/technology/technology_k6_Constant_VUs_Result.png
rename to public/assets/img/technology/technology_k6_Constant_VUs_Result.png
diff --git a/assets/img/technology/technology_k6_result.png b/public/assets/img/technology/technology_k6_result.png
similarity index 100%
rename from assets/img/technology/technology_k6_result.png
rename to public/assets/img/technology/technology_k6_result.png
diff --git a/assets/img/technology/utterances.png b/public/assets/img/technology/utterances.png
similarity index 100%
rename from assets/img/technology/utterances.png
rename to public/assets/img/technology/utterances.png
diff --git a/assets/img/technology/utterances_2.png b/public/assets/img/technology/utterances_2.png
similarity index 100%
rename from assets/img/technology/utterances_2.png
rename to public/assets/img/technology/utterances_2.png
diff --git a/assets/img/technology/utterances_characteristic.png b/public/assets/img/technology/utterances_characteristic.png
similarity index 100%
rename from assets/img/technology/utterances_characteristic.png
rename to public/assets/img/technology/utterances_characteristic.png
diff --git a/assets/img/technology/utterances_issues.png b/public/assets/img/technology/utterances_issues.png
similarity index 100%
rename from assets/img/technology/utterances_issues.png
rename to public/assets/img/technology/utterances_issues.png
diff --git a/assets/img/technology/utterances_issues_2.png b/public/assets/img/technology/utterances_issues_2.png
similarity index 100%
rename from assets/img/technology/utterances_issues_2.png
rename to public/assets/img/technology/utterances_issues_2.png
diff --git a/assets/img/technology/utterances_issues_mail.png b/public/assets/img/technology/utterances_issues_mail.png
similarity index 100%
rename from assets/img/technology/utterances_issues_mail.png
rename to public/assets/img/technology/utterances_issues_mail.png
diff --git a/assets/img/technology/utterances_setting_1.png b/public/assets/img/technology/utterances_setting_1.png
similarity index 100%
rename from assets/img/technology/utterances_setting_1.png
rename to public/assets/img/technology/utterances_setting_1.png
diff --git a/assets/img/technology/utterances_setting_2.png b/public/assets/img/technology/utterances_setting_2.png
similarity index 100%
rename from assets/img/technology/utterances_setting_2.png
rename to public/assets/img/technology/utterances_setting_2.png
diff --git a/assets/img/technology/utterances_test.png b/public/assets/img/technology/utterances_test.png
similarity index 100%
rename from assets/img/technology/utterances_test.png
rename to public/assets/img/technology/utterances_test.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-1.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-1.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-1.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-1.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-10.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-10.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-10.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-10.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-11.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-11.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-11.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-11.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-12.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-12.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-12.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-12.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-13.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-13.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-13.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-13.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-14.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-14.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-14.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-14.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-15.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-15.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-15.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-15.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-16.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-16.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-16.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-16.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-17.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-17.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-17.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-17.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-18.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-18.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-18.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-18.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-19.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-19.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-19.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-19.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-2.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-2.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-2.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-2.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-20.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-20.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-20.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-20.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-21.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-21.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-21.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-21.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-22.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-22.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-22.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-22.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-23.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-23.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-23.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-23.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-24.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-24.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-24.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-24.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-3.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-3.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-3.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-3.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-4.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-4.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-4.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-4.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-5.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-5.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-5.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-5.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-6.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-6.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-6.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-6.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-7.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-7.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-7.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-7.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-8.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-8.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-8.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-8.png
diff --git a/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-9.png b/public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-9.png
similarity index 100%
rename from assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-9.png
rename to public/assets/img/technology/woowabros/Woowa-Tech-Talk-First-Come-First-Served-Event-9.png
diff --git a/assets/img/testcode/Practical-Testing2-1.png b/public/assets/img/testcode/Practical-Testing2-1.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-1.png
rename to public/assets/img/testcode/Practical-Testing2-1.png
diff --git a/assets/img/testcode/Practical-Testing2-10.png b/public/assets/img/testcode/Practical-Testing2-10.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-10.png
rename to public/assets/img/testcode/Practical-Testing2-10.png
diff --git a/assets/img/testcode/Practical-Testing2-11.png b/public/assets/img/testcode/Practical-Testing2-11.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-11.png
rename to public/assets/img/testcode/Practical-Testing2-11.png
diff --git a/assets/img/testcode/Practical-Testing2-12.png b/public/assets/img/testcode/Practical-Testing2-12.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-12.png
rename to public/assets/img/testcode/Practical-Testing2-12.png
diff --git a/assets/img/testcode/Practical-Testing2-13.png b/public/assets/img/testcode/Practical-Testing2-13.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-13.png
rename to public/assets/img/testcode/Practical-Testing2-13.png
diff --git a/assets/img/testcode/Practical-Testing2-14.png b/public/assets/img/testcode/Practical-Testing2-14.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-14.png
rename to public/assets/img/testcode/Practical-Testing2-14.png
diff --git a/assets/img/testcode/Practical-Testing2-15.png b/public/assets/img/testcode/Practical-Testing2-15.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-15.png
rename to public/assets/img/testcode/Practical-Testing2-15.png
diff --git a/assets/img/testcode/Practical-Testing2-2.png b/public/assets/img/testcode/Practical-Testing2-2.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-2.png
rename to public/assets/img/testcode/Practical-Testing2-2.png
diff --git a/assets/img/testcode/Practical-Testing2-3.png b/public/assets/img/testcode/Practical-Testing2-3.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-3.png
rename to public/assets/img/testcode/Practical-Testing2-3.png
diff --git a/assets/img/testcode/Practical-Testing2-4.png b/public/assets/img/testcode/Practical-Testing2-4.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-4.png
rename to public/assets/img/testcode/Practical-Testing2-4.png
diff --git a/assets/img/testcode/Practical-Testing2-5.png b/public/assets/img/testcode/Practical-Testing2-5.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-5.png
rename to public/assets/img/testcode/Practical-Testing2-5.png
diff --git a/assets/img/testcode/Practical-Testing2-6.png b/public/assets/img/testcode/Practical-Testing2-6.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-6.png
rename to public/assets/img/testcode/Practical-Testing2-6.png
diff --git a/assets/img/testcode/Practical-Testing2-7.png b/public/assets/img/testcode/Practical-Testing2-7.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-7.png
rename to public/assets/img/testcode/Practical-Testing2-7.png
diff --git a/assets/img/testcode/Practical-Testing2-8.png b/public/assets/img/testcode/Practical-Testing2-8.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-8.png
rename to public/assets/img/testcode/Practical-Testing2-8.png
diff --git a/assets/img/testcode/Practical-Testing2-9.png b/public/assets/img/testcode/Practical-Testing2-9.png
similarity index 100%
rename from assets/img/testcode/Practical-Testing2-9.png
rename to public/assets/img/testcode/Practical-Testing2-9.png
diff --git a/assets/img/testcode/Practical_Testing_1.png b/public/assets/img/testcode/Practical_Testing_1.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_1.png
rename to public/assets/img/testcode/Practical_Testing_1.png
diff --git a/assets/img/testcode/Practical_Testing_2.png b/public/assets/img/testcode/Practical_Testing_2.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_2.png
rename to public/assets/img/testcode/Practical_Testing_2.png
diff --git a/assets/img/testcode/Practical_Testing_3.png b/public/assets/img/testcode/Practical_Testing_3.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_3.png
rename to public/assets/img/testcode/Practical_Testing_3.png
diff --git a/assets/img/testcode/Practical_Testing_4.png b/public/assets/img/testcode/Practical_Testing_4.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_4.png
rename to public/assets/img/testcode/Practical_Testing_4.png
diff --git a/assets/img/testcode/Practical_Testing_5.png b/public/assets/img/testcode/Practical_Testing_5.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_5.png
rename to public/assets/img/testcode/Practical_Testing_5.png
diff --git a/assets/img/testcode/Practical_Testing_6.png b/public/assets/img/testcode/Practical_Testing_6.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_6.png
rename to public/assets/img/testcode/Practical_Testing_6.png
diff --git a/assets/img/testcode/Practical_Testing_7.png b/public/assets/img/testcode/Practical_Testing_7.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_7.png
rename to public/assets/img/testcode/Practical_Testing_7.png
diff --git a/assets/img/testcode/Practical_Testing_8.png b/public/assets/img/testcode/Practical_Testing_8.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_8.png
rename to public/assets/img/testcode/Practical_Testing_8.png
diff --git a/assets/img/testcode/Practical_Testing_9.png b/public/assets/img/testcode/Practical_Testing_9.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_9.png
rename to public/assets/img/testcode/Practical_Testing_9.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_1.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_1.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_1.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_1.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_2.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_2.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_2.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_2.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_3.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_3.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_3.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_3.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_4.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_4.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_4.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_4.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_5.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_5.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_5.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_5.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_6.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_6.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_6.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_6.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_7.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_7.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_7.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_7.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_8.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_8.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_8.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_8.png
diff --git a/assets/img/testcode/Practical_Testing_Business_Layer_9.png b/public/assets/img/testcode/Practical_Testing_Business_Layer_9.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Business_Layer_9.png
rename to public/assets/img/testcode/Practical_Testing_Business_Layer_9.png
diff --git a/assets/img/testcode/Practical_Testing_Layered_Architecture.png b/public/assets/img/testcode/Practical_Testing_Layered_Architecture.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Layered_Architecture.png
rename to public/assets/img/testcode/Practical_Testing_Layered_Architecture.png
diff --git a/assets/img/testcode/Practical_Testing_Persistence_Layer_1.png b/public/assets/img/testcode/Practical_Testing_Persistence_Layer_1.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Persistence_Layer_1.png
rename to public/assets/img/testcode/Practical_Testing_Persistence_Layer_1.png
diff --git a/assets/img/testcode/Practical_Testing_Persistence_Layer_2.png b/public/assets/img/testcode/Practical_Testing_Persistence_Layer_2.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Persistence_Layer_2.png
rename to public/assets/img/testcode/Practical_Testing_Persistence_Layer_2.png
diff --git a/assets/img/testcode/Practical_Testing_Presentation_Layer_1.png b/public/assets/img/testcode/Practical_Testing_Presentation_Layer_1.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Presentation_Layer_1.png
rename to public/assets/img/testcode/Practical_Testing_Presentation_Layer_1.png
diff --git a/assets/img/testcode/Practical_Testing_Presentation_Layer_2.png b/public/assets/img/testcode/Practical_Testing_Presentation_Layer_2.png
similarity index 100%
rename from assets/img/testcode/Practical_Testing_Presentation_Layer_2.png
rename to public/assets/img/testcode/Practical_Testing_Presentation_Layer_2.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-1.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-1.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-1.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-1.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-2.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-2.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-2.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-2.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-3.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-3.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-3.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-3.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-4.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-4.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-4.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-4.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-5.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-5.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-5.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-5.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Jacoco-6.png b/public/assets/img/testcode/SpringBoot-TestCode-Jacoco-6.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Jacoco-6.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Jacoco-6.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Unit-1.png b/public/assets/img/testcode/SpringBoot-TestCode-Unit-1.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Unit-1.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Unit-1.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Unit-Error.png b/public/assets/img/testcode/SpringBoot-TestCode-Unit-Error.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Unit-Error.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Unit-Error.png
diff --git a/assets/img/testcode/SpringBoot-TestCode-Unit-QA.png b/public/assets/img/testcode/SpringBoot-TestCode-Unit-QA.png
similarity index 100%
rename from assets/img/testcode/SpringBoot-TestCode-Unit-QA.png
rename to public/assets/img/testcode/SpringBoot-TestCode-Unit-QA.png
diff --git a/assets/img/woorifisa/frontend-coinpick.png b/public/assets/img/woorifisa/frontend-coinpick.png
similarity index 100%
rename from assets/img/woorifisa/frontend-coinpick.png
rename to public/assets/img/woorifisa/frontend-coinpick.png
diff --git a/assets/img/woorifisa/frontend-moamoa.png b/public/assets/img/woorifisa/frontend-moamoa.png
similarity index 100%
rename from assets/img/woorifisa/frontend-moamoa.png
rename to public/assets/img/woorifisa/frontend-moamoa.png
diff --git a/assets/img/woorifisa/frontend-roadmap.png b/public/assets/img/woorifisa/frontend-roadmap.png
similarity index 100%
rename from assets/img/woorifisa/frontend-roadmap.png
rename to public/assets/img/woorifisa/frontend-roadmap.png
diff --git a/assets/img/woorifisa/git-flow-1.jpeg b/public/assets/img/woorifisa/git-flow-1.jpeg
similarity index 100%
rename from assets/img/woorifisa/git-flow-1.jpeg
rename to public/assets/img/woorifisa/git-flow-1.jpeg
diff --git a/assets/img/woorifisa/git-flow-2.jpeg b/public/assets/img/woorifisa/git-flow-2.jpeg
similarity index 100%
rename from assets/img/woorifisa/git-flow-2.jpeg
rename to public/assets/img/woorifisa/git-flow-2.jpeg
diff --git a/assets/img/woorifisa/git-flow-3.jpeg b/public/assets/img/woorifisa/git-flow-3.jpeg
similarity index 100%
rename from assets/img/woorifisa/git-flow-3.jpeg
rename to public/assets/img/woorifisa/git-flow-3.jpeg
diff --git a/assets/img/woorifisa/git-flow-4.jpeg b/public/assets/img/woorifisa/git-flow-4.jpeg
similarity index 100%
rename from assets/img/woorifisa/git-flow-4.jpeg
rename to public/assets/img/woorifisa/git-flow-4.jpeg
diff --git a/assets/img/woorifisa/git-flow-fork.png b/public/assets/img/woorifisa/git-flow-fork.png
similarity index 100%
rename from assets/img/woorifisa/git-flow-fork.png
rename to public/assets/img/woorifisa/git-flow-fork.png
diff --git a/assets/img/woorifisa/git-flow-issue.png b/public/assets/img/woorifisa/git-flow-issue.png
similarity index 100%
rename from assets/img/woorifisa/git-flow-issue.png
rename to public/assets/img/woorifisa/git-flow-issue.png
diff --git a/assets/img/woorifisa/git-flow-repository.jpg b/public/assets/img/woorifisa/git-flow-repository.jpg
similarity index 100%
rename from assets/img/woorifisa/git-flow-repository.jpg
rename to public/assets/img/woorifisa/git-flow-repository.jpg
diff --git a/assets/img/woorifisa/woori_fisa.png b/public/assets/img/woorifisa/woori_fisa.png
similarity index 100%
rename from assets/img/woorifisa/woori_fisa.png
rename to public/assets/img/woorifisa/woori_fisa.png
diff --git a/assets/img/woorifisa/woori_fisa_2.png b/public/assets/img/woorifisa/woori_fisa_2.png
similarity index 100%
rename from assets/img/woorifisa/woori_fisa_2.png
rename to public/assets/img/woorifisa/woori_fisa_2.png
diff --git a/assets/img/woowacourse/2th_BaseballGameResult.png b/public/assets/img/woowacourse/2th_BaseballGameResult.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballGameResult.png
rename to public/assets/img/woowacourse/2th_BaseballGameResult.png
diff --git a/assets/img/woowacourse/2th_BaseballGame_1.png b/public/assets/img/woowacourse/2th_BaseballGame_1.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballGame_1.png
rename to public/assets/img/woowacourse/2th_BaseballGame_1.png
diff --git a/assets/img/woowacourse/2th_BaseballGame_2.png b/public/assets/img/woowacourse/2th_BaseballGame_2.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballGame_2.png
rename to public/assets/img/woowacourse/2th_BaseballGame_2.png
diff --git a/assets/img/woowacourse/2th_BaseballMaker.png b/public/assets/img/woowacourse/2th_BaseballMaker.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballMaker.png
rename to public/assets/img/woowacourse/2th_BaseballMaker.png
diff --git a/assets/img/woowacourse/2th_BaseballNumberGenerator.png b/public/assets/img/woowacourse/2th_BaseballNumberGenerator.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballNumberGenerator.png
rename to public/assets/img/woowacourse/2th_BaseballNumberGenerator.png
diff --git a/assets/img/woowacourse/2th_BaseballRandomNumberGenerator.png b/public/assets/img/woowacourse/2th_BaseballRandomNumberGenerator.png
similarity index 100%
rename from assets/img/woowacourse/2th_BaseballRandomNumberGenerator.png
rename to public/assets/img/woowacourse/2th_BaseballRandomNumberGenerator.png
diff --git a/assets/img/woowacourse/2th_InputView.png b/public/assets/img/woowacourse/2th_InputView.png
similarity index 100%
rename from assets/img/woowacourse/2th_InputView.png
rename to public/assets/img/woowacourse/2th_InputView.png
diff --git a/assets/img/woowacourse/2th_Outputview.png b/public/assets/img/woowacourse/2th_Outputview.png
similarity index 100%
rename from assets/img/woowacourse/2th_Outputview.png
rename to public/assets/img/woowacourse/2th_Outputview.png
diff --git a/assets/img/woowacourse/2th_programming_library.png b/public/assets/img/woowacourse/2th_programming_library.png
similarity index 100%
rename from assets/img/woowacourse/2th_programming_library.png
rename to public/assets/img/woowacourse/2th_programming_library.png
diff --git a/assets/img/woowacourse/2th_spring_mvc_pattern.png b/public/assets/img/woowacourse/2th_spring_mvc_pattern.png
similarity index 100%
rename from assets/img/woowacourse/2th_spring_mvc_pattern.png
rename to public/assets/img/woowacourse/2th_spring_mvc_pattern.png
diff --git a/assets/img/woowacourse/3th_lotto_1.png b/public/assets/img/woowacourse/3th_lotto_1.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_1.png
rename to public/assets/img/woowacourse/3th_lotto_1.png
diff --git a/assets/img/woowacourse/3th_lotto_10_function_requirement.png b/public/assets/img/woowacourse/3th_lotto_10_function_requirement.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_10_function_requirement.png
rename to public/assets/img/woowacourse/3th_lotto_10_function_requirement.png
diff --git a/assets/img/woowacourse/3th_lotto_11_main_try_catch.png b/public/assets/img/woowacourse/3th_lotto_11_main_try_catch.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_11_main_try_catch.png
rename to public/assets/img/woowacourse/3th_lotto_11_main_try_catch.png
diff --git a/assets/img/woowacourse/3th_lotto_12_test_results_success.png b/public/assets/img/woowacourse/3th_lotto_12_test_results_success.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_12_test_results_success.png
rename to public/assets/img/woowacourse/3th_lotto_12_test_results_success.png
diff --git a/assets/img/woowacourse/3th_lotto_2.png b/public/assets/img/woowacourse/3th_lotto_2.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_2.png
rename to public/assets/img/woowacourse/3th_lotto_2.png
diff --git a/assets/img/woowacourse/3th_lotto_3.png b/public/assets/img/woowacourse/3th_lotto_3.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_3.png
rename to public/assets/img/woowacourse/3th_lotto_3.png
diff --git a/assets/img/woowacourse/3th_lotto_4_structure.png b/public/assets/img/woowacourse/3th_lotto_4_structure.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_4_structure.png
rename to public/assets/img/woowacourse/3th_lotto_4_structure.png
diff --git a/assets/img/woowacourse/3th_lotto_5_error_test_success.png b/public/assets/img/woowacourse/3th_lotto_5_error_test_success.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_5_error_test_success.png
rename to public/assets/img/woowacourse/3th_lotto_5_error_test_success.png
diff --git a/assets/img/woowacourse/3th_lotto_6_enum.png b/public/assets/img/woowacourse/3th_lotto_6_enum.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_6_enum.png
rename to public/assets/img/woowacourse/3th_lotto_6_enum.png
diff --git a/assets/img/woowacourse/3th_lotto_7_makeNumber.png b/public/assets/img/woowacourse/3th_lotto_7_makeNumber.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_7_makeNumber.png
rename to public/assets/img/woowacourse/3th_lotto_7_makeNumber.png
diff --git a/assets/img/woowacourse/3th_lotto_8_printResult.png b/public/assets/img/woowacourse/3th_lotto_8_printResult.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_8_printResult.png
rename to public/assets/img/woowacourse/3th_lotto_8_printResult.png
diff --git a/assets/img/woowacourse/3th_lotto_9_exception_test.png b/public/assets/img/woowacourse/3th_lotto_9_exception_test.png
similarity index 100%
rename from assets/img/woowacourse/3th_lotto_9_exception_test.png
rename to public/assets/img/woowacourse/3th_lotto_9_exception_test.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_10_class_diagram.png b/public/assets/img/woowacourse/4th_bridgeGame_10_class_diagram.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_10_class_diagram.png
rename to public/assets/img/woowacourse/4th_bridgeGame_10_class_diagram.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_1_logic.png b/public/assets/img/woowacourse/4th_bridgeGame_1_logic.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_1_logic.png
rename to public/assets/img/woowacourse/4th_bridgeGame_1_logic.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_2_logic.png b/public/assets/img/woowacourse/4th_bridgeGame_2_logic.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_2_logic.png
rename to public/assets/img/woowacourse/4th_bridgeGame_2_logic.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_3_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_3_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_3_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_3_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_4_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_4_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_4_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_4_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_5_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_5_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_5_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_5_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_6_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_6_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_6_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_6_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_7_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_7_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_7_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_7_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_8_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_8_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_8_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_8_one_function.png
diff --git a/assets/img/woowacourse/4th_bridgeGame_9_one_function.png b/public/assets/img/woowacourse/4th_bridgeGame_9_one_function.png
similarity index 100%
rename from assets/img/woowacourse/4th_bridgeGame_9_one_function.png
rename to public/assets/img/woowacourse/4th_bridgeGame_9_one_function.png
diff --git a/assets/img/woowacourse/woowacourse_cosuta_review.png b/public/assets/img/woowacourse/woowacourse_cosuta_review.png
similarity index 100%
rename from assets/img/woowacourse/woowacourse_cosuta_review.png
rename to public/assets/img/woowacourse/woowacourse_cosuta_review.png
diff --git a/assets/img/woowacourse/woowacourse_name.png b/public/assets/img/woowacourse/woowacourse_name.png
similarity index 100%
rename from assets/img/woowacourse/woowacourse_name.png
rename to public/assets/img/woowacourse/woowacourse_name.png
diff --git a/assets/img/workout/hst_cycle_1.png b/public/assets/img/workout/hst_cycle_1.png
similarity index 100%
rename from assets/img/workout/hst_cycle_1.png
rename to public/assets/img/workout/hst_cycle_1.png
diff --git a/assets/img/workout/hst_cycle_2.png b/public/assets/img/workout/hst_cycle_2.png
similarity index 100%
rename from assets/img/workout/hst_cycle_2.png
rename to public/assets/img/workout/hst_cycle_2.png
diff --git a/assets/img/workout/hst_cycle_3.png b/public/assets/img/workout/hst_cycle_3.png
similarity index 100%
rename from assets/img/workout/hst_cycle_3.png
rename to public/assets/img/workout/hst_cycle_3.png
diff --git a/assets/img/workout/hst_cycle_4.png b/public/assets/img/workout/hst_cycle_4.png
similarity index 100%
rename from assets/img/workout/hst_cycle_4.png
rename to public/assets/img/workout/hst_cycle_4.png
diff --git a/assets/img/workout/hst_exercise_1.png b/public/assets/img/workout/hst_exercise_1.png
similarity index 100%
rename from assets/img/workout/hst_exercise_1.png
rename to public/assets/img/workout/hst_exercise_1.png
diff --git a/assets/img/workout/hst_exercise_2.png b/public/assets/img/workout/hst_exercise_2.png
similarity index 100%
rename from assets/img/workout/hst_exercise_2.png
rename to public/assets/img/workout/hst_exercise_2.png
diff --git a/assets/img/workout/hst_exercise_3.png b/public/assets/img/workout/hst_exercise_3.png
similarity index 100%
rename from assets/img/workout/hst_exercise_3.png
rename to public/assets/img/workout/hst_exercise_3.png
diff --git a/assets/img/workout/hst_exercise_4.png b/public/assets/img/workout/hst_exercise_4.png
similarity index 100%
rename from assets/img/workout/hst_exercise_4.png
rename to public/assets/img/workout/hst_exercise_4.png
diff --git a/assets/img/workout/hst_exercise_5.png b/public/assets/img/workout/hst_exercise_5.png
similarity index 100%
rename from assets/img/workout/hst_exercise_5.png
rename to public/assets/img/workout/hst_exercise_5.png
diff --git a/assets/img/workout/hst_exercise_6.png b/public/assets/img/workout/hst_exercise_6.png
similarity index 100%
rename from assets/img/workout/hst_exercise_6.png
rename to public/assets/img/workout/hst_exercise_6.png
diff --git a/assets/img/workout/hst_introduction.png b/public/assets/img/workout/hst_introduction.png
similarity index 100%
rename from assets/img/workout/hst_introduction.png
rename to public/assets/img/workout/hst_introduction.png
diff --git a/assets/img/workout/hst_introduction_2.png b/public/assets/img/workout/hst_introduction_2.png
similarity index 100%
rename from assets/img/workout/hst_introduction_2.png
rename to public/assets/img/workout/hst_introduction_2.png
diff --git a/assets/img/workout/hst_personal.png b/public/assets/img/workout/hst_personal.png
similarity index 100%
rename from assets/img/workout/hst_personal.png
rename to public/assets/img/workout/hst_personal.png
diff --git a/assets/img/workout/hst_recovery_time.png b/public/assets/img/workout/hst_recovery_time.png
similarity index 100%
rename from assets/img/workout/hst_recovery_time.png
rename to public/assets/img/workout/hst_recovery_time.png
diff --git a/assets/img/workout/hst_week1_1.png b/public/assets/img/workout/hst_week1_1.png
similarity index 100%
rename from assets/img/workout/hst_week1_1.png
rename to public/assets/img/workout/hst_week1_1.png
diff --git a/assets/img/workout/hst_week1_2.png b/public/assets/img/workout/hst_week1_2.png
similarity index 100%
rename from assets/img/workout/hst_week1_2.png
rename to public/assets/img/workout/hst_week1_2.png
diff --git a/assets/img/workout/hst_week2_1.png b/public/assets/img/workout/hst_week2_1.png
similarity index 100%
rename from assets/img/workout/hst_week2_1.png
rename to public/assets/img/workout/hst_week2_1.png
diff --git a/assets/img/workout/hst_week2_2.png b/public/assets/img/workout/hst_week2_2.png
similarity index 100%
rename from assets/img/workout/hst_week2_2.png
rename to public/assets/img/workout/hst_week2_2.png
diff --git a/assets/img/workout/hst_week2_3.png b/public/assets/img/workout/hst_week2_3.png
similarity index 100%
rename from assets/img/workout/hst_week2_3.png
rename to public/assets/img/workout/hst_week2_3.png
diff --git a/assets/img/workout/hst_week2_edited_program.png b/public/assets/img/workout/hst_week2_edited_program.png
similarity index 100%
rename from assets/img/workout/hst_week2_edited_program.png
rename to public/assets/img/workout/hst_week2_edited_program.png
diff --git a/assets/img/workout/hst_week2_exercise_1.png b/public/assets/img/workout/hst_week2_exercise_1.png
similarity index 100%
rename from assets/img/workout/hst_week2_exercise_1.png
rename to public/assets/img/workout/hst_week2_exercise_1.png
diff --git a/assets/img/workout/hst_week2_exercise_2.png b/public/assets/img/workout/hst_week2_exercise_2.png
similarity index 100%
rename from assets/img/workout/hst_week2_exercise_2.png
rename to public/assets/img/workout/hst_week2_exercise_2.png
diff --git a/assets/img/workout/hst_week2_record.png b/public/assets/img/workout/hst_week2_record.png
similarity index 100%
rename from assets/img/workout/hst_week2_record.png
rename to public/assets/img/workout/hst_week2_record.png
diff --git a/assets/img/workout/hst_week3_1.png b/public/assets/img/workout/hst_week3_1.png
similarity index 100%
rename from assets/img/workout/hst_week3_1.png
rename to public/assets/img/workout/hst_week3_1.png
diff --git a/assets/img/workout/hst_week3_2.png b/public/assets/img/workout/hst_week3_2.png
similarity index 100%
rename from assets/img/workout/hst_week3_2.png
rename to public/assets/img/workout/hst_week3_2.png
diff --git a/assets/img/workout/hst_week3_record.png b/public/assets/img/workout/hst_week3_record.png
similarity index 100%
rename from assets/img/workout/hst_week3_record.png
rename to public/assets/img/workout/hst_week3_record.png
diff --git a/assets/img/workout/hst_week4_1.png b/public/assets/img/workout/hst_week4_1.png
similarity index 100%
rename from assets/img/workout/hst_week4_1.png
rename to public/assets/img/workout/hst_week4_1.png
diff --git a/assets/img/workout/hst_week4_2.png b/public/assets/img/workout/hst_week4_2.png
similarity index 100%
rename from assets/img/workout/hst_week4_2.png
rename to public/assets/img/workout/hst_week4_2.png
diff --git a/assets/img/workout/hst_week4_3.png b/public/assets/img/workout/hst_week4_3.png
similarity index 100%
rename from assets/img/workout/hst_week4_3.png
rename to public/assets/img/workout/hst_week4_3.png
diff --git a/assets/img/workout/hst_week4_4.png b/public/assets/img/workout/hst_week4_4.png
similarity index 100%
rename from assets/img/workout/hst_week4_4.png
rename to public/assets/img/workout/hst_week4_4.png
diff --git a/assets/img/workout/hst_week5_1.png b/public/assets/img/workout/hst_week5_1.png
similarity index 100%
rename from assets/img/workout/hst_week5_1.png
rename to public/assets/img/workout/hst_week5_1.png
diff --git a/assets/img/workout/hst_week5_2.png b/public/assets/img/workout/hst_week5_2.png
similarity index 100%
rename from assets/img/workout/hst_week5_2.png
rename to public/assets/img/workout/hst_week5_2.png
diff --git a/assets/img/workout/hst_week5_review.png b/public/assets/img/workout/hst_week5_review.png
similarity index 100%
rename from assets/img/workout/hst_week5_review.png
rename to public/assets/img/workout/hst_week5_review.png
diff --git a/assets/img/workout/hst_week6_1.png b/public/assets/img/workout/hst_week6_1.png
similarity index 100%
rename from assets/img/workout/hst_week6_1.png
rename to public/assets/img/workout/hst_week6_1.png
diff --git a/assets/img/workout/hst_week6_2.png b/public/assets/img/workout/hst_week6_2.png
similarity index 100%
rename from assets/img/workout/hst_week6_2.png
rename to public/assets/img/workout/hst_week6_2.png
diff --git a/assets/img/workout/hst_week6_review.png b/public/assets/img/workout/hst_week6_review.png
similarity index 100%
rename from assets/img/workout/hst_week6_review.png
rename to public/assets/img/workout/hst_week6_review.png
diff --git a/assets/img/workout/hst_week8_1.png b/public/assets/img/workout/hst_week8_1.png
similarity index 100%
rename from assets/img/workout/hst_week8_1.png
rename to public/assets/img/workout/hst_week8_1.png
diff --git a/assets/img/workout/hst_week8_2.png b/public/assets/img/workout/hst_week8_2.png
similarity index 100%
rename from assets/img/workout/hst_week8_2.png
rename to public/assets/img/workout/hst_week8_2.png
diff --git a/assets/img/workout/workout_03.jpg b/public/assets/img/workout/workout_03.jpg
similarity index 100%
rename from assets/img/workout/workout_03.jpg
rename to public/assets/img/workout/workout_03.jpg
diff --git a/assets/img/workout/workout_03_1.jpg b/public/assets/img/workout/workout_03_1.jpg
similarity index 100%
rename from assets/img/workout/workout_03_1.jpg
rename to public/assets/img/workout/workout_03_1.jpg
diff --git a/assets/img/workout/workout_03_2.jpg b/public/assets/img/workout/workout_03_2.jpg
similarity index 100%
rename from assets/img/workout/workout_03_2.jpg
rename to public/assets/img/workout/workout_03_2.jpg
diff --git a/public/favicon-32.png b/public/favicon-32.png
new file mode 100644
index 00000000..7336574c
Binary files /dev/null and b/public/favicon-32.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 00000000..f3e9c77b
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 00000000..2a8638f0
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,8 @@
+
diff --git a/public/fonts/pretendard-var.woff2 b/public/fonts/pretendard-var.woff2
new file mode 100644
index 00000000..8ef83883
Binary files /dev/null and b/public/fonts/pretendard-var.woff2 differ
diff --git a/google703320c58b84fd7a.html b/public/google703320c58b84fd7a.html
similarity index 100%
rename from google703320c58b84fd7a.html
rename to public/google703320c58b84fd7a.html
diff --git a/public/katex/fonts/KaTeX_AMS-Regular.woff2 b/public/katex/fonts/KaTeX_AMS-Regular.woff2
new file mode 100644
index 00000000..0acaaff0
Binary files /dev/null and b/public/katex/fonts/KaTeX_AMS-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2 b/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2
new file mode 100644
index 00000000..f390922e
Binary files /dev/null and b/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2
new file mode 100644
index 00000000..75344a1f
Binary files /dev/null and b/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/public/katex/fonts/KaTeX_Fraktur-Bold.woff2
new file mode 100644
index 00000000..395f28be
Binary files /dev/null and b/public/katex/fonts/KaTeX_Fraktur-Bold.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Fraktur-Regular.woff2 b/public/katex/fonts/KaTeX_Fraktur-Regular.woff2
new file mode 100644
index 00000000..735f6948
Binary files /dev/null and b/public/katex/fonts/KaTeX_Fraktur-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Main-Bold.woff2 b/public/katex/fonts/KaTeX_Main-Bold.woff2
new file mode 100644
index 00000000..ab2ad21d
Binary files /dev/null and b/public/katex/fonts/KaTeX_Main-Bold.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Main-BoldItalic.woff2 b/public/katex/fonts/KaTeX_Main-BoldItalic.woff2
new file mode 100644
index 00000000..5931794d
Binary files /dev/null and b/public/katex/fonts/KaTeX_Main-BoldItalic.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Main-Italic.woff2 b/public/katex/fonts/KaTeX_Main-Italic.woff2
new file mode 100644
index 00000000..b50920e1
Binary files /dev/null and b/public/katex/fonts/KaTeX_Main-Italic.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Main-Regular.woff2 b/public/katex/fonts/KaTeX_Main-Regular.woff2
new file mode 100644
index 00000000..eb24a7ba
Binary files /dev/null and b/public/katex/fonts/KaTeX_Main-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/public/katex/fonts/KaTeX_Math-BoldItalic.woff2
new file mode 100644
index 00000000..29657023
Binary files /dev/null and b/public/katex/fonts/KaTeX_Math-BoldItalic.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Math-Italic.woff2 b/public/katex/fonts/KaTeX_Math-Italic.woff2
new file mode 100644
index 00000000..215c143f
Binary files /dev/null and b/public/katex/fonts/KaTeX_Math-Italic.woff2 differ
diff --git a/public/katex/fonts/KaTeX_SansSerif-Bold.woff2 b/public/katex/fonts/KaTeX_SansSerif-Bold.woff2
new file mode 100644
index 00000000..cfaa3bda
Binary files /dev/null and b/public/katex/fonts/KaTeX_SansSerif-Bold.woff2 differ
diff --git a/public/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/public/katex/fonts/KaTeX_SansSerif-Italic.woff2
new file mode 100644
index 00000000..349c06dc
Binary files /dev/null and b/public/katex/fonts/KaTeX_SansSerif-Italic.woff2 differ
diff --git a/public/katex/fonts/KaTeX_SansSerif-Regular.woff2 b/public/katex/fonts/KaTeX_SansSerif-Regular.woff2
new file mode 100644
index 00000000..a90eea85
Binary files /dev/null and b/public/katex/fonts/KaTeX_SansSerif-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Script-Regular.woff2 b/public/katex/fonts/KaTeX_Script-Regular.woff2
new file mode 100644
index 00000000..b3048fc1
Binary files /dev/null and b/public/katex/fonts/KaTeX_Script-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Size1-Regular.woff2 b/public/katex/fonts/KaTeX_Size1-Regular.woff2
new file mode 100644
index 00000000..c5a8462f
Binary files /dev/null and b/public/katex/fonts/KaTeX_Size1-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Size2-Regular.woff2 b/public/katex/fonts/KaTeX_Size2-Regular.woff2
new file mode 100644
index 00000000..e1bccfe2
Binary files /dev/null and b/public/katex/fonts/KaTeX_Size2-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Size3-Regular.woff2 b/public/katex/fonts/KaTeX_Size3-Regular.woff2
new file mode 100644
index 00000000..249a2866
Binary files /dev/null and b/public/katex/fonts/KaTeX_Size3-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Size4-Regular.woff2 b/public/katex/fonts/KaTeX_Size4-Regular.woff2
new file mode 100644
index 00000000..680c1308
Binary files /dev/null and b/public/katex/fonts/KaTeX_Size4-Regular.woff2 differ
diff --git a/public/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/public/katex/fonts/KaTeX_Typewriter-Regular.woff2
new file mode 100644
index 00000000..771f1af7
Binary files /dev/null and b/public/katex/fonts/KaTeX_Typewriter-Regular.woff2 differ
diff --git a/public/katex/katex.min.css b/public/katex/katex.min.css
new file mode 100644
index 00000000..ae328b5d
--- /dev/null
+++ b/public/katex/katex.min.css
@@ -0,0 +1 @@
+@font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.18.7"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.katex-newline{display:block}.katex .katex-base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .katex-base,.katex .katex-strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .katex-vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .katex-thinbox{display:inline-flex;flex-direction:row;max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline,.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-rule,.katex .katex-underline .underline-line,.katex .mfrac .frac-line{min-height:1px}.katex .mspace{display:inline-block}.katex .katex-smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.katex-inner,.katex .llap>.katex-inner,.katex .rlap>.katex-inner{position:absolute}.katex .clap>.katex-fix,.katex .llap>.katex-fix,.katex .rlap>.katex-fix{display:inline-block}.katex .llap>.katex-inner{right:0}.katex .clap>.katex-inner,.katex .rlap>.katex-inner{left:0}.katex .clap>.katex-inner>span{margin-left:-50%;margin-right:50%}.katex .katex-rule{border:0 solid;display:inline-block;position:relative}.katex .katex-hline,.katex .katex-overline .overline-line,.katex .katex-underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .katex-hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.katex-root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .katex-sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .katex-sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .katex-sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .katex-sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .katex-sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .katex-sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .katex-sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .katex-sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .katex-sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .katex-sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .katex-sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .katex-sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .katex-sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .katex-sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .katex-sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .katex-sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .katex-sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .katex-sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .katex-sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .katex-sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .katex-sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .katex-sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .katex-sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .katex-sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .katex-sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .katex-sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .katex-sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .katex-sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .katex-sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .katex-sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .katex-sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .katex-sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .katex-sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .katex-sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .katex-sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .katex-sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .katex-sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .katex-sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .katex-sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .katex-sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .katex-sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .katex-sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .katex-sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .katex-sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .katex-sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .katex-sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .katex-sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .katex-sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .katex-sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .katex-sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .katex-sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .katex-sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .katex-sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .katex-sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .katex-sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .katex-sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .katex-sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .katex-sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .katex-sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .katex-sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .katex-sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .katex-sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .katex-sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .katex-sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .katex-sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .katex-sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .katex-sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .katex-sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .katex-sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .katex-sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .katex-sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .katex-sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .katex-sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .katex-sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .katex-sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .katex-sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .katex-sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .katex-sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .katex-sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .katex-sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .katex-sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .katex-sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .katex-sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .katex-sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .katex-sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .katex-sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .katex-sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .katex-sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .katex-sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .katex-sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .katex-sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .katex-sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .katex-sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .katex-sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .katex-sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .katex-sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .katex-sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .katex-sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .katex-sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .katex-sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .katex-sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .katex-sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .katex-sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .katex-sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .katex-sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .katex-sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .katex-sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .katex-sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .katex-sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .katex-sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .katex-sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .katex-sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .katex-sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .katex-sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .katex-sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .katex-sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .katex-sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .katex-sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .katex-sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .katex-sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .katex-sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .katex-accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .katex-accent .accent-body{position:relative}.katex .katex-accent .accent-body:not(.accent-full){width:0}.katex .katex-overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .katex-stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .katex-stretchy:after,.katex .katex-stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .katex-sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .reflectbox{display:inline-block;transform:scaleX(-1)}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.katex-tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.katex-tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}
diff --git a/naverf9fb97d5b309cc42812c1dcaa8884a48.html b/public/naverf9fb97d5b309cc42812c1dcaa8884a48.html
similarity index 100%
rename from naverf9fb97d5b309cc42812c1dcaa8884a48.html
rename to public/naverf9fb97d5b309cc42812c1dcaa8884a48.html
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 00000000..a8b3d775
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://devfancy.github.io/sitemap-index.xml
diff --git a/scripts/convert-posts.mjs b/scripts/convert-posts.mjs
new file mode 100644
index 00000000..c93c22aa
--- /dev/null
+++ b/scripts/convert-posts.mjs
@@ -0,0 +1,394 @@
+/* NOTE Jekyll _posts 319편을 Astro content collection 으로 옮긴다 (MIGRATION.md 8-3-1)
+ * - 수작업 금지. 규칙이 바뀌면 이 파일을 고치고 다시 돌린다
+ * - 기본은 dry-run 이다. 실제로 쓰려면 --write 를 준다
+ *
+ * 한 번 쓰고 버리는 도구다. 아래 규칙표는 옛 Jekyll 분류를 새 분류로 옮기기 위한 것이고,
+ * 이관이 끝나면 src/content/posts 가 유일한 원본이 된다.
+ * 마이그레이션 PR 이 main 에 병합되면 이 파일과 _posts/ 를 같이 지운다.
+ * 그 뒤로 새 글은 프론트매터에 카테고리와 태그를 직접 적는다.
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+
+const SRC = '_posts';
+const OUT = 'src/content/posts';
+const WRITE = process.argv.includes('--write');
+
+/* NOTE 기존 카테고리 34종을 9개로 묶고, 원래 이름은 태그로 내린다 [카테고리 재편]
+ * - 고유명사·제품명은 영문, 일반 개념은 한글
+ */
+const CATEGORY = {
+ SpringBoot: '서버', Spring: '서버', JPA: '서버', Java: '서버', Kafka: '서버',
+ GoodCode: '서버', AssertJ: '서버', Technology: '서버', Flyway: '서버', Linux: '서버',
+ Algorithm: '알고리즘', AlgorithmSkill: '알고리즘', LeetCode: '알고리즘',
+ OS: 'CS', Network: 'CS', HTTP: 'CS', DataStructure: 'CS',
+ Database: 'CS', SQL: 'CS', MySQL: 'CS',
+ 'Business-Statistics': '대학교', 'Probability-Statistics': '대학교',
+ 'Electronic-Finance': '대학교',
+ Side_Project: '프로젝트', Woowacourse: '프로젝트',
+ 'E.T.C': '기타', Workout: '기타', Competition: '기타',
+ Git: '도구', IntelliJ: '도구',
+ Retrospective: '회고', DevHistory: '회고',
+ Essay: '에세이', Book: '에세이',
+};
+
+const TAG = {
+ SpringBoot: 'Spring Boot', Spring: 'Spring', JPA: 'JPA', Java: 'Java', Kafka: 'Kafka',
+ GoodCode: '클린코드', AssertJ: 'AssertJ', Technology: '기술', Flyway: 'Flyway', Linux: '리눅스',
+ Algorithm: '알고리즘', AlgorithmSkill: '문제해결', LeetCode: 'LeetCode',
+ OS: '운영체제', Network: '네트워크', HTTP: 'HTTP', DataStructure: '자료구조',
+ Database: '데이터베이스', SQL: 'SQL', MySQL: 'MySQL',
+ 'Business-Statistics': '경영통계', 'Probability-Statistics': '확률통계',
+ 'Electronic-Finance': '전자금융',
+ Side_Project: '사이드프로젝트', Woowacourse: '우아한테크코스',
+ 'E.T.C': '기타', Workout: '운동', Competition: '커리어',
+ Git: 'Git', IntelliJ: 'IntelliJ',
+ Retrospective: '회고', DevHistory: '개발기록',
+ Essay: '에세이', Book: '책',
+};
+
+/* NOTE Technology 와 E.T.C 는 주제가 섞인 보관함이라 태그 하나로 줄일 수 없다
+ * - 슬러그와 제목에서 주제를 읽는다. 위에서부터 처음 맞는 규칙을 쓴다
+ */
+const TAG_RULES = [
+ { tag: '블로그', test: /jekyll|utterances|readme|search console|파비콘|북마크|블로그/i },
+ { tag: '글또', test: /geultto|글또/i },
+ { tag: 'Git', test: /branch|protection/i },
+ { tag: '성능테스트', test: /성능|부하 ?테스트|k6/i },
+ { tag: 'Spring Boot', test: /spring.?boot/i },
+ { tag: '네트워크', test: /rest|https|쿠키|nginx|dns|프락시/i },
+ { tag: '사이드프로젝트', test: /sipe|사이프톤|슬랙 ?봇/i },
+ // 공모전·수료증·직업 선택은 각각 1편뿐이라 커리어 하나로 묶는다
+ { tag: '커리어', test: /coursera|수료증|공모전|개발자를 선택/i },
+ { tag: '후기', test: /후기|리뷰|review|돌아보며|밋업|meet ?up|tech ?talk|테크토크|slash|세레나데|컨퍼런스/i },
+];
+
+/* NOTE 카테고리·그룹과 이름이 같은 태그는 칩에 정보가 없다. 구체 태그로 내린다
+ * - Technology -> "기술" 은 그룹명, E.T.C -> "기타" 와 Retrospective/Essay 는 카테고리명이었다
+ * - 어느 규칙에도 안 걸리면 원래 태그를 그대로 두고 경고를 남긴다
+ */
+const VAGUE = new Set(['기술', '기타']);
+
+function refineTag(tag, slug, title) {
+ const text = `${slug} ${title}`;
+ if (tag === '알고리즘') {
+ const source = sourceOf(slug);
+ if (!source) warnings.push(`${slug}: 출처를 못 읽어 태그 "알고리즘" 을 유지한다`);
+ return [source ?? tag];
+ }
+ if (tag === 'SQL') return /\[Programmers\]/i.test(title) ? [tag, '프로그래머스'] : [tag];
+ // 카테고리 "회고" 만으로 충분하다. 주기까지 태그로 나누면 태그가 한 편씩 붙는 꼴이 된다
+ if (tag === '회고') return [];
+ if (tag === '에세이') return [/생각 ?정리/.test(text) ? '생각정리' : tag];
+ if (!VAGUE.has(tag)) return [tag];
+
+ const hit = TAG_RULES.find((r) => r.test.test(text));
+ if (!hit) { warnings.push(`${slug}: 규칙에 안 걸려 태그 "${tag}" 를 유지한다`); return [tag]; }
+ return [hit.tag];
+}
+
+/** 문제풀이 글의 출처를 슬러그에서 읽는다 */
+function sourceOf(slug) {
+ if (/programmers/i.test(slug)) return '프로그래머스';
+ if (/ba[ec]kjoon/i.test(slug)) return '백준';
+ return null;
+}
+
+/* NOTE "프로젝트" 는 주제가 아니라 맥락이다. 주제 카테고리와 같이 붙으면 주제를 쓴다
+ * - Jekyll 의 "Side_Project SpringBoot" 8편이 프로젝트와 서버 양쪽에 걸려 있었다
+ * - 그 탓에 /category/ 에서 프로젝트를 고르면 Spring Boot 태그가 딸려 나왔다
+ * - 프로젝트라는 맥락은 "사이드프로젝트" 태그로 남으니 정보가 사라지지 않는다
+ */
+const CONTEXT_CATEGORY = new Set(['프로젝트']);
+
+/* NOTE 태그는 카테고리 한 곳에만 산다. 두 곳에 걸리면 같은 칩이 두 번 보인다
+ * - 태그가 주제를 더 정확히 말해주면 글을 그 태그의 집으로 보낸다
+ */
+const TAG_HOME = {
+ 네트워크: 'CS',
+ Git: '도구',
+ 글또: '회고',
+ // BE 미션 회고라 프로젝트가 아니라 서버다
+ 우아한테크코스: '서버',
+};
+
+/* NOTE 보관함 카테고리에 있지만 주제가 드러난 글은 제자리로 보낸다
+ * - Technology 는 서버로 가지만 그 안의 블로그 운영 글은 기타다
+ * - E.T.C 의 기수 회고는 회고다
+ */
+function refineCategory(cat, tags, slug) {
+ // SQL 문제풀이도 문제풀이다. 출처 태그가 붙었으면 알고리즘으로 보낸다
+ if (cat === 'CS' && tags.includes('프로그래머스')) return '알고리즘';
+ if (cat === '서버' && tags.includes('블로그')) return '기타';
+ for (const t of tags) if (TAG_HOME[t]) return TAG_HOME[t];
+ // 사이드프로젝트만 걸린 글은 프로젝트다 (SIPE 슬랙봇)
+ if (cat === '기타' && tags.includes('사이드프로젝트')) return '프로젝트';
+ return cat;
+}
+
+/* NOTE Jekyll 본문의 이미지 경로 오타를 바로잡는다
+ * - tech_insight 폴더는 존재한 적이 없다. 같은 글의 다른 이미지는 전부 woowabros 에 있다
+ * - 원본 블로그에서도 깨져 있던 이미지다
+ */
+const IMAGE_PATH_FIX = [
+ ['/assets/img/tech_insight/', '/assets/img/technology/woowabros/'],
+ /* macOS 는 대소문자를 구분하지 않아 로컬에서는 멀쩡하지만
+ * GitHub Pages(리눅스)는 구분한다. 실제 파일은 .JPG 다 */
+ ['/assets/img/db/DB-Normalization-4.jpg', '/assets/img/db/DB-Normalization-4.JPG'],
+];
+
+/* NOTE 본문에 남은 Jekyll 개발 서버 주소를 실제 경로로 바꾼다
+ * - 127.0.0.1:4000 은 글쓴이 컴퓨터에서만 열린다. 배포본에서 깨져 있었다
+ * - #Side_Project 는 4-2-1 재편으로 "사이드프로젝트" 태그가 됐다
+ */
+const LINK_FIX = [
+ ['http://127.0.0.1:4000/category/#Side_Project', '/category/#사이드프로젝트'],
+ ['http://127.0.0.1:4000/', '/'],
+];
+
+/* NOTE 약어 폴더는 무엇인지 알아볼 수 없어 이름을 편다 (이미지 이관 B안)
+ * - 나머지 34개 폴더는 그대로 둔다. 전면 재편은 이관이 끝난 뒤 따로 한다
+ */
+/* NOTE 옛 글에 굳어진 오탈자를 고친다 [맞춤법]
+ * - 문맥을 타지 않는 것만 넣는다. 되/돼, 로서/로써처럼 판단이 필요한 것은 두고 본다
+ * - 코드 블록 안과 수식이 있는 줄은 건드리지 않는다
+ */
+const TYPO_WORD = [
+ [/갯수/g, '개수'],
+ [/왠만/g, '웬만'],
+ [/됬/g, '됐'],
+ [/Youtubr/g, 'YouTube'],
+ [/완료되서/g, '완료돼서'],
+ [/수있/g, '수 있'],
+ [/하는것/g, '하는 것'],
+ [/어플리케이션/g, '애플리케이션'],
+ [/Spring boot/g, 'Spring Boot'],
+ [/\(하한, ,상한\)/g, '(하한, 상한)'],
+ [/Paste,,,/g, 'Paste 등'],
+ [/생성했는데,,/g, '생성했는데,'],
+ [/변경 ,삭제/g, '변경, 삭제'],
+];
+
+// 쉼표 앞 공백. 한글·닫는 괄호·강조·인라인 코드 뒤일 때만 지운다. 수식 기호와 겹치지 않는다
+const TYPO_COMMA = /([가-힣)*`\]]) +,/g;
+
+/* NOTE kramdown 인라인 속성(IAL). remark 가 몰라서 본문에 글자로 찍힌다 [Kramdown 잔재]
+ * - Jekyll 은
으로 렌더했다. 같은 결과가 되도록
로 바꾼다
+ * - width="50%" 는 HTML 속성으로 무효라 Jekyll 에서도 안 먹었다. style 로 살린다
+ */
+const IAL_WIDTH = /!\[\]\(([^()\s]+)\)[ \t]*\{:\s*width="([^"]+)"\s*\}/g;
+
+const IMAGE_DIR_RENAME = [
+ ['/assets/img/bs/', '/assets/img/business-statistics/'],
+ ['/assets/img/ef/', '/assets/img/electronic-finance/'],
+ ['/assets/img/ps/', '/assets/img/probability-statistics/'],
+ ['/assets/img/goodcode/', '/assets/img/clean-code/'],
+ ['/assets/img/record/', '/assets/img/dev-history/'],
+];
+
+/* NOTE use_math 가 빠졌지만 진짜 수식이 있는 글. 전역 적용이 기존 버그를 고쳐준다 [수식 전역 적용] */
+const ADD_USE_MATH = new Set([
+ '2022-06-01-EF-07-Cryptography.md',
+ '2023-02-05-OS-19-TLB.md',
+]);
+
+const warnings = [];
+const stats = {
+ total: 0, cats: new Map(), useMath: 0, escaped: 0, escapedFiles: 0,
+ siteUrl: 0, imgFix: 0, raw: 0, toc: 0, ial: 0, typo: 0, rawHtml: 0, spaces: 0, tags: new Map(), unmapped: new Set(),
+};
+
+/** 코드 펜스와 인라인 코드를 분리한다. 짝수 인덱스만 본문이다. */
+function splitCode(body) {
+ return body.split(/(```[\s\S]*?```|`[^`\n]*`)/);
+}
+
+/** 표기 4종을 배열로 정규화한다 [프론트매터 정규화] */
+function normalizeCategories(raw) {
+ const v = (raw ?? '').trim();
+ if (!v) return [];
+ if (v.startsWith('[')) {
+ return v.slice(1, -1).split(',').map((x) => x.trim()).filter(Boolean);
+ }
+ return v.split(/\s+/).filter(Boolean); // bare + 공백 구분 다중값
+}
+
+function parseFrontmatter(raw) {
+ const m = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
+ if (!m) return null;
+ const data = {};
+ for (const line of m[1].split(/\r?\n/)) {
+ const i = line.indexOf(':');
+ if (i < 0) continue;
+ data[line.slice(0, i).trim()] = line.slice(i + 1).trim();
+ }
+ return { data, body: m[2] };
+}
+
+function convert(file) {
+ const raw = fs.readFileSync(path.join(SRC, file), 'utf8');
+ const parsed = parseFrontmatter(raw);
+ if (!parsed) { warnings.push(`${file}: 프론트매터를 읽지 못했다`); return null; }
+ let { data, body } = parsed;
+
+ const date = file.slice(0, 10);
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) { warnings.push(`${file}: 파일명에서 날짜를 못 얻었다`); return null; }
+
+ // NOTE: 슬러그는 대소문자를 보존하고 공백만 없앤다 (2-2, 8-3-1)
+ const stem = file.slice(11).replace(/\.md$/, '');
+ const slug = stem.replace(/\s+/g, '');
+ if (stem !== slug) { stats.spaces++; warnings.push(`${file}: 파일명 공백 제거 -> ${slug}`); }
+
+ const title = (data.title ?? '').trim().replace(/^["']|["']$/g, '').trim();
+ if (!title) warnings.push(`${file}: title 이 비었다`);
+
+ const legacy = normalizeCategories(data.categories);
+ if (legacy.length === 0) warnings.push(`${file}: categories 가 비었다`);
+
+ const tags = [];
+ const mapped = [];
+ for (const c of legacy) {
+ if (!CATEGORY[c]) { stats.unmapped.add(c); warnings.push(`${file}: 매핑 없는 카테고리 "${c}"`); }
+ if (!mapped.includes(CATEGORY[c] ?? '기타')) mapped.push(CATEGORY[c] ?? '기타');
+ for (const tag of refineTag(TAG[c] ?? c, slug, title)) {
+ if (!tags.includes(tag)) tags.push(tag);
+ stats.tags.set(tag, (stats.tags.get(tag) ?? 0) + 1);
+ }
+ }
+ // 주제 카테고리가 있으면 맥락 카테고리는 떨어뜨린다. 글마다 카테고리는 하나다
+ const topic = mapped.filter((c) => !CONTEXT_CATEGORY.has(c));
+ const categories = [...new Set((topic.length ? topic : mapped).map((c) => refineCategory(c, tags, slug)))];
+
+ /* NOTE "사이드프로젝트" 는 프로젝트 카테고리에서만 뜻이 있다
+ * - 기술 글로 분류된 Goodfriends·Hibit 8편에서 빼야 태그가 한 카테고리에만 남는다
+ * - 그 8편은 Spring Boot·성능테스트 같은 기술 태그로 이미 찾을 수 있다
+ */
+ if (!categories.includes('프로젝트')) {
+ const i = tags.indexOf('사이드프로젝트');
+ if (i >= 0) tags.splice(i, 1);
+ }
+ for (const c of categories) stats.cats.set(c, (stats.cats.get(c) ?? 0) + 1);
+
+ const useMath = data.use_math?.toLowerCase() === 'true' || ADD_USE_MATH.has(file);
+ if (useMath) stats.useMath++;
+
+ // {{site.url}} 제거. site.url 이 빈 값이라 지우면 그대로 동작한다 [Liquid 제거]
+ let n = (body.match(/\{\{\s*site\.url\s*\}\}/g) ?? []).length;
+ if (n) { body = body.replace(/\{\{\s*site\.url\s*\}\}/g, ''); stats.siteUrl += n; }
+
+ // 이미지 경로 오타, 약어 폴더명, 개발 서버 주소를 바로잡는다
+ for (const [from, to] of [...IMAGE_PATH_FIX, ...IMAGE_DIR_RENAME, ...LINK_FIX]) {
+ if (body.includes(from)) { body = body.split(from).join(to); stats.imgFix++; }
+ }
+
+ // kramdown IAL 을 img 태그로 바꾼다. 경로 보정이 끝난 뒤여야 한다
+ n = (body.match(IAL_WIDTH) ?? []).length;
+ if (n) {
+ body = body.replace(IAL_WIDTH, (_, src, w) =>
+ `
`);
+ stats.ial += n;
+ }
+
+ /* 오탈자 교정. 코드 펜스 안은 그대로 둔다 */
+ {
+ let fence = false;
+ const fixed = body.split('\n').map((line) => {
+ if (line.trimStart().startsWith('```')) { fence = !fence; return line; }
+ if (fence) return line;
+ let out = line;
+ for (const [re, to] of TYPO_WORD) out = out.replace(re, to);
+ if (!out.includes('$')) out = out.replace(TYPO_COMMA, '$1,');
+ if (out !== line) stats.typo++;
+ return out;
+ });
+ body = fixed.join('\n');
+ }
+
+ // {% raw %} / {% endraw %} 제거. 본문이 Liquid 를 설명하는 글이라 결과 확인이 필요하다
+ n = (body.match(/\{%\s*(?:end)?raw\s*%\}/g) ?? []).length;
+ if (n) {
+ body = body.replace(/^[ \t]*\{%\s*(?:end)?raw\s*%\}[ \t]*\r?\n?/gm, '').replace(/\{%\s*(?:end)?raw\s*%\}/g, '');
+ stats.raw += n;
+ warnings.push(`${file}: {% raw %} ${n}건 제거. 렌더 결과 확인 필요`);
+ }
+
+ // kramdown 목차. 기능은 Toc 컴포넌트가 대체한다 [Kramdown 잔재]
+ n = (body.match(/^\* content\r?\n\{:toc\}\r?\n?/gm) ?? []).length;
+ if (n) { body = body.replace(/^\* content\r?\n\{:toc\}\r?\n?/gm, ''); stats.toc += n; }
+
+ /* NOTE 수식이 전역 적용되므로 비수식 글의 $ 를 이스케이프한다 [수식 전역 적용]
+ * - 코드 블록 밖에서만 바꾼다. 코드 안 {{traceId}} 같은 것은 건드리지 않는다
+ */
+ if (!useMath) {
+ const parts = splitCode(body);
+ // $ 가 하나뿐이면 쌍이 안 되므로 수식으로 해석되지 않는다. 건드리지 않는다
+ let total = 0;
+ for (let i = 0; i < parts.length; i += 2) total += (parts[i].match(/\$/g) ?? []).length;
+ if (total >= 2) {
+ for (let i = 0; i < parts.length; i += 2) parts[i] = parts[i].replace(/\$/g, '\\$');
+ body = parts.join('');
+ stats.escaped += total;
+ stats.escapedFiles++;
+ }
+ }
+
+ if (/<(br|img|div|span|a|table)\b/i.test(body)) stats.rawHtml++;
+
+ const fm = ['---', `title: ${JSON.stringify(title)}`, `date: ${date}`,
+ `categories: [${categories.map((c) => JSON.stringify(c)).join(', ')}]`,
+ `tags: [${tags.map((t) => JSON.stringify(t)).join(', ')}]`];
+ if (useMath) fm.push('use_math: true');
+ fm.push('---');
+
+ stats.total++;
+ return { slug, content: `${fm.join('\n')}\n\n${body.replace(/^\n+/, '')}` };
+}
+
+const files = fs.readdirSync(SRC).filter((f) => f.endsWith('.md')).sort();
+/* NOTE 출력 폴더를 통째로 지우지 않는다
+ * - 이 저장소는 iCloud 동기화 폴더 안에 있다. 대량 삭제 후 즉시 재생성하면
+ * iCloud 가 충돌로 보고 "파일 2.md" 같은 사본을 만든다
+ * - 덮어쓰고, 더 이상 생성되지 않는 파일만 골라서 지운다
+ */
+if (WRITE) fs.mkdirSync(OUT, { recursive: true });
+const produced = new Set();
+
+const seen = new Map();
+for (const f of files) {
+ const r = convert(f);
+ if (!r) continue;
+ if (seen.has(r.slug)) warnings.push(`슬러그 충돌: ${r.slug} (${seen.get(r.slug)} vs ${f})`);
+ seen.set(r.slug, f);
+ if (WRITE) {
+ produced.add(`${r.slug}.md`);
+ const dest = path.join(OUT, `${r.slug}.md`);
+ const prev = fs.existsSync(dest) ? fs.readFileSync(dest, 'utf8') : null;
+ if (prev !== r.content) fs.writeFileSync(dest, r.content);
+ }
+}
+
+if (WRITE) {
+ for (const f of fs.readdirSync(OUT)) {
+ if (f.endsWith('.md') && !produced.has(f)) {
+ fs.rmSync(path.join(OUT, f));
+ warnings.push(`더 이상 생성되지 않아 삭제: ${f}`);
+ }
+ }
+}
+
+console.log(`${WRITE ? '변환' : 'DRY-RUN'} 입력 ${files.length}편 → 출력 ${stats.total}편`);
+console.log(` 카테고리 ${stats.cats.size}종 ${[...stats.cats.entries()].sort((a, b) => b[1] - a[1]).map(([c, n]) => `${c} ${n}`).join(' · ')}`);
+console.log(` 태그 ${stats.tags.size}종`);
+if (stats.unmapped.size) console.log(` ** 매핑 없음 ${[...stats.unmapped].join(', ')} **`);
+console.log(` use_math ${stats.useMath}편`);
+console.log(` $ 이스케이프 ${stats.escaped}건 / ${stats.escapedFiles}개 파일`);
+console.log(` {{site.url}} ${stats.siteUrl}건`);
+console.log(` 이미지 경로 교정 ${stats.imgFix}건`);
+console.log(` {% raw %} ${stats.raw}건`);
+console.log(` {:toc} 제거 ${stats.toc}건`);
+console.log(` {: width } 변환 ${stats.ial}건`);
+console.log(` 오탈자 교정 ${stats.typo}줄`);
+console.log(` 날 HTML 포함 ${stats.rawHtml}편`);
+console.log(` 파일명 공백 ${stats.spaces}건`);
+console.log(`\n경고 ${warnings.length}건`);
+for (const w of warnings) console.log(` - ${w}`);
diff --git a/src/assets/hero-about.jpg b/src/assets/hero-about.jpg
new file mode 100644
index 00000000..a9b767cb
Binary files /dev/null and b/src/assets/hero-about.jpg differ
diff --git a/src/assets/hero-archive.jpg b/src/assets/hero-archive.jpg
new file mode 100644
index 00000000..faedcde8
Binary files /dev/null and b/src/assets/hero-archive.jpg differ
diff --git a/src/assets/hero-category.jpg b/src/assets/hero-category.jpg
new file mode 100644
index 00000000..daf08db7
Binary files /dev/null and b/src/assets/hero-category.jpg differ
diff --git a/src/assets/hero-main.jpg b/src/assets/hero-main.jpg
new file mode 100644
index 00000000..2fa7c63e
Binary files /dev/null and b/src/assets/hero-main.jpg differ
diff --git a/src/assets/profile.jpg b/src/assets/profile.jpg
new file mode 100644
index 00000000..d312fef2
Binary files /dev/null and b/src/assets/profile.jpg differ
diff --git a/src/components/Chip.astro b/src/components/Chip.astro
new file mode 100644
index 00000000..0900591c
--- /dev/null
+++ b/src/components/Chip.astro
@@ -0,0 +1,20 @@
+---
+/* NOTE 칩을 누르면 /category/ 가 그 값으로 걸러진 채 열린다
+ * - 카테고리는 테두리만, 태그는 회색 면으로 채워 한눈에 갈린다
+ */
+interface Props {
+ value: string;
+ kind?: 'category' | 'tag';
+}
+const { value, kind = 'category' } = Astro.props;
+---
+{kind === 'tag' ? `#${value}` : value}
diff --git a/src/components/Footer.astro b/src/components/Footer.astro
new file mode 100644
index 00000000..5157f1c9
--- /dev/null
+++ b/src/components/Footer.astro
@@ -0,0 +1,10 @@
+---
+import { SITE } from '../config';
+import SocialLinks from './SocialLinks.astro';
+---
+
diff --git a/src/components/Header.astro b/src/components/Header.astro
new file mode 100644
index 00000000..2c495316
--- /dev/null
+++ b/src/components/Header.astro
@@ -0,0 +1,198 @@
+---
+/* NOTE 헤더는 항상 고정이다. Hero 위에서는 투명했다가 스크롤하면 배경이 떠오른다
+ * - 색은 header 의 color 를 자식이 물려받게 해 전환 한 번으로 전부 따라오게 한다
+ * - 모바일은 이름과 테마 버튼만 남기고 메뉴는 햄버거로 접는다 [모바일 네비게이션]
+ */
+import { NAV, SITE } from '../config';
+
+interface Props {
+ overlay?: boolean;
+}
+const { overlay = false } = Astro.props;
+---
+
{title}
+ )}
+ {subtitle &&
+
+2월부터는 TIL 인증 뿐만 아니라, 매주 금요일 혹은 일요일 저녁에 30분 정도 '주간 회고'를 진행하면서 KPT 회고를 작성하고, 서로 얘기하는 시간을 가졌습니다.
+
+확실히 이런 TIL 모임을 하니까, 다른 구성원분들로부터 자극을 받고, 스스로 동기부여를 하면서 매일 공부하는 습관을 유지할 수 있었던 점이 좋았습니다.
+
+
+
+1월부터 3월까지 3개월 동안 한 결과, 총 60번의 제출 중 41번을 제출하였습니다. 제출하지 못한 날이 꽤 있어서 아쉽긴 하지만, 그래도 제출한 내용 만큼은 현재뿐 아니라 앞으로도 도움이 되는 기술적 지식 또는 경험 위주로 정리하려고 노력했습니다.
+
+
+
+이전까지는 1달 단위로 TIL 모임을 운영해왔지만, 앞으로는 분기별로 진행하면서 꾸준히 공부하면서 성장해가는 개발자가 되도록 노력할 예정입니다 😌.
+
+## 이력또 스터디
+
+> 스터디 진행기간: 2024.01 ~ 2024.02
+
+
+
+글또에서 활동하고 계신 YH님께서 “이력서, 포트폴리오 개선 스터디원”을 구하신다는 모집글을 보고, 바로 참여하게 되었습니다.
+
+평소에 이력서에 대한 피드백을 동료분들 혹은 저보다 연차가 많은 개발자분들로부터 받아왔지만, 아직도 부족하다고 느끼고 있었습니다.
+또한 제가 조금이라도 도움이 드릴 수 있는 부분이 있다면 적극적으로 도와드리고 싶었습니다.
+해당 스터디를 통해 더 나은 이력서를 만들고자 참여를 하게 되었습니다.
+
+
+
+YH님이 주도적으로 스터디를 이끌어주시면서 어떻게 진행할지 알려주셨고, 더 나은 방법이 있다면 스터디에 참여하는 구성원분들이 의견을 제시해서 조금씩 개선하는 방향으로 나아갔습니다.
+
+피그마를 이용하여 2주마다 총 3개의 버전을 만들면서 이전 대비 더 나아지는 이력서를 만드는 것이 목표였습니다.
+
+
+
+2주 간격으로 온라인 회의(Google Meet)를 진행하면서, YH님이 그때마다 필요한 내용들을 Notion에 정리해주셔서 구성원 모두에게 공유하고 얘기하는 시간을 가졌습니다.
+해당 스터디 이후에 서류에 합격하는 사람이 있으면, 위와 같이 스터디원 분들이 모두 축하해줬습니다.
+
+
+
+스터디 마지막 날에는 이번 모임의 목적을 다시 생각하면서, 부족했던 부분, 좋았던 부분, 개선할 부분들을 정리하는 시간을 가졌습니다.
+다음에 또 이력서 스터디를 모집한다면, 지금보다 더 효과를 누릴 수 있지 않을까 생각합니다.
+
+### 최종 이력서
+
+
+
+피그마에서 각 직군별로 분류하였고, 본인의 직무에 있는 곳에 이력서를 올리는 식으로 진행했습니다. 그리고 2주 동안 본인의 이력서를 다른 버전으로 업데이트 하는 동시에, 다른 사람의 이력서를 보고 피드백하는 식으로 했습니다.
+
+
+
+저는 해당 스터디를 시작하기 전부터 기존의 이력서가 있었고, 스터디를 진행하면서 서류합격 받은 회사들로부터 면접을 진행하고 있었습니다. (이때가 정말 바빴고, 정신없이 시간을 보냈던 것 같습니다 😂)
+
+
+
+그렇게 열심히 노력한 결과, 운이 좋게도 한 회사에 최종합격을 받게 되었습니다. 일부 기술 면접 질문에 대해 제대로 답변을 못한 경우도 있었는데, 그러한 부분을 관대하게 넘어가주셨고, 인성 부분에서 좋게 봐주셔서 ‘합격’해주셨다고 생각합니다.
+앞으로 새로운 회사에 다니면서 꾸준히 성장해서 더 나은 개발자가 되도록 노력하겠습니다.
+
+## 글또 백엔드/인프라 반상회
+
+글또에 참여하면서, 글을 제출하는 것 외에 글또에 도움이 되는 활동에 참여하고 싶다는 생각이 들었습니다.
+
+
+
+그렇게 생각만 하다가 어느 날, 백엔드/인프라 반상회를 위한 준비 위원회 모집 참여글을 확인하게 되었고, 참여 의사를 전달하면서 준비위원회에 합류하게 되었습니다.
+
+첫 미팅은 온라인으로 진행 했고, 두 번째 미팅은 오프라인(우아한형제들, 선릉역 부근)에서 진행되었습니다. 성윤님이 PO 역할로 큰 부분을 잡아주셨고, 세부적인 부분들은 팀을 꾸려서 전개해 나가도록 진행했습니다.
+
+저는 굿즈팀에서 키캡을 제작하는 걸 담당했고, 음식팀에서는 TJ님과 메뉴 선정부터 배송 과정까지 기획하는 걸 담당했습니다.
+키캡을 제작하면서, 굿즈팀의 YE님께서 디자인 부분을 많이 도와주셔서 일사천리로 끝내서 정말 감사했습니다. 음식팀에서는 TJ님이 적극적으로 임해주셨고, 성윤님이 뒤에서 많은 부분을 도와주셔서 감사했습니다.
+
+
+
+결과적으로 키캡은 위와 같이 제작되었습니다.
+
+
+
+그리고 굿즈팀의 YE님과 SM님이 포스터를 정성스럽고 이쁘게 만들어주셨습니다. (비록 백엔드 직무이시만, 취미로 디자인을 하시는 YE님 짱입니다..!)
+이 외에도 여러 팀에서 본인이 맡으신 부분들을 적극적으로 임해주셔서, 결과적으로 백엔드/인프라 반상회 준비가 문제없이 잘 되었다고 생각합니다.
+
+3월 14일, 반상회 당일 '마루 180'이라는 장소에서 100명이 넘는 글또 분들이 오프라인에 참석하면서 오프닝 -> 발표 -> 네트워킹 -> 기념 사진 촬영 으로 진행하게 되었습니다.
+
+백엔드/인프라 반상회를 한 마디로 정리하면, '짧지만 강렬했고 즐거웠던 네트워킹 모임' 입니다.
+
+해당 반상회에 대한 자세한 내용이 궁금하시다면, 승현님이 작성한 [포스팅](https://imksh.com/124)에서 확인하시면 좋을 것 같습니다 !
+여유가 된다면, 저도 이 부분에 대해 나중에 포스팅으로 업로드할 예정입니다.
+
+## Next Plan
+
+4월부터는 새로운 회사에서 백엔드 직무로 일하게 되었는데, 우선 회사에 적응을 하면서 도메인과 기술 스택에 빠르게 적응하는 시간이 될 것 같습니다.
+
+그런 다음에, 백엔드 성장에 필요한 기술들을 별도로 공부하면서 지낼 것 같습니다.
+
+(해당 포스팅은 추후에 내용을 추가 및 보완할 예정입니다.)
+
+지금까지 이 글을 읽어주셔서 감사합니다. 😌
+
+---
+
+글을 작성하는데 걸린 시간: 약 3시간
+
+- 글 작성: 2시간 40분
+- 맞춤법 수정, 문맥 정리: 20분
\ No newline at end of file
diff --git a/src/content/posts/2023-DevHistory.md b/src/content/posts/2023-DevHistory.md
new file mode 100644
index 00000000..636b32a7
--- /dev/null
+++ b/src/content/posts/2023-DevHistory.md
@@ -0,0 +1,523 @@
+---
+title: "2023 Dev History"
+date: 2023-01-01
+categories: ["회고"]
+tags: ["개발기록"]
+---
+
+> 2023 Dev History
+
+* 2023년에는 내가 공부하면서 배운 내용을 꾸준히 기록해두자.
+
+## Plan
+
+* [2023 Plan Note](https://gist.github.com/devFancy/03e1fb1aac746be13582891b0d0aab29)
+
+
+
+> 인프런 강의: [우아한형제들 최연소 기술이사 김영한의 스프링 완전 정복](https://www.inflearn.com/roadmaps/373)
+
+* [스프링 핵심 원리](https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard)
+
+* [모든 개발자를 위한 HTTP 웹 기본 지식](https://www.inflearn.com/course/http-웹-네트워크)
+
+* [스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술](https://www.inflearn.com/course/스프링-mvc-1/dashboard)
+
+* [스프링 DB 1편 - 데이터 접근 핵심 원리](https://www.inflearn.com/course/스프링-db-1/dashboard)
+
+> 인프런 강의: [김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵](https://www.inflearn.com/roadmaps/149)
+
+* [자바 ORM 표준 JPA 프로그래밍 - 기본편](https://www.inflearn.com/course/ORM-JPA-Basic)
+
+* [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발](https://www.inflearn.com/course/스프링부트-JPA-활용-1/)
+
+* [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화](https://www.inflearn.com/course/스프링부트-JPA-API개발-성능최적화/dashboard)
+
+* [실전! 스프링 데이터 JPA](https://www.inflearn.com/course/스프링-데이터-JPA/dashboard)
+
+> 객체 지향 설계, 테스트와 관련된 책
+
+* [내 코드가 그렇게 이상한가요?](https://product.kyobobook.co.kr/detail/S000202521361)
+
+* [Practical Testing: 실용적인 테스트 가이드](https://www.inflearn.com/course/practical-testing-실용적인-테스트-가이드/dashboard)
+
+> 협업, 마인드 관련된 책
+
+* [소프트웨어 장인](https://product.kyobobook.co.kr/detail/S000001889885)
+
+* [함께 자라기](https://product.kyobobook.co.kr/detail/S000001033071)
+
+## Weekly & Record
+
+> 230101 ~ 230107
+
+* [[Programmers] 12916. 문자열 내 p와 y의 개수](https://devfancy.github.io/Programmers-17680//Programmers-12916/)
+
+* [[Programmers] 12928. 약수의 합](https://devfancy.github.io/Programmers-17680//Programmers-12928/)
+
+* [[Programmers] 12931. 자릿수 더하기](https://devfancy.github.io/Programmers-17680//Programmers-12931/)
+
+* [[Programmers] 12932. 자연수 뒤집어 배열로 만들기](https://devfancy.github.io/Programmers-17680//Programmers-12932/)
+
+* [[Programmers] 12934. 정수 제곱근 판별](https://devfancy.github.io/Programmers-17680//Programmers-12934/)
+
+* [[Algorithm Skill] : 제곱근, 제곱을 구할때 쓰는 메서드](https://devfancy.github.io/Programmers-17680//Math-Sqrt/)
+
+* [[Coursera] 5개 수료증 취득](https://devfancy.github.io/Programmers-17680//Coursera-Certificates/)
+
+> 230109 ~ 230115
+
+* Git Blog 만들기(Jekyll)
+
+* [[Programmers] 12933. 정수 내림차순으로 배치하기](https://devfancy.github.io/Programmers-17680//Programmers-12933/)
+
+* [[Programmers] 12947. 하샤드 수](https://devfancy.github.io/Programmers-17680//Programmers-12947/)
+
+* [[Programmers] 12954. x만큼 간격이 있는 n개의 숫자](https://devfancy.github.io/Programmers-17680//Programmers-12954/)
+
+* [[Programmers] 12910. 나누어 떨어지는 숫자 배열](https://devfancy.github.io/Programmers-17680//Programmers-12910/)
+
+* [[Programmers] 12912. 두 정수 사이의 합](https://devfancy.github.io/Programmers-17680//Programmers-12912/)
+
+* [[Programmers] 12919. 서울에서 김서방 찾기](https://devfancy.github.io/Programmers-17680//Programmers-12919/)
+
+* [[Programmers] 12943. 콜라츠 추측](https://devfancy.github.io/Programmers-17680//Programmers-12943/)
+
+* [[Network] SOP와 CORS란 무엇인가?](https://devfancy.github.io/Programmers-17680//Network-CORS-SOP/)
+
+* [[Java] String 특징과 String 클래스의 주요 메소드](https://devfancy.github.io/Programmers-17680//Java-String-Methods/)
+
+* [[Technology] Google Search Console에 GitHub 블로그 등록하기](https://devfancy.github.io/Programmers-17680//Technology-Google-Research-Console-Verification/)
+
+* [[IntelliJ] 인텔리제이와 깃허브 연동 (Mac 버전)](https://devfancy.github.io/Programmers-17680//IntelliJ-Connection-Git-Repository/)
+
+> 230120 ~ 230125
+
+* [[Programmers] 134240. 푸드 파이트 대회](https://devfancy.github.io/Programmers-17680//Programmers-134240/)
+
+* [[Programmers] 17681. [1차] 비밀지도](https://devfancy.github.io/Programmers-17680//Programmers-17681/)
+
+* [[Programmers] 81301. 숫자 문자열과 영단어](https://devfancy.github.io/Programmers-17680//Programmers-81301/)
+
+* [[OS] 16. Segmentation](https://devfancy.github.io/Programmers-17680//OS-16-Segmentation/)
+
+---
+
+스프링 핵심 원리 - 기본편
+
+* [[Spring] 객체 지향 설계와 스프링](https://devfancy.github.io/Programmers-17680/Spring-Core-Principle-1/)
+
+* [[Spring] 핵심원리 - 기본편 : 객체 지향 원리 적용](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-2/)
+
+* [[Spring] 스프링 컨테이너와 스프링 빈](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-4/)
+
+ * [스프링 컨테이너에 등록된 빈 조회](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-4-2/)
+
+ * BeanFactory와 ApplicationContext
+
+ * 다양한 설정 형식 지원 - 자바 코드, XML
+
+ * 스프링 빈 설정 메타 정보 - BeanDefinition
+
+* [[Spring] 싱글톤 컨테이너](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-5/)
+
+* [[Spring] 컴포넌트 스캔](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-6/)
+
+* [[Spring] 의존관계 자동주입](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-7/)
+
+* [[Spring] 빈 생명주기 콜백](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-8/)
+
+* [[Spring] 빈 스코프](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-9/)
+
+* 기타 : [[Spring] 테스트를 할 때 쓰이는 어노테이션](https://devfancy.github.io/Programmers-17680//Spring-Core-Principle-TestCode-1/)
+
+---
+
+모든 개발자를 위한 HTTP 웹 기본 지식
+
+* [HTTP] 인터넷 네트워크 - 인터넷 통신 / IP / TCP, UDP / PORT / DNS
+
+* [HTTP] URI와 웹 브라우저 요청 흐름
+
+* [[HTTP] HTTP 기본1](https://devfancy.github.io/Programmers-17680//HTTP-1-Basic/)
+
+* [[HTTP] HTTP 기본2 - HTTP 메세지](https://devfancy.github.io/Programmers-17680//HTTP-2-Basic/)
+
+* [[HTTP] HTTP 메서드](https://devfancy.github.io/Programmers-17680//HTTP-3-Method/)
+
+* [[HTTP] HTTP 메서드 활용](https://devfancy.github.io/Programmers-17680//HTTP-4-Method-Application/)
+
+* [[HTTP] HTTP 상태코드](https://devfancy.github.io/Programmers-17680//HTTP-5-Status-Code/)
+
+* [[HTTP] HTTP 헤더1 - 일반 헤더](https://devfancy.github.io/Programmers-17680//HTTP-6-Header1/)
+
+* [[HTTP] HTTP 헤더2 - 캐시와 조건부 요청](https://devfancy.github.io/Programmers-17680//HTTP-7-Header2)
+
+---
+
+> 230126 ~ 230131
+
+* [[Programmers] 42889. 실패율](https://devfancy.github.io/Programmers-17680//Programmers-42889/)
+
+* [[Programmers] 17682. [1차] 다트 게임](https://devfancy.github.io/Programmers-17680//Programmers-17682/)
+
+* [[Programmers] 67256. 키패드 누르기](https://devfancy.github.io/Programmers-17680//Programmers-67256/)
+
+* [[Programmers] 77484. 로또의 최고 순위와 최저 순위](https://devfancy.github.io/Programmers-17680//Programmers-77484/)
+
+* [[Programmers] 92334. 신고 결과 받기](https://devfancy.github.io/Programmers-17680//Programmers-92334/)
+
+* [[Programmers] 118666. 성격 유형 검사하기](https://devfancy.github.io/Programmers-17680//Programmers-118666/)
+
+* [[Programmers] 17680. [1차] 캐시](https://devfancy.github.io/Programmers-17680/)
+
+* [[E.T.C] 크롬 북마크에 있는 파비콘이 제대로 안보이는 경우](https://devfancy.github.io/ETC-Chrome-Bookmark/)
+
+* [[E.T.C] 왜 개발자를 선택했는가](https://devfancy.github.io/ETC-Why-Did-You-Select-The-Developer/)
+
+
+> 230201 ~ 230205
+
+* [[Programmers] 12939. 최댓값과 최솟값](https://devfancy.github.io/Programmers-12939/)
+
+* [[Programmers] 12951. JadenCase 문자열 만들기](https://devfancy.github.io/Programmers-12951/)
+
+* [[Programmers] 12941. 최솟값 만들기](https://devfancy.github.io/Programmers-12941/)
+
+* [[Programmers] 12909. 올바른 괄호](https://devfancy.github.io/Programmers-12909/)
+
+* [[Programmers] 12981. 영어 끝말잇기](https://devfancy.github.io/Programmers-12981/)
+
+* [[OS] 18. Paging](https://devfancy.github.io/OS-18-Paging/)
+
+* [[OS] 19. TLB](https://devfancy.github.io/OS-19-TLB/)
+
+* [[OS] 20. Paging: Smaller Table](https://devfancy.github.io/OS-20-Paging-Smaller-Tables/)
+
+* [[OS] 21. Swapping](https://devfancy.github.io/OS-21-Swapping/)
+
+* [[Technology] GitHub Blog에 댓글 기능 추가(utterances)](https://devfancy.github.io/Technology-utterances/)
+
+* [[Technology] GitHub에 올라간 Branch에 Protection Rule 적용하기](https://devfancy.github.io/Technology-GitHub-Branch-Protection-Rule/)
+
+> 230206 ~ 230212
+
+* [[Programmers] 12980. 점프와 순간이동](https://devfancy.github.io/Programmers-12980/)
+
+* [[Programmers] 42747. H-Index](https://devfancy.github.io/Programmers-42747/)
+
+* [[Programmers] 64065. 튜플](https://devfancy.github.io/Programmers-64065/)
+
+* [[Programmers] 17677. [1차] 뉴스 클러스터링](https://devfancy.github.io/Programmers-17677/)
+
+* [[solved.ac] Class3++ 1012. 유기농 배추](https://devfancy.github.io/solved-class3-backjoon-1012/)
+
+* [[Network] OSI 7 계층](https://devFancy.github.io/Network-OSI7-Hierarchy/)
+
+* [[Network] DNS](https://devFancy.github.io/Network-DNS/)
+
+* [[Network] TCP 와 UDP](https://devfancy.github.io/Network-Tcp-And-Udp/)
+
+* [[Database] RDB와 NoSQL](https://devfancy.github.io/DB-Rdb-Nosql/)
+
+* [[Book] 소프트웨어 장인 리뷰](https://devfancy.github.io/Book-Software-Master-Craftsman/)
+
+* [[Technology] 나만의 GitHub README.md 꾸미기](https://devfancy.github.io/Technology-GitHub-Readme/)
+
+* [[Jekyll] 에서 Liquid syntax error 처리하는 방법](https://devfancy.github.io/ETC-Liquid-syntax-error/)
+
+> 230213 ~ 230219
+
+* [[Programmers] 43165. 타켓 넘버(dfs)](https://devfancy.github.io/Programmers-43165/)
+
+* [[Programmers] 1844. 게임 맵 최단거리](https://devfancy.github.io/Programmers-1844/)
+
+* [[solved.ac] Class3++ DFS와 BFS](https://devfancy.github.io/solved-class3-backjoon-1260/)
+
+* [[Database] 관계 데이터 모델의 개념](https://devfancy.github.io/DB-RDB-Concept/)
+
+* [[Database] 관계 데이터 모델의 개념 - Key의 종류](https://devfancy.github.io/DB-RDB-Concept-Key/)
+
+* [[Network] Proxy Server](https://devfancy.github.io/Network-Proxy-Server/)
+
+* [[Network] Cookie & Session](https://devfancy.github.io/Network-Cookie-And-Session/)
+
+* [[Network] Load Balancing](https://devfancy.github.io/Network-Load-Balancing/)
+
+* [[Network] HTTP 진화과정](https://devfancy.github.io/Network-HTTP/)
+
+* [[Network] REST, REST API, RESTful](https://devfancy.github.io/Network-REST-RESTAPI-RESTful/)
+
+* [[OS] 26. Concurrency](https://devfancy.github.io/OS-26-Concurrency/)
+
+* [[OS] 28. Lock](https://devfancy.github.io/OS-28-Lock/)
+
+* [[OS] 31. Semaphore](https://devfancy.github.io/OS-31-Semaphore/)
+
+> 230220 ~ 23026
+
+* [[Programmers] 12921. 소수찾기](https://devfancy.github.io/Programmers-12921/)
+
+* [[Programmers] 92335. k진수에서 소수 개수 구하기](https://devfancy.github.io/Programmers-92335/)
+
+* [[Programmers] 17684. [3차] 압축](https://devfancy.github.io/Programmers-17684/)
+
+* [[Programmers] SQL 59047. 이름에 el이 들어가는 동물 찾기](https://devfancy.github.io/Programmers-59047/)
+
+* [[Programmers] SQL 59414. DATETIME에서 DATE로 형 변환](https://devfancy.github.io/Programmers-59414/)
+
+* [[Programmers] SQL 59409. 중성화 여부 파악하기](https://devfancy.github.io/Programmers-59409/)
+
+* [[Programmers] SQL 131529. 카테고리 별 상품 개수 구하기](https://devfancy.github.io/Programmers-131529/)
+
+* [[solved.ac] Class3++ 2606. 바이러스](https://devfancy.github.io/solved-class3-backjoon-2606/)
+
+* [[Database] 트랜잭션(ACID 특성)](https://devfancy.github.io/DB-Transaction/)
+
+* [[Database] 트랜잭션 격리수준](https://devfancy.github.io/DB-Transaction-Isolation-Level/)
+
+* [[Database] DB Locking](https://devfancy.github.io/DB-Locking/)
+
+> 230227 ~ 230305
+
+* [[Programmers] SQL > SUM, MAX, MIN 풀이 모음](https://devfancy.github.io/Programmers-SQL-SUM-MAX-MIN/)
+
+* [[Programmers] 157342. 자동차 평균 대여 기간 구하기](https://devfancy.github.io/Programmers-157342/)
+
+* [[Programmers] 59046. 루시와 엘라 찾기](https://devfancy.github.io/Programmers-59046/)
+
+* [[SpringBoot] 변경 감지와 병합(merge)](https://devFancy.github.io/Springboot-merge/)
+
+> 230306 ~ 230312
+
+* [[백준] 1937. 욕심쟁이 판다](https://devfancy.github.io/baekjoon-1937/)
+
+* [[Programmers] 12924. 숫자의 표현](https://devfancy.github.io/Programmers-12924/)
+
+* [[Programmers] 138476. 귤 고르기](https://devfancy.github.io/Programmers-138476/)
+
+* [[Programmers] 92341. 주차 요금 계산](https://devfancy.github.io/Programmers-92341/)
+
+> 230313 ~ 230319
+
+* [[Programmers] SQL > Join 풀이 모음](https://devfancy.github.io/Programmers-JOIN/)
+
+* [[Algorithm] 프로그래밍 문제 접근법 - 문제 해결](https://devfancy.github.io/Tech-Interview-1/)
+
+* [[Algorithm] 프로그래밍 문제 접근법 - 빅 오 분석법](https://devfancy.github.io/Tech-Interview-2/)
+
+* [[DataStructure] 연결 리스트](https://devfancy.github.io/DataStructure-LinkedList/)
+
+> 230320 ~ 230326
+
+* [[Programmers] 17687. [3차] n진수 게임](https://devfancy.github.io/Programmers-17687/)
+
+* [[Programmers] 42888. 오픈채팅방](https://devfancy.github.io/Programmers-42888/)
+
+* [[DataStructure] 트리](https://devfancy.github.io/DataStructure-Tree/)
+
+* [[DataStructure] 기본적인 그래프 기법 : DFS, BFS](https://devfancy.github.io/DataStructure-DFS-BFS/)
+
+> 230327 ~ 230402
+
+* [[Programmers] 42586. 기능개발](https://devfancy.github.io/Programmers-42586/)
+
+* [[Programmers] 42587. 프린터](https://devfancy.github.io/Programmers-42587/)
+
+* [[Programmers] 42584. 주식가격](https://devfancy.github.io/Programmers-42584/)
+
+> 230403 ~ 230409
+
+* [[Programmers] 42583. 다리를 지나는 트럭](https://devfancy.github.io/Programmers-42583/)
+
+* [[Programmers] 118667. 두 큐 합 같게 만들기](https://devfancy.github.io/Programmers-118667/)
+
+> 230514 ~ 230612
+
+* [[MySQL] MacOS M1 기반 MySQL, Workbench, Sakila 설치하기](https://devfancy.github.io/MySQL-Installation/)
+
+* [[MySQL] SELECT, JOIN - Practice](https://devfancy.github.io/MySQL-DML-Practice-1/)
+
+* [[MySQL] SELECT, JOIN, SubQuery - Practice](https://devfancy.github.io/MySQL-DML-Practice-2/)
+
+* [[Java] ArrayList와 LinkedList의 성능 비교](https://devfancy.github.io/Java-ArrayList-LinkedList/)
+
+> 230805 ~ 230831
+
+* [[Book] 함께 자라기 리뷰](https://devfancy.github.io/Book-Grow-Together/)
+
+* [[Goodfriends] 굿프렌즈팀의 이벤트 스토밍(Event Storming) 도입기](https://devfancy.github.io/Goodfriends-event-storming/)
+
+* [[Goodfriends] Git Flow 전략](https://devfancy.github.io/Goodfriends-Git-flow/)
+
+* [[Goodfriends] Agile 기반 Scrum 프로세스 도입](https://devfancy.github.io/Goodfriends-Agile-Scrum/)
+
+* [[Goodfriends] EC2 환경에서 도커를 활용한 젠킨스 설치하기](https://devfancy.github.io/Goodfriends-EC2-Docker-Jenkins/)
+
+* [[Goodfriends] 젠킨스를 사용하여 CI/CD Pipeline 구축기(백엔드편)](https://devfancy.github.io/Goodfriends-Jenkins-Pipeline-Backend/)
+
+* [[Goodfriends] 젠킨스를 사용하여 CI/CD Pipeline 구축기(프론트엔드편)](https://devfancy.github.io/Goodfriends-Jenkins-Pipeline-Frontend/)
+
+* [[Goodfriends] PR 라벨로 Jenkins Build 유발 구분하기](https://devfancy.github.io/Goodfriends-PR-Label-Jenkins-Build/)
+
+> 230901 ~ 230930
+
+* [[Goodfriends] 굿프렌즈팀의 DDD 기반 기능별 패키지 구조 적용기](https://devfancy.github.io/Goodfriends-ddd-function-package/)
+
+> 231002 ~ 231008
+
+* [[Programmers] 150370. 개인정보 수집 유효기간](https://devfancy.github.io/Programmers-150370/)
+
+> 231009 ~ 231015
+
+* [[Programmers] 17686. [3차] 파일명 정렬](https://devfancy.github.io/Programmers-17686/)
+
+* [[Goodfriends] 다양한 예외 처리들을 관리하기 위해 @RestControllerAdvice 도입](https://devfancy.github.io/Goodfriends-RestControllerAdvice/)
+
+* [[Goodfriends] 시스템 장애를 미리 예방하기 위해 Amazon CloudWatch를 활용](https://devfancy.github.io/Goodfriends-Aws-CloudWatch/)
+
+> 231016 ~ 231022
+
+* [[SpringBoot] 실전! 스프링 부트와 JPA 활용2 - API 개발 기본](https://devfancy.github.io/SpringBoot-JPA2-basic/)
+
+* [[SpringBoot] 실전! 스프링 부트와 JPA 활용2: API 개발 고급 - 지연 로딩과 조회 성능 최적화](https://devfancy.github.io/SpringBoot-JPA2-advance/)
+
+* [[SpringBoot] 실전! 스프링 부트와 JPA 활용2: API 개발 고급 - 컬렉션 조회 최적화](https://devfancy.github.io/SpringBoot-JPA2-advance-collection/)
+
+> 231023 ~ 231029
+
+* [[Java] 알고리즘/코딩테스트를 위한 코드 정리](https://devfancy.github.io/Algorithm-Summary/)
+
+* [[Programmers] 131704. 택배상자](https://devfancy.github.io/Programmers-131704/)
+
+* [[Programmers] 155651. 호텔 대실(누적합)](https://devfancy.github.io/Programmers-155651/)
+
+* [[Programmers] 159993. 미로탈출 (BFS)](https://devfancy.github.io/Programmers-159993/)
+
+* [쿠키와 세션](https://devfancy.github.io/Technology-Cookie/)
+
+* [[Goodfriends] Set-Cookie의 보안 속성 적용기](https://devfancy.github.io/Technology-Set-Cookie/)
+
+* [NGINX란?](https://devfancy.github.io/Technology-NGINX/)
+
+> 231031 ~ 231105
+
+* [[내 코드가 그렇게 이상한가요?] 1장. 잘못된 구조의 문제 깨닫기](https://devfancy.github.io/Is-My-Code-That-Weird-1/)
+
+* [[내 코드가 그렇게 이상한가요?] 3장. 클래스 설계: 모든 것과 연결되는 설계 기반](https://devfancy.github.io/Is-My-Code-That-Weird-3/)
+
+* [우선순위 큐(Priority Queue) 개념 및 사용법 정리](https://devfancy.github.io/Priority-Queue/)
+
+> 231106 ~ 231112
+
+* [[Spring] Builder 패턴에 대한 이해와 사용, @Builder](https://devfancy.github.io/Spring-Builder/)
+
+* [[Programmers] 43162. 네트워크(DFS)](https://devfancy.github.io/Programmers-43162/)
+
+* [[Programmers] 수식 최대화(dfs, 순열)](https://devfancy.github.io/Programmers-2020-Kakao-Internship-2/)
+
+* [[내 코드가 그렇게 이상한가요?] 4장. 불변 활용하기: 안정적으로 동작하게 만들기](https://devfancy.github.io/Is-My-Code-That-Weird-4/)
+
+* [[내 코드가 그렇게 이상한가요?] 6장. 조건 분기: 미궁처럼 복잡한 분기 처리를 무너뜨리는 방법](https://devfancy.github.io/Is-My-Code-That-Weird-6/)
+
+> 231113 ~ 231119
+
+* [[DB] 정규화 과정](https://devfancy.github.io/DB-Normalization/)
+
+* [[Technology] 왜 HTTPS를 사용하나요?](https://devfancy.github.io/Technology-HTTPS/)
+
+* [[Goodfriends] Nginx와 Let's Encrypt로 HTTPS 웹 서비스 배포하기](https://devfancy.github.io/Goodfriends-Nginx-SSL-HTTPS/)
+
+* [[내 코드가 그렇게 이상한가요?] 8 - 12장 정리](https://devfancy.github.io/Is-My-Code-That-Weird-8-to-12/)
+
+* [[Book] 함께 자라기 리뷰](https://devfancy.github.io/Book-Growing-Up-Together/)
+
+> 231120 ~ 231126
+
+* [[내 코드가 그렇게 이상한가요?] 13 - 16장 정리](https://devfancy.github.io/Is-My-Code-That-Weird-13-to-16/)
+
+자바 ORM 표준 JPA 프로그래밍 - 기본편
+
+* JPA 소개
+
+* JPA 시작하기
+
+* [[JPA] 영속성 컨텍스트란](https://devfancy.github.io/JPA-3-Persistence-Context/)
+
+* [[JPA] 엔티티 매핑](https://devfancy.github.io/JPA-4-Entity-Mapping/)
+
+* [[JPA] 연관관계 기초](https://devfancy.github.io/JPA-5-Relationship-Mapping-Basic/)
+
+* [[JPA] 다양한 연관관계 매핑](https://devfancy.github.io/JPA-6-Relationship-Mapping-Kind/)
+
+* [[JPA] 고급 매핑 (상속관계 매핑, BaseEntity)](https://devfancy.github.io/JPA-7-Advanced-Mapping/)
+
+> 231127 ~ 231203
+
+* [[Programmers] [1차] 프렌즈4블록(2018 카카오 블라인드)](https://devfancy.github.io/Programmers-17679/)
+
+* [[Programmers] 후보키 (2019 카카오 블라인드)](https://devfancy.github.io/Programmers-42890/)
+
+* [[solved.ac] Class3++ 2606. 바이러스 (DFS)](https://devfancy.github.io/solved-class3-backjoon-2606/)
+
+* [[solved.ac] Class3++ 11724. 연결 요소의 개수(DFS)](https://devfancy.github.io/solved-class3-backjoon-11724/)
+
+* [[백준] 알고리즘 수업 - 깊이 우선 탐색 1(DFS)](https://devfancy.github.io/Algorithm-Baekjoon-24479/)
+
+* [[백준] 알고리즘 수업 - 깊이 우선 탐색 2(DFS)](https://devfancy.github.io/Algorithm-Baekjoon-24480/)
+
+* [[백준] 2644번. 촌수계산(DFS)](https://devfancy.github.io/Algorithm-backjoon-2644/)
+
+* [[solved.ac] Class3++ 1260. DFS와 BFS](https://devfancy.github.io/Algorithm-solved-class3-backjoon-1260/)
+
+* [[백준] 11725. 트리의 부모찾기](https://devfancy.github.io/Algorithm-backjoon-11725/)
+
+> 231204 ~ 231210
+
+* [[백준] 13565. 침투](https://devfancy.github.io/Algorithm-backjoon-13565/)
+
+* [[solved.ac] Class3++ 1012. 유기농 배추](https://devfancy.github.io/solved-class3-backjoon-1012/)
+
+* [[백준] 1388. 바닥장식](https://devfancy.github.io/Algorithm-backjoon-1388/)
+
+* [[백준] 4963. 섬의개수](https://devfancy.github.io/Algorithm-backjoon-4963/)
+
+* [[Java] equals와 hashCode 관계](https://devfancy.github.io/equals-and-hashcode/)
+
+* [[TestCode] Practical Testing: 테스트 코드 작성 방법](https://devfancy.github.io/Practical-Testing/)
+
+> 231211 ~ 231217
+
+* [[백준] 16173. 점프왕 쩰리 (Small)](https://devfancy.github.io/Algorithm-backjoon-16173/)
+
+* [[Programmers] 43162. 네트워크(DFS)](https://devfancy.github.io/Programmers-43162/)
+
+* [[Programmers] 1844. 게임 맵 최단거리(bfs)](https://devfancy.github.io/Programmers-1844/)
+
+* [[Programmers] 159993. 미로탈출 (BFS)](https://devfancy.github.io/Programmers-159993/)
+
+* [[TestCode] Practical Testing: 테스트 코드 작성 방법 - Mock, 더 나은 테스트를 위한 구체적 조언](https://devfancy.github.io/Practical-Testing2/)
+
+자바 ORM 표준 JPA 프로그래밍 - 기본편
+
+* [[JPA] 프록시와 연관관계 관리](https://devfancy.github.io/JPA-8-Proxy/)
+
+* [[JPA] 값 타입](https://devfancy.github.io/JPA-9-Value-Type/)
+
+> 231218 ~ 231224
+
+* 팀프로젝트 - Goodfriends: 신고, 상품 기능에 대한 리팩터링 - [PRs](https://github.com/woorifisa-projects/GoodFriends/pulls?q=is%3Apr+is%3Aclosed+assignee%3AdevFancy)
+
+* [[Programmers] SQL > String, Date 풀이 모음](https://devfancy.github.io/SQL-String-and-Date/)
+
+> 231225 ~ 231231
+
+* 팀프로젝트 - Goodfriends: 주문 기능에 대한 리팩터링 - [PR](https://github.com/woorifisa-projects/GoodFriends/pull/355)
+
+* [[사이드 프로젝트] 굿프렌즈 - 사용자 기반 기능 전체 리팩터링](https://devfancy.github.io/Goodfriends-Improved/)
+
+* [[Programmers] SQL > JOIN 풀이 모음](https://devfancy.github.io/SQL-Join/)
+
+* [[Programmers] 118667. 두 큐 합 같게 만들기(queue)](https://devfancy.github.io/Programmers-118667/)
+
+* [Git 형상 관리 + 작업 단위와 PR 코드 리뷰 + 협업을 잘하는 개발자 (feat. 제미니의 개발실무)](https://devfancy.github.io/Git-Version-Control/)
diff --git a/src/content/posts/2023-Retrospective.md b/src/content/posts/2023-Retrospective.md
new file mode 100644
index 00000000..3100d040
--- /dev/null
+++ b/src/content/posts/2023-Retrospective.md
@@ -0,0 +1,489 @@
+---
+title: "2023년 회고"
+date: 2023-12-31
+categories: ["회고"]
+tags: []
+---
+
+2023년은 20대 동안 `개발` 면에서 가장 활발하게 다양한 활동을 경험한 한 해이자, 휴식이 적은 한 해였다.
+정말 순식간에 1년이 지나가버린 것 같다 🤔.
+
+그동안 내가 무엇을 배웠고 어떤 성장을 했는지 하나씩 정리해보자. ✍🏻
+
+> 2023년에 내가 공부하면서 배운 내용을 [2023 Dev History](/2023-DevHistory/)에도 기록해두었다.
+
+```markdown
+2023년에 참여한 모임
+
+1월 ~ 5월: 신입 개발자를 위한 CS 스터디 모임
+3월 ~ 11월: 히빗(팀 프로젝트)
+(8월: 대학교 졸업)
+4월 ~ 9월: 우리FISA '클라우드 서비스 개발자'
+8월 ~ 9월, 12월: 굿프렌즈(팀 프로젝트)
+11월 ~ 12월: 우아한스터디 2023 겨울시즌 '내 코드가 그렇게 이상한가요?'
+12월: 글또 9기 '글 쓰는 또라이가 세상을 바꾼다! 글쓰는 개발자 모임'
+```
+
+## 신입 개발자를 위한 CS 스터디 모임
+
+
+
+2023년 1월에 시작한 [신입 개발자를 위한 CS 스터디](https://github.com/devSquad-study) 5월 말까지 5개월 동안 지속적으로 운영해왔다.
+그 당시에는 컴퓨터 기반 지식이 부족했고, 배워야 할 것이 너무 많아서 운영체제, 데이터베이스, 네트워크와 같은 컴퓨터 공학의 필수 과목을 매월 1개씩 스터디원들과 공부해나갔다.
+
+스터디를 처음 운영해보는 경험이라 깊이 있는 학습과 철저한 기록을 목표로 삼았다.
+그래서 우리 스터디의 `목표`는 CS 기본 지식들을 **깊이 있게** 습득하고, 공부한 내용을 설명하여 죽은 지식이 아닌 **살아있는 지식**으로 바꾸고자 했다.
+여러 시행착오를 거치면서 **더 나은 개선 방향**을 찾고, 이러한 경험을 Issues와 Wiki에 정리해놓았다.
+
+* [Issues](https://github.com/devSquad-study/2023-CS-Study/issues)에는 주제와 내용을 매주 정하고, 각 스터디원이 주제를 정해 발표하는 내용을 기록했다.
+
+* [Wiki](https://github.com/devSquad-study/2023-CS-Study/wiki)에는 외부인도 쉽게 이해할 수 있도록 주제를 카테고리별로 정리하고, 주차별로 기록했다.
+
+5개월 동안 진행한 뒤 6월부터는 다른 교육과 사이드 프로젝트로 인해 참석하지 못했지만, 남아있는 스터디원들이 적극적으로 활동하여 12월 31일 현재까지 총 591개의 Star를 받게 되었다.
+이는 1-3월에 80개, 5월에 150개, 11월에 500개로 거의 매일 Star가 증가한 것을 보며 뿌듯함과 신기함을 느끼게 되었다.
+
+이 스터디가 많은 Star를 받은 이유는 다른 CS 스터디 모임보다 CS 지식을 **깊게 공부하고 정리한 점**과 외부 사람이 **이해하기 쉽도록 작성하려고 노력한 점**이라고 생각한다.
+현재까지도 스터디원분들끼리 매주 온라인 회의로 스터디를 진행하시는데, 이런 분들과 같이 스터디를 할 수 있어서 영광이라고 생각한다 👏🏻.
+
+해당 스터디에서 배운 내용은 아래와 같다.
+
+> 신입 개발자를 위한 CS 스터디 모임에서 진행했던 내용
+>
+> 1. 데이터베이스 - 학교에서 배운 전공 서적, [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852), 면접을 위한 CS 전공지식 노트 + 그 외에 각종 레퍼런스 자료들
+> 2. 운영체제 - 학교에서 배운 전공 서적, [Operating Systems: Three Easy Pieces](https://www.amazon.com/Operating-Systems-Three-Easy-Pieces/dp/198508659X), [운영체제와 정보기술의 원리](https://www.yes24.com/Product/Goods/90124877), 면접을 위한 CS 전공지식 노트 + 그 외에 각종 레퍼런스 자료들
+> 3. 네트워크 - 학교에서 배운 전공 서적, 면접을 위한 CS 전공지식 노트 + 그 외에 각종 레퍼런스 자료들
+> 4. 자료구조 - 학교에서 배운 전공 서적, 면접을 위한 CS 전공지식 노트 + 그 외에 각종 레퍼런스 자료들
+
+Spring, JPA 부분은 [김영한의 스프링 완전 정복](https://www.inflearn.com/roadmaps/373)에 있는 강의를 혼자서 들으면서, 관련 내용을 블로그에 정리했다.
+* [Spring](https://devfancy.github.io/category/#Spring) - 스프링 핵심원리 기본편, 스프링 MVC 1편
+* [JPA](https://devfancy.github.io/category/#JPA) - 자바 ORM 표준 JPA 프로그래밍 - 기본편, 실전! 스프링 부트와 JPA 활용 1, 2
+
+
+## 클라우드 서비스 개발자
+
+4월 말부터 9월 말까지 우리FISA에 `클라우드 서비스 개발자`로 참여하면서 다양한 경험을 쌓았다.
+이 기간 동안 어떤 일들을 경험했는지를 정리하고자 한다.
+
+### 미션
+
+약 5개월이라는 시간동안 여러 가지 지식과 경험을 쌓았다.
+
+첫 달 동안은 `프론트엔드`의 필수 지식인 HTML, CSS, JavaScript 언어와 동적 JavaScript 프레임워크인 Vue.js를 학습했다.
+이전에 HTML, CSS, JavaScript 언어는 몇번 사용해보지 않는 상황이였고, Vue.js는 사용해본 적이 없었다. 그래서 한 달이라는 시간동안 최대한 많은 학습을 배우려고 노력했다.
+
+하나의 언어를 마칠 때마다, 토이 프로젝트로 간단하게 구현하는 미션도 받았다.
+HTML, CSS 언어 만으로 간단하게 웹 페이지를 만든다라던지, JavaScript를 이용해서 '코인 슬롯 머신 게임' 과 같은 토이 프로젝트를 진행했다.
+이때는 기본적인 문법을 익히는 데에만 집중했고, 개발하면서 **설계와 기능**을 구현하는 것 뿐만 아니라 **리팩터링**도 신경쓰면서 만들었다.
+나는 거의 처음 학습하는 수준이였기에 프론트엔드 과정을 배우면서, 주위에 같이 듣는 사람들에게 많은 질문을 하면서 최대한 따라가려고 노력했다.
+
+프론트엔드 과정이 끝나고, 곧바로 `백엔드` 과정에 대한 기술 지식들을 학습해 나갔다.
+서비스의 기능 부분을 담당하는 백엔드 프로그래밍 언어인 Java의 기본 문법부터 관련 예제를 학습했고, 관계형 데이터베이스 관리 시스템인 MySQL를 학습하면서 개념 및 DB 조작 명령어를 학습했다.
+이때, MySQL 기반의 Select, Join, SubQuery 문제에 대해 여러 문제를 풀었고, 이를 [포스팅: [MySQL] SELECT, JOIN, SubQuery - Practice](https://devfancy.github.io/MySQL-DML-Practice-2/)으로 정리했다.
+
+이후에는 웹 애플리케이션 서버(WSA)인 Servelt, JSP를 학습하며 구현과 동작 원리를 이해해나갔다.
+Spring 프레임워크를 사용하면서 **MVC 패턴**을 적용하여 HTTP 요청 및 응답 처리 방식을 학습했다.
+이전에 MVC 패턴에 대해 개인적으로 공부했지만, 깊이 있게는 하지 않았던 것 같다.
+그래서 다시 한번 복습하면서 왜 MVC 패턴을 나오게 되었는지, 그리고 MVC 패턴을 사용하면서 장점은 무엇인지에 대해 직접 코드를 작성하면서 알게되었다.
+
+그런 다음 Gradle 환경에서 Spring Boot와 JPA를 이용하여 **CRUD** 기능 개발과 MySQL을 연결하는 과정을 학습했다.
+이전에 JDBC를 사용할 때 데이터베이스와의 상호 작용을 직접 다루어야 하는 번거로움과 복잡성이 있었다. SQL 쿼리를 직접 작성하고 결과를 매핑하는 등의 작업을 하면서 개발 생산성을 저하시키는 반면에,
+JPA는 이러한 ORM 기술을 Java에서 쉽게 사용할 수 있도록 표준을 제공해준다는 점이다.
+
+백엔드 과정에서 배운 걸 기반으로 백엔드 과정의 마지막 5일은 토이 프로젝트로 '지각 면제권을 얻기 위한 퀴즈 게임 풀기'를 개발했다.
+이때, 이전에 배웠던 프론트엔드와 백엔드간의 API 연동하는 점과, API 문서를 **Swagger**로 작성하는 경험까지 했다.
+이 과정에서 팀원들과 **협업**하는 과정 뿐 아니라, 페어 프로그래밍을 하면서 서로 간의 **코드 리뷰**를 아낌없이 해주면서 개발 실력을 조금 더 성장할 수 있었다.
+
+프론트엔드 과정과 백엔드 과정을 마치고, 마지막 과정인 `클라우드 네이티브 과정`을 약 10일 동안 진행했다.
+이때 AWS를 사용할 때 필요한 기술인 리눅스 서버를 학습하면서 기존에 구현한 프로그램을 서버에 배포하는 경험을 했다.
+이전 토이 프로젝트인 '지각 면제권을 얻기 위한 퀴즈 게임 풀기'을 AWS EC2 환경에 배포해보는 것부터 Dokcer와 Jenkins를 활용하여 배포를 자동화하는 경험까지 했다.
+이전에 Docker와 Jenkins를 사용해본 적이 없었기 때문에, 해당 과정을 들으면서 개인 노션에 하나하나 다 정리해나갔다.
+
+이렇게 세 가지(프론트엔드, 백엔드, 클라우드 네이티브) 과정을 겪으면서, 배운 내용을 이후에 팀프로젝트 때 제대로 적용할 수 있을까?에 대해 스스로 걱정이 됐었다.
+그래서 '하나라도 제대로 알고 공부하자'라는 마음과 '내가 모르는 부분, 그리고 중요한 부분은 내 개인 블로그에 남기자'라는 마음으로 임했다.
+
+### 기술 세미나
+
+프론트엔드, 백엔드, 클라우드 네이티브에 대한 각 과정이 끝날 때마다 기술 세미나를 진행했다.
+
+각 과정에 대한 공부도 많았는데, 기술 세미나 준비까지 해야해서 일주일 내내 제대로 잠을 자본 적이 없었다.
+기술 세미나는 주로 평일 저녁 이후, 아니면 주말에 모여서 아침부터 지하철 끊기는 시간까지 공부했던 기억이 난다.
+이 과정에서 굉장히 많은 피로감이 쌓였지만, 이러한 과정이 '미래의 나에게 도움이 많이 될거야' 라는 생각으로 임했다.
+그리고 이때, 같이 준비한 팀원끼리도 서로 좋은 에너지를 주고 받았기 때문에 힘들었지만 재밌었다.
+
+
+
+3개의 주제를 발표하면서, 운이 좋게도 '왜 우리는 Vue.js를 사용하는가?'에 대한 우수상을 받게 되었고,
+수상금으로 같이 발표 준비를 했던 팀원들이랑 맛있는 저녁을 먹었다 😋.
+
+### 굿프렌즈
+
+
+
+8월부터 2달간 '굿프렌즈' 이라는 팀 프로젝트를 진행하며, **제대로된 협업과 장기간 프로젝트 경험**을 손에 넣었다.
+굿프렌즈 팀에서는 훌륭한 팀원들을 만나서 대체적으로 큰 트러블이 없었고, 기쁨과 즐거움 속에서 프로젝트를 마무리할 수 있었다.
+이 기간 동안 함께 성장하고 배우면서, 협업의 소중함과 함께 얼마나 행복한 일인지를 다시 한번 깨닫게 되었다.
+
+
+
+팀 모두가 서비스에 대한 공통된 이해를 가지기 위해 **이벤트 스토밍**을 도입하면서 많은 토론을 진행했다.
+도메인에 대해 서로가 알고 있는 내용을 포스트잇으로 정리하고, 하나로 합치는 과정에서 많은 경험을 쌓았다.
+그 과정에서 페르소나 분석을 통해 사용자 이미지를 구체화하면서 서비스 도메인을 보다 명확히 이해할 수 있었다.
+
+자바스크립트로부터 접근 방지를 위해 Cookie의 보안 속성을 적용하는 과정 속에서 많은 경험을 얻었다.
+또한, 상품 등록 및 수정하는 API 개발에서 Spring Boot에서 AWS S3에 파일을 업로드하는 방법을 처음으로 알게되었다.
+
+우리는 여러 방법들 중에 `MultipartFile` 업로드하는 방식을 사용했고, 이 과정에서 **Client - Spring Boot - AWS S3** 사이에 어떻게 처리가 이루어지는지 알게되었다.
+또한, 상품과 주문 사이에 발생하는 N+1 문제라든가, 하나의 정보를 삭제할 때 관련된 정보도 같이 삭제되는지에 대해서 신경써야 할 부분들이 많았다.
+단순히 눈으로 보여지는 부분 뿐 아니라 영속성 컨텍스트나 프록시 처럼 눈에 보이지 않는 부분에 대해서 이해해야 하는 점에서 고군분투를 겪으면서 많은 걸 배웠다.
+
+프로젝트 구조에 대한 토론 또한 팀원들과 활발히 진행했다.
+여기에 대한 명확한 정답은 없기 때문에, 계층적 패키지 구조로 갈지, 기능적 패키지 구조로 갈지에 대해 적극적으로 참여하면서 팀원들과 의견을 주고 받았다.
+팀 프로젝트 당시에는 매일 다 같이 모여있는 시간이 많았고, **팀원 모두가 서비스 기획부터 개발까지 참여**하기 때문에 프로젝트에 대한 이해도가 높아서 `기능별 패키지 구조`를 선택했다.
+
+배포 자동화를 위해서 많은 시간을 쏟았었다. `Jenkins`를 사용해서 CI/CD를 구축하는 과정에서 많은 문제를 겪고 해결을 했던 기억이 난다.
+EC2 t2.micro 기본 인스턴스를 사용하다보니 빌드를 하다가 서버가 자꾸 죽는 일이 발생해서, Executors 수를 **1개**로 제한하여 프론트 -> 백엔드 식으로 순서대로 빌드가 되도록 설정했다.
+그리고 프론트엔드와 백엔드, 두 개의 코드 중 하나라도 Merge가 되었을 때 빌드 및 배포가 되고 있는 상황이였다.
+그래서 PR시 Merge되었을 때 각 트랙별로 코드가 빌드 및 배포될 수 있도록 빌드 트리거를 조금 더 세분화하여 Github의 라벨을 기반으로 트리거를 개선했던 경험이 있다.
+정말 뿌듯했던 경험 중 하나였다.
+
+그 외에도 시스템 장애를 미리 예방하기 위해 `Amazon CloudWatch`를 활용한 모니터링, 다양한 예외를 하나의 클래스에서 효율적으로 관리하기 위해 RestControllerAdvice, ExceptionHandler 어노테이션 활용 등
+실무에서 적용할 법한 고민과 기술을 도입하게 되었다.
+
+
+
+> 해당 팀 프로젝트를 진행하면서 작성한 글은 [Side Project](/category/#사이드프로젝트) 에서 Goodfriends 부분을 참고해 주세요.
+
+해당 팀 프로젝트를 하면서, 해결한 과정들을 기록하기 위해 팀 기술 블로그를 만들고 운영했다. **2달간 10개**의 포스팅을 업로드했지만, 프로젝트 기간이 끝난 이후에도 추가적으로 **4개**를 더 업로드해왔다. (총 14개)
+처음에는 포스팅을 작성하면서 기록을 중요시했던 내가 주로 글을 작성하고, 작성 방법에 대한 가이드라인을 팀원들에게 제시했다. 그 결과, 팀원들도 하나씩 글을 작성하게 되었다.
+글을 작성하는 데에는 초기에 시간과 노력이 소요되지만, 나중에 동일한 문제에 직면했을 때 이를 빠르게 해결할 수 있는 장점을 제공해준다.
+이 과정을 통해 우리는 팀 전체적인 개발 지식을 증진시키는 동시에, 향후 발생할 수 있는 문제에 대한 대비책을 마련하는 데도 도움을 얻을 수 있었다.
+
+### 아쉬웠던 점
+
+프로젝트에 대해 개인적으로 아쉬웠던 점은 코드 품질이 좋지 못하다고 생각했고,
+'과연 우리가 만든 코드가 지속 성장 가능한 코드인가?'에 대한 의구심이 들었다.
+
+
+
+토스 유튜브에 업로드된 토스 SLASH 22에서 토스페이먼츠 재민님께서 발표하신 ['지속 성장 가능한 코드를 만들어가는 방법'](https://toss.im/slash-22/sessions/1-6) 영상을 팀 프로젝트 기간이 종료된 후에 시청하게 되었다.
+이 영상에서 가장 기억에 남은 문구가 '토스페이먼츠에서는 **코드 한 줄 한 줄의 의미를 곱씹고 코드에 대해서 "왜?"라는 질문을 하는 것을 권장**하는데, 개인적으로 가장 중요한 것은 **코드**라고 생각합니다.' 라는 내용이었다.
+
+이 영상을 통해 다양한 인사이트를 얻었고, 이를 바탕으로 9월 27일을 기준으로 팀 프로젝트의 공식 기간은 종료되었지만, 굿프렌즈 프로젝트에 대한 코드를 개선하고자 했다.
+하지만, 코드에 대해 명확히 어떻게 개선해야 할지 모르는 와중에, **'우아한스터디 2023 겨울시즌'** 이 열리게 된 것을 보게 되었다.
+좋은 코드를 작성하는 방법을 배우고 싶어서 해당 스터디 여러 주제 중 '**내 코드가 그렇게 이상한가요?**' 를 선택하게 되었고, 신청할 때 진심을 다해 지원서를 작성했던 기억이 난다.
+정말 운이 좋게도 스터디에 합격하게 되었고, 11월부터 12월까지 2달이라는 시간동안 스터디를 열심히 참여했다.
+스터디에서 배운 내용을 기반으로 12월부터 굿프렌즈 프로젝트에서 사용자 기반 기능들(프로필, 상품, 주문, 신고)에 [적용](https://devfancy.github.io/Goodfriends-Improved/)했고, 이때 정말 많은 **리팩터링** 경험을 가졌다.
+
+추가적으로 단위 및 통합 테스트 코드도 적용하기 위해 11월, 한달 동안 인프런에서 우빈님이 만든 'Practical Testing: 실용적인 테스트 가이드' 강의를 전부 들으면서 [Practical Testing: 테스트 코드 작성 방법](https://devfancy.github.io/Practical-Testing/) 이라는 포스팅을 내 개인 블로그에 정리했다.
+12월에 기존 프로젝트에 리팩터링하면서 단위 테스트 코드만 적용했지만, 나중에 통합 테스트도 꼭 적용해보려고 한다.
+
+## 대학교 졸업
+
+
+
+2020년부터 2023년 상반기까지 약 3년 반동안 대학 시절을 보내면서 대학에서만 누릴 수 있는 소중한 경험들을 쌓았다.
+더 이상 대학교 수업을 안들어도 되어서 신났지만, 이젠 학생도 아니고 아무 소속도 없었기 때문에 백수가 되어버렸지만 말이다.
+
+### 대학교 시절, 3년 반의 시간 동안 난 무엇을 했는가
+
+3년 반의 시간을 전부 얘기하는 것보다 기억에 남는 몇 가지 순간을 나열해보려고 한다.
+
+먼저 글로벌소프트웨어융합 학과를 선택하게 된 배경에 대해 먼저 얘기해보려고 한다.
+
+2017년 군복무를 하는 당시에, 주말과 같은 여유로운 시간에 자기개발, 경제, 금융 도서를 읽으면서 진로에 대해 진지하게 고민하는 시간을 가졌다.
+그 당시에는 나는 IT와는 거리가 먼 **전기공학과 학생**이었지만, 미국 주식 시장에서 에너지 및 금융 회사가 하락하고 IT 대기업이 선두에 서는 모습을 책과 인터넷을 통해 알게되면서, IT 분야에 흥미를 느꼈다.
+이 흥미가 계속 이어지면서 제대 이후에도 1년 반동안 열심히 공부한 결과, 내가 정말 가고싶었던 대학과 전공인 **컴퓨터학부 글로벌소프트웨어융합 학과**에 편입으로 들어갔다.
+
+사실, 내가 글로벌소프트웨어융합 학과을 택한 이유는 컴퓨터학부이면서도 해외 복수학위에 대한 기회를 얻을 수 있었기 때문이다.
+하지만, 2020년 내가 입학할 당시에 코로나라는 병이 터질 줄은 꿈에도 몰랐다. 코로나로 인해 대면 수업을 물론, 해외 복수학위의 꿈은 물거품으로 넘어가 버렸다 🥲.
+
+2020년부터 2021년의 2년 동안은 고난의 시기를 경험했다.
+2020년, 입학하고 나서 들었던 과목중에서 가장 어려웠던 과목을 고르자면, `자료구조응용` 과 `알고리즘실습` 과목이였다.
+C언어에 대한 기본 문법만 알고 있었는데, 매주 과제로 나오는 자료구조/알고리즘의 다양한 문제들을 푸는 과정이 나에겐 험난의 연속이였다.
+비대면이라 친구도 사귈 수 없던 환경에서 혼자서 과제를 푸는게 힘들었고, 정말 많은 좌절감을 맛보았다.
+하지만 교수님의 격려로 이 어려운 과목을 꾸준히 반복해서 푸는 노력을 게을리하지 않고 성취했다.
+교수님께서 격려의 말로 '어려운 건 당연하다. 그러니 포기하지말고 알 때까지 반복해서 풀어라' 라고 말씀해주셨던 게 기억에 남았다.
+
+2021년에는 몸이 좋지 않아서 대학교에 질병 휴학을 신청했고, 1학기 동안 내 건강 회복에만 전념했다.
+이때, '건강하지 않으면 아무것도 못하는 구나' 라는 깨달음을 얻고 운동을 꾸준히 해야겠다고 다짐했다. 건강이 어느 정도 회복된 이후부터는 최소 주 3일 헬스장에 운동하러 갔다.
+2학기때 복학을 신청하고 대학에 다니면서, `데이터분석` 이라는 분야에 관심이 생겨서 경상학부내 동아리인 `금융데이터분석학회`(KNU DART)에 참여하게 됐다.
+해당 동아리에서 금융이론 뿐 아니라 `Python`을 이용해서 데이터를 분석하는 걸 배웠다. 그 외에도 모의투자 대회, 리서치 경험, 팀 프로젝트 수행 등 여러 경험을 가지게 되었다.
+이때, `데이터분석` 직무로 취업을 해야 하나 고민을 많이 했지만, `백엔드 개발자`라는 직무가 나에게 더 안정감과 적성에 맞는 것 같아서 데이터분석 직무에 대한 고민을 뒤로하고 `백엔드 개발자`를 선택하게 되었다.
+
+그래서 2022년부터는 백엔드 개발자 직무로 취업하기 위해 공모전, 대회를 알아보기 시작했다. 3월에 혼자서 아이디어를 만든 다음, 4월부터 인원을 모으면서 다양한 공모전에 참여하게 했지만,
+결과는 처참했다. 지금 생각해 보면 당연한 결과인 게, 나는 이제 막 시작하는 병아리 정도의 수준이었고, 대회에 참가한 대부분의 팀들은 어느 정도 경험을 갖춘 사람들이었기 때문이다.
+그리고 그 당시에 나는 기본기가 많이 부족했고, 개발 경험도 적었다. 그래서 기본기를 쌓기 위해 `자바의 정석` 책을 보기 시작했고, 여름방학(7-8월)에는 운이 좋게도 스타트업 회사의 백엔드 개발자 인턴(현장실습)으로 합격해서, 2달간 백엔드 역량 및 경험을 가졌다.
+해당 스타트업에서 처음으로 **Spring Boot, JPA**를 사용하였고, 기본적인 **CRUD** 개발부터 약간의 프론트엔드 언어인 JavaScript를 이용하여 메인 페이지를 개발 경험을 가지게 되었다.
+백엔드 개발자 인턴으로 근무했지만, 프론트 개발도 조금 하면서 관련 지식을 쌓았고, UI/UX에 대한 기획 경험도 가지게 되었다. 인턴 근무기간이 거의 끝날 당시에,
+해당 회사의 팀장님께서 '책임감 있게 잘해줘서 고맙다'라는 말씀을 들어서 많이 뿌듯했고, 마지막 회식 때 회사에 재직하시는 분들과 아주 즐겁게 보냈던 기억이 난다.
+인턴이 끝나고 해당 회사로부터 최우수 점수인 100점을 받게 되어서 너무 기뻤다.
+
+사실 인턴을 다니면서, 동시에 내가 만든 아이디어인 주제를 가지고 7월에 7명의 팀원들과 "2022 공개 SW 개발자 대회"에 참가하게 되었다.
+7월부터 8월까지 2달 동안 평일에는 인턴으로 회사 출근을, 평일 저녁 이후에 혹은 주말에는 대회에 같이 참가한 팀원들과 모여서 대회 준비를 하면서 정신없이 보냈다.
+약 5개월 동안 팀원 모두가 열심히 참여한 결과, 9월 1차 서면 평가에서 합격해서 본선에 진출하게 되었다.
+서면 평가에 합격한 그날 저녁에 팀원 모두가 모여서 서로 고생했다면서 박수와 함께 행복한 시간을 보냈다.
+그 이후에도 프로젝트에 대해 진지하게 임하였고, 11월 서울 코엑스에서 우리 서비스에 대해 PPT를 통해 최종 발표를 진행하게 되었다.
+
+
+
+위의 사진은 최종 발표를 위해 코엑스에 같이 와준 팀원들과 기념으로 같이 찍은 사진이다.
+결과적으로 우수작에만 선정되고 수상은 받지 못했지만, 대회 기간 동안 모두 열심히 참여해 줘서 너무 고맙게 생각한다.
+수상을 받지 못하게 된 이유는 아이디어적으로 참신하지 못했고, 기획에 나온 기능들에 대해 완벽히 구현하지 못했다.
+또한 우리가 만든 서비스는 수익성이 있는 비즈니스 모델을 기반으로 만든 서비스였기 때문에. 공개 SW인 만큼 오픈 소스의 취지에 부합하지 못했다고 생각한다.
+이러한 점에서 팀원 모두가 결과에 대해 인정했고, 이를 바탕으로 서비스를 고도화 시킨 후 우리 서비스의 주제에 부합한 대회에 참여하기로 했다.
+그래서 10월 대내에서 진행한 '창업성과 경진대회'에 참여하게 되었고, 장려상을 수상 받게 되었다.
+
+이 외에도 개인적으로 대내에서 진행한 'KNU 학생설계 융합전공 공모전'에 참가하여 대상을 수상 받았다.
+하지만, 취업은 별개였다. '내가 대학 시절에 ~~ 했고, ~~ 경험을 했어요'와 같은 말은 취업에서 통하기도 하고, 통하지 않기도 한다.
+내가 가고자 하는 **직무와 관련된 경험**이 있어야 하며, 해당 **직무에서 요구하는 역량**을 갖춰야만 했다.
+나는 공모전(대회), 인턴을 통해 프로젝트 경험은 했지만, 취업을 위한 코딩테스트와 CS 지식에 대한 준비를 제대로 하지 못했다.
+그 결과 백엔드 직무로의 취업은 실패했고, 이를 깨닫고 난 이후에는 코딩테스트와 CS 지식을 꾸준히 공부해야겠다고 결심했다.
+그래서 2022년 12월부터 코딩테스트와 CS 지식을 공부하면서, 해당 내용을 개인 블로그에 정리했다. (이때가 개인 블로그를 제대로 운영하기 시작했다)
+
+## 대외활동
+
+2023년에는 다양한 대외활동을 했다.
+히빗(팀 프로젝트), 우아한스터디, 글쓰는 개발자 모임에 대해 하나씩 얘기해보고자 한다.
+
+### 히빗
+
+
+
+올해 3월, 지인으로부터 팀 프로젝트를 같이 하자는 제안이 와서, 좋은 기회라 생각해서 같이 하게 되었다.
+좋은 기회라고 생각한 이유는 아이디어 적으로 참신했고, 기획과 디자인이 어느 정도 완성되어 있어서 바로 개발에 들어갈 수 있어서였다.
+
+무엇보다 팀원들 다 성격도 좋았고, 프로젝트 경험이 있기 때문에 안정감이 많이 들었다.
+들어왔을 때는 기획자 2명, 디자이너 1명, 프론트엔드 개발자 2명, 백엔드 개발자 1명이었고, 나는 백엔드 개발자로 합류하게 되었다.
+
+내용을 들어보니 이전에 해당 프로젝트를 진행했지만, 마무리가 잘 안되어서 런칭하지 못하게 되었다고 한다.
+그래서 이번 계기로 제대로 런칭을 하고자 하는 게 팀원분들의 공통적인 목표였다.
+
+이 프로젝트에서 내가 구현해야 할 기능은 `구글 소셜 로그인`과 `프로필`이였다.
+OAuth에 대한 개념을 몰랐던 상황에서 소셜 로그인 기능을 구현해야 했기에, 초반에는 생활코딩에서 무료로 업로드된 [유튜브 영상](https://opentutorials.org/course/3405/22004)을 보면서 이해했다.
+그런 다음 [구글 공식 문서: OAuth 2.0](https://cloud.google.com/apigee/docs/api-platform/security/oauth/oauth-home?hl=ko)을 참고했다.
+
+하지만, 코드에 대해 구현하는 건 또 다른 막막함이였기에, 이미 구현해두었던 [달록](https://github.com/woowacourse-teams/2022-dallog) 프로젝트의 코드를 참고했다.
+해당 프로젝트는 `우아한테크코스`라는 우아한형제들에서 주관하는 교육 기관에서 진행한 프로젝트였고, 소셜 로그인에 대한 구현 과정을 Issues와 Pull Requests에 잘 기록했기 때문이다.
+이미 깔끔하게 구현된 코드라 처음 보는 나에게는 전부 이해하기 어려워서, 이해가 잘 안된 코드는 구글링과 GPT의 도움을 받으면서 최대한 이해해보려고 노력했다.
+
+액세스 토큰과 리프레시 토큰을 발급하는 기능을 구현하면서 처음으로 `JWT`에 대해서도 알게 되었고, 해당 개념에 대해서도 공부하게 되었다.
+또한 **보안적 이슈**적인 문제도 있어서, 프론트엔드와 해결하는 과정에서 2주 동안 회의를 계속하면서 어떤 부분이 문제였고, 어떻게 해결해야 하는지 서로 의견을 많이 주고받았다.
+이 과정에서 쿠키의 보안적인 속성도 알 수 있었고, 로컬 서버가 아닌 `HTTPS`로 서버를 띄울 때, 어떻게 설정해야 하는지 많은 걸 배울 수 있게 되었다.
+
+개발 외에 **협업**적인 면에서도 많은 걸 배웠다.
+
+매주 Zoom을 통해 온라인 회의에 참석하면서, 이번 주에 해야 할 일들과 논의 사항들을 노션(Notion)을 통해 정리해나갔다.
+다들 개개인 일정이 있는 와중에도 팀 회의만큼은 참여하고자 하는 의지가 컸고, 이런 팀원들과 프로젝트를 함께할 수 있어서 감사했다.
+그중에서도 기획자이신 JM님이 매주 회의록을 정리해 주시고, 슬랙에 공유해 주신 점이 감사했다. 누구에게 대신 작성해달라고 부탁해도 되는데, 이러한 작업을 혼자서 거의 5개월간 지속해오신 게 정말 대단하신 것 같다.
+
+* [히빗: 전체 회의록(external)](https://ycat01.notion.site/664f425c4e3b4c28b5df62d7e6025fe2?pvs=4)
+
+프로젝트 중반에는 팀 전체적으로 슬럼프가 찾아왔고, 이를 해결하기 위해 **체크인-체크아웃 문화**를 도입하게 되었다.
+개발을 5월에 시작하고, 7월쯤 되었을 무렵에 초기와는 다르게 팀 전체적으로 열정적인 분위기가 사라졌다.
+그도 그럴게, 나는 우리FISA에 4월 말부터 참가하게 되면서 평일에는 저녁 9시 이후 또는 주말밖에 시간이 나질 않았다.
+다른 팀원분들 중에서 인턴, 정규직 사원 되신 분도 있고, 몇 분은 취업 준비하느라 바빠진 시기였다.
+
+그래서 '왜 나만 일하는 것 같지?', '다른 팀원들은 뭐 하고 있지?' 와 같은 생각을 가졌을 때, 프론트엔드 개발자로 참여한 SJ님이 체크인-체크아웃 문화를 도입을 제안했다.
+
+SJ님이 그 당시에 제안했던 얘기를 정리하면 아래와 같다.
+
+> `체크인`이란, 내가 히빗과 관련된 어떤 일이든 하고 있다면 슬랙의 `체크인-체크아웃` 채널에 스레드를 남기는 겁니다.
+> 이때 체크인 시간과 함께 **오늘 해야할 일과 목표를 작성**하는 거죠. 달성하지 못해도 괜찮습니다.
+>
+> `체크아웃`이란, 일을 마칠 때 **내가 오늘 한 일**과, **다음 체크인 시 할 일들**을 체크아웃 시간과 댓글로 함께 남겨 놓는 겁니다.
+> 이렇게 하면 수시로 채널에 **우리 팀원들이 무얼 하고 있는지 실시간으로 파악할 수 있다**는 장점과, 팀원이 체크인했을 때 내가 궁금한 질문을 물어보면, 답변을 빠르게 받을 수 있는 확신,
+>
+> 마지막으로 나 뿐만 아니라 다른 팀원들도 정말 열심히 하고 있구나 라는 **동기부여**를 얻을 수 있습니다.
+
+```markdown
+예시) 슬랙 : 체크인/체크아웃 채널 - devFancy
+체크인: 21:30
+오늘 할일(목표)
+- [x] 프로필 등록 기능 구현 => 완료 O
+- 프로필 조회 기능 구현 => 완료 X
+
+체크아웃: 23:30
+```
+
+이러한 제안을 팀원 모두가 수락하고, 도입하면서 2달 동안은 정말 모두가 열심히 수행해줬다.
+덕분에, 슬럼프를 깨고 열정적으로 팀 프로젝트에 임했다.
+물론, 매번 히빗 프로젝트에서 작업할 때마다 체크인-체크아웃 채널에 무얼 하고 있는지 작성하는 게 귀찮을 때도 있다.
+하지만 돌이켜봤을 때, 지난 과거에 내가 무얼 했는지 알 수 있는 증명할 수 있는 자료라서, 주간 회의 때 다른 팀원이 무엇을 했는지 참고할 수 있게 되었다.
+
+
+
+11월에는 한국대학생IT경영학회에서 초청을 받아, 28기 학회원들과 함께 우리 서비스에 대한 **소개와 회고**를 공유하는 소중한 시간을 가졌다.
+
+
+
+처음에는 우리 팀의 기획자 JM님이 히빗 서비스에 대한 간략한 소개를 진행했고, 그 후에는 토크 세션(토크쇼 30분 + 현장 질의응답 5분) 시간을 가졌다.
+이 때, 사전에 준비한 질문들에 대해 우리 팀원들이 번갈아가면서 답변을 드렸고, 프로젝트와 관련된 현실적인 조언들을 최대한 많이 공유하려고 노력했다.
+나는 학회원분들에게 백엔드 개발자에서 중요한 부분들과 기록의 중요성에 대해 이야기를 했다. 생각보다 듣는 사람들이 많아서 나도 모르게 긴장해버렸고, 너무 긴장한 나머지 말을 조금 빠르게 한 것 같아서 조금 아쉽긴 했다.
+
+히빗 팀프로젝트를 하면서 기술과 협업에 대한 다양한 경험을 쌓았다. 그러나 예상과 달리 프로젝트는 **계획대로 진행되지 않았다.**
+초기 목표는 **3개월 이내로 개발을 완료**하고 7월에 런칭하는 것이었다.
+하지만 각 개인의 일정을 고려하고 존중하는 데 많은 시간을 할애하다 보니 런칭 일정이 미뤄지게 되었고, 결과적으로 **8개월이라는 긴 시간이 소요되었다.**
+만일 초기 3월로 돌아갔더라면, 모두가 3개월 동안 몰입해서 신속하게 MVP를 개발하고 빠르게 런칭을 했을 것이다.
+그럼에도 불구하고 이번 경험은 계획대로 진행하지 못한 실패를 통해 얻은 귀중한 경험이였다.
+성공적인 경험보다는 실패를 했지만, 이를 통해 다음 팀 프로젝트에서 더 강하고 효과적으로 진행할 수 있게 해준 값진 경험이였다고 생각한다.
+
+모든 경험이 성공이 아니더라도 **실패로부터 배우는 것**이 중요하다는 생각이 들었다.
+이번 프로젝트에서의 실패는 **다음에 더 나은 결과를 이끌어 내기 위한 강력한 학습 기회**로 삼을 수 있었다.
+이 자리를 빌려, 히빗 팀 모두에게 고생하셨다는 큰 감사의 인사를 전하고 싶다.👏🏻.
+
+### 우아한스터디
+
+
+
+10월 초에 `우아한스터디 2023 겨울 시즌`이 시작되었다는 걸 메일을 통해 알게 되었다.
+이 당시에 9월 27일까지 굿프렌즈 프로젝트에 대한 공식 일정을 마쳤지만, 프로젝트에서 구현된 코드에 대해 개인적인 아쉬움이 있었다.
+그래서 기존 코드를 좋은 코드로 리팩터링하는 경험을 쌓고 싶었는데, 우연한 타이밍에 우아한스터디가 열리게 된 것이였다.
+
+
+
+여러 스터디 주제 중에 나에게 딱 맞는게 **'내 코드가 그렇게 이상한가요?'** 였다.
+`대상`에 나와있는 내용이 나의 상황과 매우 부합하다고 생각했고, 무엇보다도 우아한스터디라는 기회를 놓치고 싶지 않았다.
+사실 이전 2023 여름 시즌도 관심있게 봤었지만, 그 당시에는 우리FISA와 히빗 프로젝트를 하느라 시간이 안될 것 같아서 신청하지 못했다.
+
+10월 초에는 우리FISA와 굿프렌즈 프로젝트도 끝났고 히빗 프로젝트도 거의 마무리된 상태였기 때문에, 꼭 지원해봐야 겠다는 생각이 들었고, 지원서를 누구보다 열심히 작성했다.
+그 결과, 정말 운이 좋게도 합격하게 되어 11월부터 12월까지 2달 간 스터디에 참여할 수 있었다.
+
+11월 한 달간은 '내 코드가 그렇게 이상한가요?' 책을 읽으면서 궁금한 점들을 슬랙을 통해 스레드로 남기고, 스터디 당일에 참여하는 구성원분들과 토론하는 시간을 가졌다.
+나는 매주 정해진 챕터를 읽으면서 기억에 남거나 중요한 내용을 [GoodGode](https://devfancy.github.io/category/#GoodCode)라는 카테고리로 분류해서 블로그에 정리했다.
+
+12월에 나는 책에서 배운 내용을 기반으로 이전에 구현했던 코드에 대해 리팩터링을 하는 시간을 보냈다.
+스터디 당일에는 나처럼 리팩터링한 결과물(코드)에 대해서 다른 구성원분들은 어떻게 생각하시는지 토론하는 시간을 갖거나 자유 주제로 평소 궁금한 질문들에 대해 편하게 얘기하는 시간을 가졌다.
+
+팀 프로젝트를 진행했을 당시에는 주어진 요구사항을 맞추는 것 대비하여 시간이 너무나도 부족했기 때문에 구현에만 초점을 맞춰서 코드가 그리 좋지 못했다.
+그래서 리팩터링했을 때에는 내가 구현했던 것 뿐만 아니라 팀원이 구현했던 코드에 대해서도 같이 진행했다.
+
+스터디를 통해 나는 내가 기여한 것보다 더 많은 것을 배웠다고 생각한다.
+그래서 더더욱 해당 스터디에 합격해주신 운영진인 지훈님께 감사의 말씀을 전하고 싶다 🙇🏻♂️.
+
+한 가지 아쉬운 점은 내가 참여한 스터디는 온라인으로 진행했어서, 스터디에 참가했던 분들의 성함은 알지만 얼굴은 뵌 적이 없어서 친해지지 못했다는 거였다.
+그래도 해당 스터디 덕분에, 객체지향 설계에 대해 많은 인사이트를 얻었고, 앞으로 이런 스터디가 여러 곳에서 열린다면 또 참여해보고 싶다.
+
+### 글또(글쓰는 개발자 모임)
+
+
+
+11월에는 글또(글 쓰는 또라이가 세상을 바꾼다) 9기를 모집한다는 소식을 메일을 통해 알게되었다.
+이전부터 관심갔지만, 언제 모집할지 몰랐기에 미리 알림을 설정되도록 했다.
+지원서를 작성할 때, 가장 기억에 남는 건 `삶의 지도`였다.
+
+`삶의 지도`라는 것은 글또를 만드신 [성윤](https://zzsza.github.io/about/)님이 지은 이름이며, **'자신이 어떤 사람이고 어떤 성격을 가지고 있고, 어떤 사건으로 지금의 내가 되었는가'** 에 대해 작성하는 내용이다.
+삶의 지도를 작성할 때는 '나'라는 인물이 어떤 사람인지 보여주기 위해 내가 여지껏 살아오면서 어떻게 지냈는지 정말 솔직하고 담백하게 작성했다.
+내가 글또 9기 지원서에 작성했던 삶의 지도에 대한 글은 조금씩 다듬은 뒤에 나중에 블로그에 업로드할 예정이다. (현재는 개인 노션에 보관해두고 있다)
+
+글또를 지원한 이유는 크게 2가지였다.
+하나는 지난 1년간 혼자서 개인 블로그를 운영하면서, '내가 이제껏 작성하고 업로드한 글이 과연 좋은 글인가?'에 대해 의구심이 들었다.
+이러한 부분을 글또에 계신 분들로부터 조언을 얻고자 했고, 개인적으로 글을 잘 쓰는 능력을 향상시키고자 했다.
+다른 하나는 개발에 열정을 품은 다양한 사람들을 만나보고 싶었다.
+지금까지 대학교나 소속된 그룹에서는 개발에 진심인 사람들과 충분히 소통하진 못했다.
+글또를 통해 오프라인에서 다양한 분들과 만나 커피챗을 나누는 경험을 통해 인맥을 넓히고, 새로운 시각과 지식을 얻고자 했다.
+
+정리하면, 글또에 참여하는 목표는 글쓰기 능력 향상과 함께, 다양한 개발 열정을 품은 분들과 소통하며 인맥을 쌓는 것이다.
+
+현재는 글또 9기에 활동하면서, 2주에 한 번씩 포스팅를 업로드하고 있다.
+이전과 다른 점은 글또에 제출하는 포스팅은 다른 포스팅에 비해 훨씬 더 시간 투자를 많이했고, 그만큼 **High-Quality** 있는 내용으로 채웠다. 또한 보는 사람이 이해하기 쉽도록 작성하려고 노력했다.
+
+> 지난 한 달간 글또에 제출한 포스팅
+>
+> 1. [Practical Testing: 테스트 코드 작성 방법](https://devfancy.github.io/Practical-Testing/)
+>
+> 2. [Practical Testing: 테스트 코드 작성 방법 - Mock, 더 나은 테스트를 위한 구체적 조언](https://devfancy.github.io/Practical-Testing2/)
+
+앞으로도 글또 9기 활동을 하면서, 최대한 많은 경험을 해보려고 한다.
+이 자리를 빌려, 글또라는 모임을 만들어주신 성윤님께 감사의 말씀 전합니다 😌.
+
+## 블로그
+
+
+
+2023, 올 한 해동안 개인 블로그에 총 **186**(이 포스팅은 제외한)개의 포스팅을 업로드했다.
+
+블로그를 어떻게 운영해야 할지 몰라서 상반기에는 내가 공부한 내용을 정리하는 걸 위주로 업로드했다.
+그러다가 하반기 11월에 [함께 자라기](https://devfancy.github.io/Book-Growing-Up-Together/) 라는 책을 읽으면서 `의도적 수련`을 알게되면서 '내가 지금까지 정리한 대부분이 **인풋**만 있었구나' 라는 걸 알게되었다.
+
+> `의도적 수련`이란 자신의 기량을 향상시킬 목적으로 반복적으로 하는 수련
+
+그래서 강의/책에서 공부한 내용을 정리해서 블로그에 업로드하는 것도 좋지만,
+가끔은 사이드 프로젝트에 적용한 내용을 추가한, 즉 **인풋 뿐 아니라 아웃풋까지 있는 이어나가는 과정과 결과의 내용이 담긴** `포스팅`을 업로드했다.
+
+## 2024년 목표
+
+내년 2024년은 어떻게 지낼지 알 수 없지만, 적어도 이루고자 하는 목표를 명확히 작성하려고 한다.
+
+### 알고리즘 실력 키우기
+
+지난 1년간 코딩테스트를 풀었지만, 생각보다 Program solving 실력이 좀처럼 성장하지 않는 것 같다.
+백준에 있는 [solved.ac - CLASS](https://solved.ac/class?class=4) 에서 적어도 4단계(CLASS 4++)까지는 풀 수 있는 수준으로 높이고자 한다.
+2024년 말이 될 때 쯔음에는 '이제 알고리즘 문제 두렵지 않네'라는 느낌을 받고 싶다.
+
+> 2024.04 ~
+
+* 2024년 4월 이후 부터는 [LeetCode](https://leetcode.com/problemset/) 에서 나오는 문제로 풀기 시작했다.
+
+### 부족한 부분 채우기
+
+올해 초에 '신입 개발자를 위한 CS 스터디 모임'을 상반기에 진행했지만, 하반기에 복습을 안해서 그런지, 일부 개념들에 대해 많이 까먹었다.
+꾸준히 시간 날 때마다 복습해 가면서, 추가적으로 부족한 부분을 채우고자 한다.
+
+- Kotlin, Java, Gradle
+- Spring Mvc, Spring Webflux, Spring Boot, Spring Cloud Gateway, Spring Cloud Config
+- JPA/Hibernate, MySQL, MongoDB, Redis, Zookeeper
+- Kubernetes** + Istio, GoCD, ArgoCD, Consul, Vault, Git, Docker, Ceph, Harbor
+- Kafka**, ELK, Prometheus + Thanos, Grafana
+
+위에는 내가 개인적으로 가고 싶어하는 회사의 공고에서 가져온 기술들이다. 한 번에 공부하는 것보다 한 개씩 깊게 공부하면서 지식의 폭을 넓혀가고자 한다.
+위에 있는 기술들과 함께 백엔드 & CS 지식을 탄탄히 만들고자 아래와 같이 학습을 병행하려고 한다.
+
+> * Spring + JPA: 인프런 김영한님의 [로드맵](https://www.inflearn.com/roadmaps/149) - Spring DB, Spring Data JPA, QueryDSL 강의 시청 및 개인/회사 프로젝트에 적용
+> * MySQL: ['Real MySQL' 8.0](https://product.kyobobook.co.kr/detail/S000001766482)
+> * 객체지향: [이펙티브 자바 Effective Java 3/E](https://m.yes24.com/Goods/Detail/65551284)
+> * 설계: [가상 면접 사례로 배우는 대규모 시스템 설계 기초](https://product.kyobobook.co.kr/detail/S000001033116)
+
+물론, 직장 생활과 병행하며 위의 강의와 책들을 모두 완독하는 것은 쉽지 않을 수 있다. 또한, 내년 상황에 따라 위의 학습 자료가 아닌 새로운 학습 자료가 필요해질 가능성도 있다.
+하지만 현재 기준으로 학습 목표를 설정해 두었으며, 유연하게 조정해 나가며 지속적으로 발전하고자 한다.
+
+### 런칭 & 서비스 운영
+
+2023년에 히빗 프로젝트를 Version2로 새롭게 개발하여 런칭하고자 한다.
+이 도전적인 결정은 글또의 12월 31일에 개최된 월간-메이커스' 이벤트에서 히빗 프로젝트를 소개한 결과 나온 것이다.
+모임 참석자들이 우호적인 피드백을 주셨고, 런칭을 권장하는 의견이 많았다.
+그 동안의 노력과 열정을 지지해 주신 분들의 도움으로 런칭을 결심하게 되었다.
+
+현재까지의 히빗 프로젝트는 AWS EC2 인스턴스 t2.micro를 이용한 백엔드와 Vercel로 호스팅된 프론트엔드로 구성되어 있다.
+
+새로운 버전에서는 실제 유저들이 원활하게 사용할 수 있도록 고려하여 설계를 새롭게 구성하고자 한다.
+확장성 있는 설계와 더 높은 코드 품질을 추구하기 위해 기존 코드를 마이그레이션하고 리팩터링할 예정이었으나, 기존 코드의 상태가 예상보다 좋지 않아서 기존 팀원들의 합의를 얻는 것이 어려웠다.
+따라서 기존 프로젝트는 그대로 유지하면서, 새로운 레포지토리를 생성하여 프로젝트를 개발하고자 한다.
+
+이 새로운 시작을 통해 최소 6개월 동안 서비스 운영 경험을 쌓고, 사용자들에게 높은 품질의 서비스를 제공하고자 한다.
+
+### 인풋 뿐 아니라 아웃풋까지 하기
+
+무작정 강의를 듣는다고 실력이 좋아지진 않는다. 강의를 듣는 걸 넘어서 실전에 적용하는 경험과 그러한 내용을 간단하게라도 정리해야 내것이 된다.
+
+그래서 내년에는 정말 필요하다고 생각한 강의를 듣고, 듣고 난 이후에는 토이 프로젝트 혹은 기존 사이드 프로젝트에 적용까지 해보는 경험을 하자.
+
+기술/언어적인 부분 내용도 좋지만, 가끔씩은 일상/생각에 대한 글이라든지, 취준에 대한 글도 작성하면서 생각의 스펙트럼을 넓히도록 하자.
+
+## 2023년 Bye.
+
+2023년을 정말 쉴 새 없이 보내면서, 1년이라는 시간이 정말 빠르게 흘러갔다.
+이는 나 자신이 개발에 몰입했다는 명확한 증거일 것 같다.
+
+올해에는 성공과 실패를 경험하며, 부족한 부분과 개선할 점에 대해 깊게 고민할 수 있었다.
+
+이러한 다양한 경험을 토대로 앞으로도 더 나은 개발자로 성장하기 위해 꾸준히 공부해 나가야겠다는 결심을 하게 되었다.
+
+2023년을 통해 얻은 교훈을 바탕으로, 앞으로도 건강하게 지내면서 꾸준하게 발전해 나가고자 한다.
+
+----
+
+글을 작성하는데 걸린 시간: 약 12시간
+
+* 맞춤법 수정, 자연스러운 문장이 되도록 문맥 정리: 2시간 (2024년 이후 퇴고하면서 1시간 추가)
+
+* 글 작성: 11시간
\ No newline at end of file
diff --git a/src/content/posts/2024-DevHistory.md b/src/content/posts/2024-DevHistory.md
new file mode 100644
index 00000000..0185bd31
--- /dev/null
+++ b/src/content/posts/2024-DevHistory.md
@@ -0,0 +1,186 @@
+---
+title: "2024 Dev History"
+date: 2024-01-01
+categories: ["회고"]
+tags: ["개발기록"]
+---
+
+> 2024 Dev History
+
+* [2023 Dev History](https://devfancy.github.io/2023-DevHistory/)에 이어 2024년에도 내가 공부하면서 배운 내용을 꾸준히 기록해두자.
+
+## Plan
+
+* [2024 Plan Note](https://gist.github.com/devFancy/69dd0f78f039f8ee2fb6fdfde88c959f)
+
+
+
+> 인프런 강의: [우아한형제들 최연소 기술이사 김영한의 스프링 완전 정복](https://www.inflearn.com/roadmaps/373)
+
+* [스프링 MVC 2편 - 백엔드 웹 개발 활용 기술](https://www.inflearn.com/course/스프링-mvc-2/dashboard)
+
+* [스프링 DB 1편 - 데이터 접근 핵심 원리](https://www.inflearn.com/course/스프링-db-1/dashboard)
+
+> 인프런 강의: [김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵](https://www.inflearn.com/roadmaps/149)
+
+* [실전! 스프링 데이터 JPA](https://www.inflearn.com/course/스프링-데이터-JPA/dashboard)
+
+* [실전! Querydsl](https://www.inflearn.com/course/querydsl-실전)
+
+> 인프런 강의: Kotlin
+
+* [자바 개발자를 위한 코틀린 입문](https://www.inflearn.com/course/java-to-kotlin/dashboard)
+
+* [실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)](https://www.inflearn.com/course/java-to-kotlin-2/dashboard)
+
+> 서버 개발과 관련된 책
+
+* [가상 면접 사례로 배우는 대규모 시스템 설계 기초](https://product.kyobobook.co.kr/detail/S000001033116)
+
+* [Good Code, Bad Code](https://product.kyobobook.co.kr/detail/S000061353995)
+
+> 개인 프로젝트: Hibit (version 2)
+
+* [[Hibit] (ver.2) - Github](https://github.com/hibit-team/hibit-backend-improved) : 기존 version1 에 개발했던 백엔드 코드와 구조를 개선하기 위해 version2로 디벨롭시킨 프로젝트
+
+## A Weekly Record
+
+### January to June
+
+> 240101 ~ 240107
+
+* [[Programmers] 전력망을 둘로 나누기](https://junyongmoon.notion.site/af1c0d3dfe0a41638a1197f8633cd5e7)
+
+* [[Programmers] SQL - Join 문제](https://devfancy.github.io/SQL-Join/) - 오랜 기간 보호한 동물(1), 없어진 기록 찾기(1), 있었는데요 없었습니다, 주문량이 많은 아이스크림 조회하기
+
+> 240108 ~ 240114
+
+* [Spring MVC 2편] 파일 업로드, 다운로드 강의 수강
+
+* [[Spring DB 1편] JDBC 라이브러리를 이용하여 CRUD 구현하기](https://devfancy.github.io/Spring-DB-JDBC/)
+
+> 240115 ~ 24021
+
+* [[백준] 13565. 침투](https://devfancy.github.io/Algorithm-backjoon-13565/) 복습
+
+* [[백준] 4963. 섬의개수](https://devfancy.github.io/Algorithm-backjoon-4963/) 복습
+
+* [[백준] 1388. 바닥장식](https://devfancy.github.io/Algorithm-backjoon-1388/) 복습
+
+* [[백준] 16173. 점프왕 쩰리 (Small)](https://devfancy.github.io/Algorithm-backjoon-16173/) 복습
+
+* [[Spring DB 1편] 커넥션 풀과 데이터소스 이해](https://devfancy.github.io/Spring-DB-ConnectionPool-DataSource/)
+
+* [[Spring DB 1편] 트랜잭션 이해, 스프링과 문제 해결](https://devfancy.github.io/Spring-DB-Transaction/)
+
+* [[TestCode] 좋은 단위 테스트란? (feat. 히빗)](https://devfancy.github.io/Hibit-SpringBoot-TestCode-Unit/)
+
+* [[TestCode] Spring Boot 기반 통합 테스트와 슬라이스 테스트: 효과적인 레이어별 코드 검증 방법](https://devfancy.github.io/SpringBoot-TestCode-Integration-Testing/)
+
+* [[Hibit] Gradle 프로젝트에 Jacoco 설정하기: 코드 커버리지 80%](https://devfancy.github.io/Hibit-SpringBoot-Gradle-Test-Jacoco/)
+
+* [[Technology] 성능 테스트, 부하 테스트, 스트레스 테스트란](https://devfancy.github.io/Technology-Performance-Testing/)
+
+> 240122 ~ 240128
+
+* [[Hibit] JMeter를 활용한 성능 테스트 도입](https://devfancy.github.io/Hibit-Performance-Testing/)
+
+* [[Hibit] 동시성으로 인한 데이터 정합성 문제를 쿼리를 통해 해결](https://devfancy.github.io/Hibit-Concurrency-Problem-Solving/)
+
+* [[JPA] @EntityGraph 을 이용하여 조회 성능 개선하기](https://devfancy.github.io/JPA-EntityGraph/)
+
+* [[Hibit] 조회수 어뷰징 방지를 위한 쿠키 기반 로그 관리](https://devfancy.github.io/Hibit-ViewManager-Abusing/)
+
+> 240129 ~ 240204
+
+* [[Technology] 우아한테크토크 - 선착순 이벤트 서버 생존기! 47만 RPM에서 살아남다?!](https://devfancy.github.io/Technology-Woowa-Tech-Talk-First-Come-First-Served-Event/)
+
+* [[Hibit] 히빗 V2 업그레이드: 백엔드 개선과 개발자 성장기](https://devfancy.github.io/Hibit-Retrospective/)
+
+> 240205 ~ 240211
+
+* [[글또 9기] 나만의 글쓰기 파이프라인](https://devfancy.github.io/Technical-Writing-Seminar-Review/)
+
+* [[개인 프로젝트] Hibit (ver.2) - 테스트 격리를 위한 문제 해결(PR)](https://github.com/hibit-team/hibit-backend-improved/pull/56)
+
+> 240226 ~ 240303
+
+* [[Hibit] Swagger에서 Spring Rest docs로 전환하기: 이유, 개념, 그리고 적용 가이드](https://devfancy.github.io/Hibit-Spring-Rest-Docs/)
+
+> 240311 ~ 240317
+
+* [Kotlin] 자바 개발자를 위한 코틀린 입문 강의 - [정리](https://github.com/devFancy/kotlin-practice/tree/main/java-to-kotlin)
+
+ * 섹션1. 코틀린에서의 변수와 타입, 연산자를 다루는 방법
+
+ * 섹션2. 코틀린에서 코드를 제어하는 방법
+
+ * 섹션3. 코틀린에서의 OOP
+
+ * 섹션4. 코틀린에서의 FP
+
+> 240318 ~ 240324
+
+* [Kotlin] 실전! 코틀린과 스프링 부트 실습 강의 - [정리](https://github.com/devFancy/kotlin-practice/tree/main/library-app)
+
+ * 섹션1. 도서관리 애플리케이션 리팩토링 준비하기
+
+ * 섹션2. Java 서버를 Kotlin 서버로 리팩터링하자!
+
+ * 섹션3. 첫 번째 요구사항 추가하기 - 책 분야 (Enum 활용)
+
+ * 섹션4. 두 번째 요구사항 추가하기 - 도서 대출 현황 (N+1 문제 해결)
+
+> 240325 ~ 240331
+
+* [[Retrospective] 2024년 1분기 회고. 배움의 여정과 새로운 도약](https://devfancy.github.io/1th-Retrospective/)
+
+> 240429 ~ 240505
+
+* [[E.T.C] 글또 9기 회고. 5개월간 활동한 여정](https://devfancy.github.io/Geultto-9th-Retrospective/)
+
+> 240621
+
+* [[Linux] /dev/null 2>&1 이란](https://devfancy.github.io/Linux-devnull/)
+
+### July to December
+
+> 240819 ~ 240825
+
+* [[Flyway] Flyway와 Hibernate로 변화하는 스키마의 효율적 관리 및 마이그레이션 전략을 적용하기.](https://devfancy.github.io/flyway-db-migration/)
+
+> 240902 ~ 240908
+
+* [[좋은 코드, 나쁜 코드] Part1. 이론(코드 품질, 추상화)](https://github.com/devFancy/kotlin-java-playground/blob/main/book/GoodCode-BadCode/GoodCode-BadCode-1.md)
+
+> 240909 ~ 240915
+
+* [[LeetCode] 32. Implement Queue using Stacks](https://devfancy.github.io/LeetCode-232-Implement-Queue-using-Stacks/)
+
+> 240916 ~ 240922
+
+* [[LeetCode] 383. Ransom Note](https://devfancy.github.io/LeetCode-383-Ransom-Note/)
+
+> 2401021 ~ 241027
+
+* [[Retrospective] 2024년 3분기 회고. 우선순위를 정하고 균형 있게 성장하기](https://devfancy.github.io/3th-Retrospective/)
+
+> 241028 ~ 241103
+
+* [[Technology] 성능 개념 및 주요 병목 지점, 성능 테스트 학습](https://devfancy.github.io/Performance-Concept/)
+
+> 20241104 ~ 20241110
+
+* [[Technology] 부하테스트 - K6 도구 소개](https://devfancy.github.io/Spring-Performance-K6/)
+
+> 20241118 ~ 20241124
+
+* [[Technology] 2024 당근 테크 밋업 - 메모 및 후기 (SERVER)](https://devfancy.github.io/Technology-Daanggn-Tech-MeetUp-2024/)
+
+> 20241209 ~ 20241215
+
+* [[SpringBoot] Kotlin, SpringBoot 기반으로 멀티 모듈 설계와 적용하기](https://devfancy.github.io/SpringBoot-Multi-Module/)
+
+> 20241231
+
+* [[Retrospective] 2024년 회고 (+2025년 계획)](https://devfancy.github.io/2024-Retrospective/)
\ No newline at end of file
diff --git a/src/content/posts/2024-Retrospective.md b/src/content/posts/2024-Retrospective.md
new file mode 100644
index 00000000..2794ae92
--- /dev/null
+++ b/src/content/posts/2024-Retrospective.md
@@ -0,0 +1,521 @@
+---
+title: "2024년 회고"
+date: 2024-12-31
+categories: ["회고"]
+tags: []
+---
+
+올해 2024년은 작년(2023)보다 더 빠르게 흘러간 느낌이다.
+
+작년 [2023년 회고](https://devfancy.github.io/2023-Retrospective/) 에도 많은 활동을 했지만, 글에 모두 포함해서 작성하느라 힘들었다.
+
+그래서 이번 2024년에는 여러 가지로 한 것들이 많아서 분기별로 회고를 작성했다.
+
+* [2024년 1분기 회고. 배움의 여정과 새로운 도약](https://devfancy.github.io/1th-Retrospective/)
+
+* [2024년 3분기 회고. 우선순위를 정하고 균형 있게 성장하기](https://devfancy.github.io/3th-Retrospective/)
+
+이번 글은 위에서 언급한 내용도 있고, 언급하지 않은 내용도 있어서 전반적으로 글을 작성하고자 한다.
+
+
+
+---
+
+## 2024년 한해동안 했던 일들
+
+* (1) 회사
+
+* (2) 사이드 프로젝트
+
+* (3) 글또 9기, 10기
+
+* (4) TIL
+
+* (5) 기술 스터디
+
+* (6) 집필
+
+* (7) SIPE 3기
+
+* (8) LeetCode
+
+* (9) KPT 회고
+
+* (10) 연말에 자기 자신에게 꼭 해봐야 할 질문
+
+---
+
+### 회사
+
+* 회사에서 여러 가지 기술적 경험을 하게 되었다. 현재의 회사에서는 Java/Spring 기반의 기술을 주로 사용하지만, 최근에는 Kotlin 언어를 공부하면서 신규 프로젝트에 적용해보고자 한다.
+
+* 그 외에도 개발하면서 필요한 기술인 Linux, Shell script, Docker, Redis에 대해서도 지식 뿐만 아니라 기술적인 경험을 하게 되었다.
+
+* 2025년에는 Redis 뿐만 아니라 Kafka에 대해서도 기술 스터디를 통해 학습해나갈 예정이고, 기회가 된다면 프로젝트에 적용해보고자 한다.
+
+ * Kafka 에 대한 학습은 [카프카 핵심 가이드](https://product.kyobobook.co.kr/detail/S000201464167) 라는 책을 읽어보면서 개념을 학습하고, 회사에 적용하기 이전에 개인적으로 실험을 해보면서 더 깊은 이해와 경험을 하고자 한다.
+
+* 그리고 개발 외에도 문서 작업에 대해서도 새로 알게 되었다. 개발도 중요하지만, 문서 역시 중요하다는 사실을 알게되었다. 문서 작성할 때 도움되었던 글은 아래와 같다. (오래된 순으로 정렬)
+
+ * [[뱅크샐러드] 뱅크샐러드의 특별한 스펙, '테크 스펙'](https://blog.banksalad.com/tech/we-work-by-tech-spec/)
+
+ * [[뱅크샐러드] 테크스펙은 문서가 아니다](https://blog.banksalad.com/tech/techspec-is-not-doc/)
+
+ * [[컬리] 팀을 더욱 유연하게 만들어가는 힘](https://helloworld.kurly.com/blog/squad-b-team-building/#지식을-맞추어-가는-무리)
+
+ * [[우아한형제들] 이벤트 스토밍 인 액션: 이벤트 스토밍 소개와 적용 방법](https://www.youtube.com/watch?v=gihxS6eE1DM&ab_channel=우아한테크)
+
+ * (추가) [[우아한형제들] DDD 그거 그렇게 하는거 아닌데](https://www.youtube.com/watch?v=sLG5n_pXWK0&ab_channel=우아한테크)
+
+* 회사에서 개발을 하면서 그때마다 배운 기술들을 노션에 정리해나갔다. 내년에는 배운 기술 중에 유의미한 부분이 있는 내용들은 Public 한 곳에 올려보고자 한다.
+
+
+---
+
+### 글또 9기, 10기
+
+* 글또 9기가 2024년 4월에 끝난 뒤에, 글또 10기는 2024년 10월부터 내년(2025년) 3월까지 진행을 마지막으로 마지막 기수 모집을 했다.
+
+* 이전 글또 9기를 참가하면서 개인적으로 느끼는 부분이 글을 작성하는 방법 외에도 삶의 여러가지로 도움되는 부분이 많아서 지원하게 되었다. 그리고 마지막 기수이니 만큼 아쉬운 부분도 있는 마음도 컸다.
+
+* 글또 9-10기를 통해 IT 업계의 다양한 분들을 만나게 되었고, 어느덧 내 삶에 글또의 여러 좋은 분들이 들어오게 되었다. 글또에서 내가 참여했던 다양한 활동은 다음과 같다.
+
+ * 기술 적인 것 - 글쓰기 세미나, TIL 모임(6개월 진행), 포폴-이력또(1개월 진행), 백엔드 스터디(좋은코드 나쁜 코드, 대규모 시스템 설계 기초 1편), 월간 메이커스
+
+ * 기술 외의 것 - 백엔드인프라 준비위원회, 몸또, 책이좋았또, 관악또, 뮤직스타또, 넥스또, 미룬이챌린지 등등
+
+* 저번 기수에 이어, 이번 10기는 마지막인 만큼 추가된 것들이 많았다. 그 중에서 `또봇`의 기능에 대해 흥미가 있어서 나중에 해커톤 대회가 있으면 해당 기능을 직접 개발해보고자 한다.
+또한, 글을 제출할 때마다 100점(+알파) 포인트가 쌓여가는데 현재 시점에서 활동의 절반이 지나갔는데, 앞으로 남은 3개월 동안 꾸준히 글을 작성해서 3,000점을 달성해보고자 한다.
+
+
+
+* 추가적으로, 감사한 마음을 종이 비행기로 전하는 `종이비행기` 기능도 기획부터 디자인까지 사용자 입장에서 매우 만족스러웠다.
+
+
+
+* 글또를 진행하면서 관련 글은 아래와 같다. (최신순으로 정렬)
+
+ * [글또 9기 회고. 5개월간 활동한 여정](https://devfancy.github.io/Geultto-9th-Retrospective/)
+
+ * [[글또 9기] 나만의 글쓰기 파이프라인](https://devfancy.github.io/Technical-Writing-Seminar-Review/)
+
+* 크리스마스에는 솔로분들끼리 모임을 가지면서, `2024 한해 KPT 회고`와 `2025 멀티 버스`를 진행했다. 이 부분에 대한 자세한 내용은 아래 `KPT 회고`와 `2025 멀티버스` 파트에 작성했다.
+
+
+
+
+---
+
+### 사이드 프로젝트
+
+* 2024년 2월까지 개인적으로 진행한 히빗에 대해서는 " [[Hibit] 히빗 V2 업그레이드: 백엔드 개선과 개발자 성장기](https://devfancy.github.io/Hibit-Retrospective/) " 글에 작성했기 때문에, 해당 프로젝트와 관련된 글(링크)만 남기고자 한다. (최신순으로 내림차순)
+
+ * [[Hibit] Swagger에서 Spring Rest docs로 전환하기: 이유, 개념, 그리고 적용 가이드](https://devfancy.github.io/Hibit-Spring-Rest-Docs/)
+
+ * [[Hibit] 조회수 어뷰징 방지를 위한 쿠키 기반 로그 관리](https://devfancy.github.io/Hibit-ViewManager-Abusing/)
+
+ * [[Hibit] 동시성으로 인한 데이터 정합성 문제를 쿼리를 통해 해결](https://devfancy.github.io/Hibit-Concurrency-Problem-Solving/)
+
+ * [[Hibit] JMeter를 활용한 성능 테스트 도입](https://devfancy.github.io/Hibit-Performance-Testing/)
+
+ * [[Hibit] Gradle 프로젝트에 Jacoco 설정하기: 코드 커버리지 80%](https://devfancy.github.io/Hibit-SpringBoot-Gradle-Test-Jacoco/)
+
+ * [[Hibit] 좋은 단위 테스트란?](https://devfancy.github.io/Hibit-SpringBoot-TestCode-Unit/)
+
+---
+
+### TIL
+
+* TIL 모임은 글또 9기에서 NY님이 만드신 스터디 모임인데, 간단히 말하자면 본인이 배운 내용을 간단히 정리해서 매일 꾸준히 인증하는 모임이다.
+
+* 그리고 2주에 한 번, 온라인으로 1시간 동안 회고를 작성하는 시간을 진행했다.
+이전 2024년 1분기 회고에도 언급했지만, 끝맺음이 완성되지 못해서 그 이야기를 말하고자 한다.
+
+* 2023년 12월부터 시작해서 2024년 6월 말에 끝을 맞이하게 되었는데, 스터디 마지막까지 모두 열심히 인증을 올려주셨다.
+해커톤 대회에 나가서 상을 받으신 분도 있으셨고, 취업에 성공하신 분도 계셔서 모두 축하를 했다.
+
+
+
+* 해당 모임은 인원이 많은 관계로 온라인으로 진행했고, 스터디가 끝나고 난 이후에 강남의 오프라인 모임을 가지면서 재밌는 네트워킹 시간도 보냈다. ✨
+
+
+
+(스터디가 끝난 이후에도 8월까지 `인증은-계속된다` 채널에 계속 진행하긴 했는 사실은 비밀)
+
+
+---
+
+### 기술 스터디
+
+> 아래는 작년 2023년 회고글의 마지막 부분인 [2024년 목표](https://devfancy.github.io/2023-Retrospective/#2024년-목표)에 정리했던 걸 가져왔다.
+
+
+
+
+---
+
+* 위 사진에서 말한것 처럼 현재의 상황에서 필요한 기술들, 그리고 내가 가고자 하는 회사에서 사용하는 기술을 학습하는 것이 목표였다.
+그래서 위의 기술들 중에서 올해 학습한 것은 아래에 키워드로 정리했고, 해당 관련 글 or 깃허브 링크를 남겼다.
+
+> 크게 키워드로 구분하면 `코드`, `설계`, `성능 테스트` 이다.
+
+* 코드 - 자바/코틀린
+
+ * 인프런 강의 'Practical Testing: 실용적인 테스트 가이드' 듣고 정리
+
+ * [[블로그] 1부: Practical Testing: 테스트 코드 작성 방법](https://devfancy.github.io/Practical-Testing/)
+
+ * [[블로그] 2부: Practical Testing: 테스트 코드 작성 방법 - Mock, 더 나은 테스트를 위한 구체적 조언](https://devfancy.github.io/Practical-Testing2/)
+
+ * 강의 듣고 실습한 [깃허브 링크](https://github.com/devFancy/cafekiosk)
+
+ * 인프런 강의 '자바 개발자를 위한 코틀린 입문' 듣고 정리 - [깃허브 링크](https://github.com/devFancy/kotlin-java-playground/tree/main/java-to-kotlin)
+
+ * 인프런 강의 '실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)' 듣고 정리 - [깃허브 링크](https://github.com/devFancy/kotlin-java-playground/tree/main/library-app)
+
+ * 책 '좋은 코드, 나쁜 코드' 스터디 및 정리 - [깃허브 링크](https://github.com/devFancy/kotlin-java-playground/tree/main/book/GoodCode-BadCode)
+
+* 설계
+
+ * 책 '대규모 시스템 설계 기초 1편' 스터디
+
+ * [[블로그] 코틀린, 스프링 기반의 멀티 모듈 학습](https://devfancy.github.io/SpringBoot-Multi-Module/)
+
+ * 코틀린, 스프링 부트 기반의 멀티 모듈 실전 적용 - [깃허브 링크](https://github.com/devFancy/kotlin-springboot-multi-module)
+
+* 성능 테스트
+
+ * [[블로그] 성능 개념 및 주요 병목 지점, 성능 테스트 학습](https://devfancy.github.io/Performance-Concept/)
+
+ * [[블로그] 부하테스트 - K6 도구 소개](https://devfancy.github.io/Spring-Performance-K6/)
+
+ * 스퍼트(스프링 퍼포먼트 트랙 스터디) 참여 - [깃허브 링크](https://github.com/sipe-team/3-1_spurt)
+
+
+---
+
+### 집필
+
+
+
+* 2023년 1월부터 12월까지 진행했던 스터디를 보고 출판사로부터 메일을 통해 집필 제안이 들어왔다. 그 당시에, 느꼈던 반응은 기쁨과 동시에 두려움이였다.
+
+* '내가 과연 집필할 자격이 있는 사람인가'를 두고 약 한 달 동안 고민하며 스스로 깊이 생각했다. 결론적으로 내가 내린 결정은 집필 제안을 받아들이기로 했다.
+집필에 참여해본 경험을 더 우선적으로 생각했고, 책에 대한 퀄리티는 최대한 노력해보자는 거였다. 쉽지 않은 기회인 만큼, 제안을 해주신 출판사 분들이 보기에도 만족할 정도의 책을 만들어볼 것이다.
+
+* 스터디에 참가했던 분들에게 집필 제안에 대한 내용을 공유한 결과, 나를 포함한 7명 모두가 참여하겠다고 했다. 그래서 계약 전에 간단히 샘플 원고를 작성해 보기로 했다.
+여기서부터 자잘한 문제들이 발생했다. 인원이 많은 만큼 일정 관리와 회의 시간, 의견을 정리하는 시간, 샘플 원고에 작성하고 피드백 보완 후 퇴고하는 시간 등 생각보다 작업이 오래 걸리게 되었다.
+
+* 해당 집필에 팀장 역할을 맡은 만큼 최대한 이성적으로 회의를 주도하면서, 가끔은 팀원분들에게 냉정한 말들을 한 내 자신이 밉기도 하고 스스로에 대한 부담감과 스트레스가 점점 쌓여만 갔다.
+그러한 부분들이 쌓이고 쌓여 결국엔 샘플 원고 작성 도중에 쓰러져서 응급실에 실려간 경우도 발생했다.
+
+* 그래서 현재 내가 처한 상황과 문제점들을 팀원들에게 공유했고, 여러 논의 끝에 그동안 '신뢰'를 기반으로 열심히 참여한 사람들과 효율성을 고려해 인원을 조정하기로 했다.
+인원을 추리는 과정 역시,나에게도 쉽지 않은 결정이었지만 출간의 퀄리티와 시간 효율성을 위해 불가피한 선택이었다. (구체적인 사정은 여기서 다 다루지 않지만, 신뢰와 효율성을 우선으로 판단했다)
+
+* 샘플 원고를 3개월간 진행한 끝에, 계약서를 진행하게 되었고 내년 하반기에 출간을 목표로 집필에 참여한 팀원들과 끝까지 최선을 다하기로 다짐했다.
+ 부족한 저를 믿고 함께해 준 팀원분들께 진심으로 감사드리고, 앞으로도 최선을 다하겠다. 🙏🏻
+
+---
+
+### SIPE 3기
+
+* 상반기에는 혼자서 기술 스터디를 하는 경우가 많았는데, 그 과정 속에서 한계가 있다는 걸 직감하고 하반기에는 같이 스터디를 하며 성장하는 것을 생각했다.
+
+* 마침 하반기에 IT 커뮤니티 동아리인 [SIPE](https://sipe.team/)에서 3기를 모집한다는 글을 보고, 망설임 없이 지원하게 되었다.
+ (SIPE는 이전 2기 사담콘을 통해 게스트로 참여하게 되면서 '언젠간 나도 지원해봐야겠다' 고 생각이 들었는데, 우연하게도 모집글이 나오면서 운명이라 생각했다)
+
+
+
+* 결론적으로 SIPE 3기에 최종 합격하게 되었고, 현재 2차 미션을 진행하면서 느낀 점은 내가 생각한 그 이상으로 많은 기술적인 영감과 지식을 축적하고 있다.
+이전 1차 미션에서는 스퍼트(스프링 퍼포먼스 트랙) 라는 주제로, 성능 테스트에 기반하여 관련 기술 지식과 실습 경험을 쌓았고 그것을 현재의 회사에 적용하는 경험까지 얻게 되었다.
+
+* 1달 가량 남짓 남았는데, 남은 기간동안에도 열심히 참여해서 나의 기술적 향상과 더불어, SIPE 동아리에도 도움이 되는 기여를 할 것이다.
+ (SIPE에 관심이 있는데 지원이 망설이신 분들이 계시다면, 저에게 메일 보내주시면 관련해서 도움 드릴 수 있는 부분을 공유하겠습니다.)
+
+> 아래는 3기 OT때 받았던 굿즈인데, 마음에 들어서 백팩에 끼워서 들고 다니고 있다. 🙂
+
+
+
+---
+
+### LeetCode
+
+
+
+* 개발 분야에서 내가 존경하는 멘토님이 운영하시는 LeetCode에 4월부터 참여하게 되었다.
+알고리즘 실력은 앞으로 개발자로 살아가면서 꼭 갖춰야 할 중요한 역량 중 하나라고 생각한다.
+그래서 4월부터 10월까지 약 7개월 동안 매주 2문제씩 꾸준히 풀기로 목표를 세웠다.
+
+ (물론, 못푼 주차는 벌금으로 1문제당 스타벅스 쿠폰을 해당 스터디에 참여한 분들에게 선물하는 방식으로 진행했다)
+
+* 초반에는 해당 알고리즘 중에서 개인적으로 도움되는 부분을 블로그에 정리해보자고 생각했다.
+
+ * [[블로그] 383. Ransom Note](https://devfancy.github.io/LeetCode-383-Ransom-Note/)
+
+ * [[블로그] 32. Implement Queue using Stacks](https://devfancy.github.io/LeetCode-232-Implement-Queue-using-Stacks/)
+
+* 하지만, 스터디를 진행하면서 알고리즘과 관련된 부분은 블로그가 아닌 노션에 정리하기로 했다. 그래서 그 이후부터는 노션에 관련 문제 유형, 문제 풀이를 테이블 형식으로 정리해갔다.
+
+
+
+* 11월부터는 다른 스터디 대비 우선순위가 낮아서 잠시 중단했지만, 2025년 2월부터는 다시 시작하지 않을까 싶다. (알고리즘 실력은 향상해야 하니까)
+
+
+---
+
+### KPT 회고
+
+
+
+* 크리스마스 날에 글또 분들과 같이 올해 2024년에 대한 KPT 회고를 아래와 같이 정리했다. (회사에 대한 부분은 제외했다)
+ (`서버 개발자`와 `일상`을 분리하여 작성했다)
+
+
+---
+
+#### Keep (유지하고 있는 것)
+
+> 서버 개발자
+
+* 블로그를 달에 한번씩은 꾸준히 작성한 점이다.
+
+ * 작년 2023년과 다르게, 2024년에는 양보다 ‘질’을 생각하면서 글을 작성했다. (총 28개)
+
+* 글또에 참여해서 벌금 없이 글+커피챗+기타 다양한 활동에 참여한 점이다.
+
+ * 2주마다 글 제출, 커피챗 2회이상 참여 -> 완료
+
+ * 9기 - 패스 2회 사용, 추가글 제출해서 총 10개 중 8개 제출
+
+ * 10기 - 패스 1회 사용, 현재까지 5회 제출(해당 글 포함) -> 남은 3개월 동안에도 2주에 1번 글 제출하기
+
+* IT 동아리인 SIPE에 참여해서 기술 관련 학습을 꾸준히 하고 있다.
+
+ * 성능 테스트에 대한 학습과 관련 도구 및 실습 예제를 통한 기술적 경험
+
+ * 최근에 참여한 모듈러 모놀리스에 대한 학습과 실습 예제를 통한 기술적 경험
+
+ * 그 밖에 사이데이션, 사담콘, 사이프톤, 내친소등 다양한 활동에 참여 및 기술적 부분에 대한 기여
+
+ * 이력서 & 포폴에 대한 피드백 및 꿀팁 공유
+
+* 집필 제안 및 계약 완료
+
+ * 운이 좋게도 제가 운영했던 스터디와 제 블로그 글을 보고 연락을 주셔서, 집필 제안을 받고 계약까지 하게 되었다.
+
+> 일상
+
+* 운동을 꾸준히 했다. 주 3-4일
+
+ * 평일 최소 2-3회, 주말 최소 1-2회
+
+* 시간될 때마다 전시회/연주회를 방문했다. 1-2달에 1-2번
+
+ * 개인적으로 차분한 공간과 감미로운 연주를 들으면 마음이 편해지는 기분과 스트레스가 해소된다.
+
+* 인간관계 유지: 어릴적 친구들, 대학교때 만났던 친구들, 이전 회사의 동기들과 연락을 꾸준히 하며 가끔씩 밥을 먹곤 했다.
+
+* 20대 중에서 부모님께 가장 많은 효도를 해드렸다.
+
+
+---
+
+#### Problem (개선해야 할 부분)
+
+> 서버 개발자
+
+* 알고리즘 학습 부족 - LeetCode를 10월 이후로 쉬고 있다는 점 → 2주일만 쉬려고 했지만, 현재 2달 넘게 쉬는 중..
+
+* DB, 인프라에 대한 학습 부족 - 회사 특성상 DB, 인프라에 대한 경험이 적을 수 밖에 없는 환경 + 코드(언어)에 집중했다는 점
+
+* 하나에 집중을 하지 못한 점 - 회사 일(맡고 있는 주요 프로젝트 2개), 회사외 개발 공부 -> 모두 제대로 가져가지 못했다.
+
+
+> 일상
+
+* 자기 관리를 실천하고 있지만, 자세히 들여다보면 망가진 삶을 살고 있다.
+
+ * 운동은 꾸준히 했지만, 생활 패턴을 유지하는 데 어려움이 있었다.
+
+ * 예를 들어, 저녁 12시 이전에 잠을 자기 실패 + 새벽 넘게 일을 하고 있다는 점
+
+* 혼자만의 휴식을 즐기진 못했다.
+
+ * 연차, 주말이 와도 제대로 즐기지 못하고 무언가(주로 공부, 운동)를 하고 있다.
+
+* 부모님과 시간을 온전히 보내지 못한다는 점이다.
+
+ * 회사 핑계 or 개발 관련 스터디/동아리 활동으로 부모님과의 하루를 온전히 즐기지 못했다.
+
+---
+
+#### Try (시도하고 싶은 것)
+
+> 서버 개발자
+
+* 2025년 2월부터는 주 2회 알고리즘 문제 풀기 (-> LeetCode 에 있는 알고리즘 문제)
+
+* 회사 일, 회사 외의 일을 구분해서 집중한다.
+
+ * 회사 일은 8시간에만 집중 -> 단, 중요한 업무와 야근은 제외
+
+ * 회사 외의 공부는 하루 2시간으로도 충분
+
+* 코드 뿐만 아니라 설계 및 DB(MySQL, Redis)에 대한 학습을 한다.
+
+ * 모듈러 모놀리스에 대한 개념 + 스프링 기반의 모놀리스 학습하기
+
+ * Real MySQL 1권 읽기
+
+ * Redis, Kafka 관련 공식문서/책 공부 - 카프카 핵심 가이드 1권 읽기
+
+* 개발 관련 글쓰기
+
+ * 단순 기술 학습은 깃허브에 정리하기
+
+ * 문제해결 과정에 대한 부분은 블로그에 정리하기
+
+> 일상
+
+* 규칙적인 패턴을 유지하자 -> 잠자는 시간, 운동하는 시간, 업무에 몰입하는 시간
+
+ * 잠자는 시간은 24시 전에
+
+ * 운동은 (가급적) 평일 - 오전 6시 ~8시, 주말 - 10시 ~ 12시
+
+ * 업무 몰입은 오전 3.5시간, 오후 3.5시간, 30분 나눠서 휴식하기
+
+* 일주일 중 하루는 나만의 휴식 시간을 갖자. 적어도 한 달에 2번 !
+
+ * 휴식때는 그날의 feel에 따라 가보고 싶은 곳 가기
+
+* 한 달에 1번은 부모님과 보내기 → 어렵다면 두 달에 1번 !
+
+ * 국내/해외 여행 - 국내 여행은 제주도, 해외 여행은 일본/호주/캐나다
+
+* 영어 공부 - 일상/비즈니스
+
+ * 매일 30분 꾸준히 하자 !
+
+* 개발 서적 외에 다른 분야의 서적을 읽어보자. -> 개인적으로 인문학/소설 분야를 좋아해서 해당 분야를 두 달에 1권을 읽는 것을 목표로 하자 !
+
+
+---
+
+### 연말에 자기 자신에게 꼭 해봐야 할 질문
+
+> [연말에 자기 자신에게 꼭 해봐야 할 질문 20가지](https://m.post.naver.com/viewer/postView.naver?volumeNo=17415420&memberNo=30127632) 에 있는 질문들 중 일부 질문에 대한 나의 대답을 아래와 같이 정리했다.
+
+(1) 내가 정말로 원하는 것은 무엇인가?
+
+* 개발 외 다른 직무간의 원활한 커뮤니케이션을 하는 사람
+
+* 삶의 여유가 있으면서도 본인만의 일을 좋아하고 성장하는 사람
+
+
+(2) 올해 정말 감사하거나 스스로 운이 좋다고 여긴 일이 있는가?
+
+* 새로운 회사에 취업한 것 -> 내가 원하는 백엔드 기술 스택과 개발 경험을 통해 기술적인 성장을 했다. 다만 아쉬운 건, 트래픽 수에 대한 대응 경험과 적용하고 싶은 기술에 대한 환경이 아니라는 점이다.
+
+* `글또 10기`와 `SIPE 3기`에 합격하고 활동하면서 얻었던 점들
+
+ * (공통)오프라인/온라인을 통해 좋은 분들을 많이 만나뵈면서 개발 부분과 개발 외적으로 많은 도움을 얻게 된 것이다.
+
+ * `글또` - 글또 10기에서도 기존 기수분들 외에, 신규 기수분들과의 새로운 만남과 경험을 얻으면서 다양한 지식과 통찰을 얻은 것이다.
+ 뿐만 아니라, 다른 사람이 작성한 글을 보고 어떻게 글을 작성해 나아갈지를 알게되었다.
+ 다양한 활동(다수의 커피챗, 김장, 크리스마스 회고, 연말 미룬이챌린지)을 통해 여러 사람들과 다양한 주제로 이야기를 나눌 수 있는 것에 감사하다.
+
+ * `SIPE` - 개발에 대한 공부도 즐겨야 하지만, 노는 것에 대해서 즐겨야 한다는 점을 알게 되었다.
+ 개인적으로 배우고 싶었지만, 회사에서 얻지 못하는 다양한 기술적 경험들을 훌륭한 분들과의 스터디를 통해 같이 배워볼 수 있다는 점이다.
+
+* 집필에 참여하는 것 -> 부족한 나를 신뢰해주고 같이 열심히 참가한 팀원 분들
+
+
+(3) 내가 반드시 해야 한다고 생각하는 중요한 것 중 계속 미루고 있는 것은 무엇인가?
+
+* 경험하고/배우고 싶었던 기술 주제에 대한 글쓰기
+
+ * 코드 - Kotlin Coroutines : Deep Dive
+
+ * 설계 - Modular Monolith
+
+ * 그 외 - Redis, Kafka
+
+(4) 실패가 두려워 아예 시도조차 하지 않는 것이 있진 않은가?
+
+* 사이드 프로젝트 -> 이전에 시도했지만, 계획대로 흘러가지 못한게 많았고, 대부분 런칭까지 이어가지 못했다.
+
+ * 하나의 기능부터 제대로 만들어 보자 ! -> 현재 참여하는 동아리에서 해커톤을 진행할 예정인데, 해당 대회에서 슬랙봇과 관련된 기능을 개발해서 동아리에 기여하는 경험을 해보려고 한다.
+
+
+(5) 내 인생에서 가장 중요한 것과 관련해서 나는 무엇을 하고 있는가?
+
+* 키워드로 나열하면, `건강`, `행복`, `성장`이다.
+
+ * 2024년까지는 `성장`이 우선순위가 가장 높았다면, 2025년부터는 `건강` 과 `행복`을 최우선순위로 동등하게 두고, 그 뒤에 `성장`을 가져가려고 한다. 건강이 조금이라도 안좋아지면 성장할 수 없는 상황에 놓여지게 되는게 어찌보면 당연한건데, 깨달았던 것은 최근에 알게 되었다.
+
+ * `건강`을 위해서 주 3-4회 이상 꾸준히 운동한다.
+
+ * `행복`을 위해서 최소 주 1회는 내가 하고 싶은 것들로 휴식을 채운다.
+
+ * `성장`을 위해서 회사와 회사 외적으로 기술 공부를 하자. 평일에는 하루 1~2시간, 주말에는 평균 4~6시간 이내로 두자.
+
+
+(6) 내년 꼭 달성하고 싶은 것을 단 하나만 고른다면 그것은 무엇인가?
+
+* 좋은 사람을 만나서 시간날 때마다 같이 휴식을 보내는 것이다. -> 그러기 위해서는 나도 좋은 사람이 되기 위해 노력을 할 것이고, 여가 시간을 마련하려고 노력할 것이다.
+
+---
+
+## 2025년 계획
+
+
+
+2025년 목표는 작년과 다르게 단순하게 정리해보고자 한다. 2025년이 되어봐야 알겠지만, 구체적으로 작성하는 것은 큰 의미가 없을 것 같다.
+2주 단위로 목표를 세우는 것이 성공 확률을 높이는 데 더 효과적이었기 때문에, 여기서는 단순하게 정리하는 것이 더 유의미하다고 생각한다.
+개발뿐만 아니라 개발 외적으로 하고 싶은 것들도 함께 나열했다.
+
+* CS 지식 & 알고리즘 공부
+
+* 코틀린 코루틴 공부 (딥다이브하게)
+
+* Redis & Kafka 공부
+
+* 일상 회화/비즈니스 영어 공부
+
+* 인문학/소설 책 두 달에 1권 읽기
+
+* 한 달에 1번은 부모님과 보내기 -> 어렵다면 적어도 두 달에 한번!
+
+* 해외 여행 가기 -> 일본/호주/캐나다 중 한 곳
+
+---
+
+### 2025년 나만의 멀티버스
+
+* 건강, 행복, 성장 이라는 키워드로 노션을 통해 `2025년 나만의 멀티버스`를 정리했다.
+
+
+
+* 2024년에는 많은 활동과 경험을 통해 '나'라는 사람에 대해 더 많이 알게 된 한 해였다.
+2025년에는 어떻게 흘러갈지 알 수 없지만, 건강, 행복, 성장이라는 세 가지를 모두 이루기를 바라며`2024년 회고`를 마친다.
+
+* 지금까지 읽어주셔서 감사드리며, 이 글을 읽은 모든 분들께서 2025년 새해에도 행복과 행운이 가득하시길 진심으로 기원합니다. 🙏🏻
+
+---
+
+## Reference
+
+* [KPT 회고하는 법, 회고에 대한 생각(2024 내용 추가)](https://zzsza.github.io/diary/2023/06/05/how-to-retrospect/)
+
+* [연말에 자기 자신에게 꼭 해봐야 할 질문 20가지](https://m.post.naver.com/viewer/postView.naver?volumeNo=17415420&memberNo=30127632)
+
+
+---
+
+글을 작성하는데 총 걸린 시간: 약 9시간
+
+* 글 작성: 8시간
+
+* 맞춤법 수정, 자연스러운 문장이 되도록 문맥 정리: 1시간 (2024년 이후 퇴고하면서 30분 추가 포함)
+
diff --git a/src/content/posts/2025-DevHistory.md b/src/content/posts/2025-DevHistory.md
new file mode 100644
index 00000000..39963c10
--- /dev/null
+++ b/src/content/posts/2025-DevHistory.md
@@ -0,0 +1,112 @@
+---
+title: "2025 Dev History"
+date: 2025-01-01
+categories: ["회고"]
+tags: ["개발기록"]
+---
+
+> 2025 Dev History
+
+* [2024 Dev History](https://devfancy.github.io/2024-DevHistory/)에 이어 2025년에도 내가 공부하면서 배운 내용을 꾸준히 기록해두자.
+
+
+---
+
+## Plan
+
+* [2025 Plan Note](https://gist.github.com/devFancy/cb98297a5fee3445805f08c5d590ddb1)
+
+
+
+
+> 서버 개발과 관련된 책 또는 강의
+
+* 책 [Kotlin in Action: 2/e](https://product.kyobobook.co.kr/detail/S000215768644)
+
+* 책 [카프카 핵심 가이드](https://product.kyobobook.co.kr/detail/S000201464167)
+
+* 책 [도메인 주도 개발 시작하기](https://product.kyobobook.co.kr/detail/S000001810495)
+
+* 강의 [DDD(Domain-Driven Design) 세레나데](https://edu.nextstep.camp/c/GwN2MSqv)
+
+* 강의 [제미니의 개발실무 - 커머스 백엔드](https://www.inflearn.com/course/제미니의-개발실무-커머스-백엔드-기본)
+
+> E.T.C
+
+* 책 [요즘 당근 AI 개발](https://product.kyobobook.co.kr/detail/S000217613503)
+
+## A Monthly Record
+
+> 2025.01.01 ~ 2025.01.31
+
+* [SIPE 커뮤니티를 위한 슬랙 봇 만들기 (feat. 사이프톤)](https://devfancy.github.io/ETC-Sipethon-Slackbot/)
+
+> 2025.02.01 ~ 2025.02.28
+
+* [DDD 세레나데 7기 1주차 (feat. 이벤트 스토밍)](https://devfancy.github.io/DDD-Week1-Review-And-EventStorming/)
+
+* [[리뷰] 삶의 태도를 돌아보는 면접의 질문들](https://devfancy.github.io/Book-Interview-Questions/)
+
+> 2025.03.01 ~ 2025.03.31
+
+* [DDD 세레나데 7기, 5주간의 여정을 돌아보며](https://devfancy.github.io/DDD-Serenade-7th-Review/)
+
+* [글또 10기 회고](https://devfancy.github.io/geultto-10th-Retrospective/)
+
+> 2025.04.01 ~ 2025.04.30
+
+* [Spring Boot 환경의 Multi Module에서 logback 환경별 설정하기](https://devfancy.github.io/Multi-Module-Logback-xml/)
+
+* [Spring Boot 요청 흐름 추적: Logging Filter와 traceId 적용기](https://devfancy.github.io/SpringBoot-Logging-Filter/)
+
+> 2025.06.01 ~ 2025.06.30
+
+* [Prometheus와 Grafana로 Spring Boot 기반 모니터링 대시보드 구축하기](https://devfancy.github.io/SpringBoot-Monitoring-Prometheus-Grafana/)
+
+* [MDC와 GlobalTraceId를 활용한 분산 추적](https://devfancy.github.io/SpringBoot-Distributed-Tracing-With-MDC/)
+
+> 2025.07.01 ~ 2025.07.31
+
+* [[카프카 핵심 가이드] CHAPTER 1. 카프카 시작하기](https://devfancy.github.io/Kafka-Concept/)
+
+* [[카프카 핵심 가이드] CHAPTER 2. 카프카 설치하기 (설치부터 파티션과 브로커 규모 산정까지)](https://devfancy.github.io/Kafka-Installation-Sizing-Guide/)
+
+* [[카프카 핵심 가이드] CHAPTER 3. 카프카 프로듀서: 카프카에 메시지 쓰기](https://devfancy.github.io/Kafka-Producer/)
+
+* [[카프카 핵심 가이드] CHAPTER 4. 카프카 컨슈머: 카프카 컨슈머: 개념, 처리 속도, 리밸런싱 전략](https://devfancy.github.io/Kafka-Consumer/)
+
+> 2025.08.01 ~ 2025.08.31
+
+* [Kafka Interceptor로 MDC 로깅 분리하기](https://devfancy.github.io/Kafka-Interceptor-Mdc-Logging/)
+
+* [[카프카 핵심 가이드] CHAPTER 4. 카프카 컨슈머: 컨슈머 설정 및 오프셋과 커밋](https://devfancy.github.io/Kafka-Consumer-Config-And-Commit/)
+
+* [[카프카 핵심 가이드] CHAPTER 5. 프로그램 내에서 코드로 카프카 관리하기: AdminClient를 활용한 토픽 및 컨슈머 그룹 관리](https://devfancy.github.io/Kafka-Admin-Client/)
+
+> 2025.09.01 ~ 2025.09.30
+
+* [토스 SLASH 22 Server '왜 은행은 무한스크롤이 안되나요' 정리](https://devfancy.github.io/Toss-Slash-22/)
+
+* [토스 SLASH 24 Server '분산 트랜잭션과 지속 가능한 마이그레이션 전략' 정리](https://devfancy.github.io/Toss-Slash-24/)
+
+> 2025.10.01 ~ 2025.10.31
+
+* ['도메인 주도 개발 시작하기' 책 후기](https://devfancy.github.io/DDD-Start-Review/)
+
+* ['제미니의 개발실무 - 커머스 백엔드 기본편' 강의 후기](https://devfancy.github.io/Inflearn-Gemini-Dev-Commerce-Backend-Review/)
+
+* [Spring Boot에서 Sentry를 이용한 에러 추적 시스템 개선하기](https://devfancy.github.io/spring-boot-sentry/)
+
+* ['요즘 당근 AI 개발' 책 후기](https://devfancy.github.io/Modern-AI-Development-at-KarrotReview/)
+
+> 2025.11.01 ~ 2025.11.30
+
+* [테스트에 대한 전략과 고찰](https://devfancy.github.io/springboot-test-strategy/)
+
+> 2025.12.01 ~ 2025.12.31
+
+* [Spring Boot, Kotlin 함수형으로 안전하게 서킷 브레이커 구현하기](https://devfancy.github.io/spring-boot-kotlin-circuit-breaker/)
+
+* [외부 시스템과의 연동 시 발생하는 장애를 격리하기 위해 서킷 브레이커 적용하기](https://devfancy.github.io/spring-boot-kotlin-external-api-circuit-breaker/)
+
+* [AWS EC2 기반 부하 테스트를 진행하며 시스템 아키텍처 및 성능 개선하기](https://devfancy.github.io/spring-boot-coupon-system-performance-improvement/)
\ No newline at end of file
diff --git a/src/content/posts/2026-DevHistory.md b/src/content/posts/2026-DevHistory.md
new file mode 100644
index 00000000..0d824c06
--- /dev/null
+++ b/src/content/posts/2026-DevHistory.md
@@ -0,0 +1,44 @@
+---
+title: "2026 Dev History"
+date: 2026-01-01
+categories: ["회고"]
+tags: ["개발기록"]
+---
+
+> 2026 Dev History
+
+* [2025 Dev History](https://devfancy.github.io/2025-DevHistory/)에 이어 2026년에도 내가 공부하면서 배운 내용을 꾸준히 기록해두자.
+
+
+---
+
+## Plan
+
+* [2026 Plan Note](https://gist.github.com/devFancy/c6724b137755ac8c655008469d9e32e8)
+
+
+
+
+> 서버 개발과 관련된 책 또는 강의
+
+* 책 [Kotlin in Action: 2/e](https://product.kyobobook.co.kr/detail/S000215768644)
+
+* 책 [주니어 백엔드 개발자가 반드시 알아야 할 실무 지식](https://product.kyobobook.co.kr/detail/S000216376461)
+
+> E.T.C
+
+* 책 [(읽기 쉽고 코드 리뷰하기 좋은) 코드 작성 가이드](https://product.kyobobook.co.kr/detail/S000212990621)
+
+## A Monthly Record
+
+> 2026.01.01 ~ 2026.01.31
+
+* ['삶을 재구성하는 관계의 법칙, 사람을 남기는 사람' 책 리뷰](https://devfancy.github.io/Book-The-One-Who-Leaves-People-Behind/)
+
+* [시스템 장애를 처리하기 위해 재처리 및 DLQ 적용하기](https://devfancy.github.io/spring-boot-kafka-dlq/)
+
+* [2026년 1월 생각 정리](https://devfancy.github.io/essay-01-note/)
+
+> 2026.07.01 ~ 2026.07.31
+
+* [2026년 7월 생각 정리](https://devfancy.github.io/essay-02-note/)
\ No newline at end of file
diff --git a/src/content/posts/3th-Retrospective.md b/src/content/posts/3th-Retrospective.md
new file mode 100644
index 00000000..ff9fff94
--- /dev/null
+++ b/src/content/posts/3th-Retrospective.md
@@ -0,0 +1,129 @@
+---
+title: "2024년 3분기 회고"
+date: 2024-10-27
+categories: ["회고"]
+tags: []
+---
+
+> 최근 내가 하고 있는 일이 너무 많아서 머릿속이 복잡해졌다. 그래서 생각을 정리하고자 2024년 3분기 회고 글을 작성하게 되었다.
+
+## 무엇보다도 회사 일은 0순위
+
+* 지금 내가 생활할 수 있는 기반을 제공하는 회사가 무엇보다 중요하다고 생각한다. 그만큼 회사에 대한 애정을 갖고, 주어진 기간 안에 업무를 집중하여 정확하게 처리해야 한다고 믿고 있다.
+
+* 최근에는 코드와 설계에 관심을 갖고, 관련 기술들을 공식문서/책/영상 등으로 공부하고, 예제를 만들어서 실험을 해본 뒤에 적용하는 식으로 진행하고 있다.
+
+* 또한 기존 서비스의 백엔드 코드를 리팩터링하면서 유지보수하기 쉽게 개선하고 있다. 최근 읽고 있는 `좋은 코드, 나쁜 코드` 와 이전에 읽은 `내 코드가 그렇게 이상한가요?` 가 많은 도움을 주었다.
+리팩터링에는 정답이 없다고 생각하지만, 적어도 팀원이나 제3자가 이전보다 쉽게 이해할 수 있도록 만드는 것이 중요하다고 본다.
+
+* 비록 지금 회사에서 오래 일하지는 않았지만, 주도적인 자세가 중요하다는 점을 많이 깨닫고 있다.
+
+
+---
+
+## 글또 10기
+
+> 글또가 무엇인지 알고 싶다면 [여기](https://geultto.github.io/)를 클릭해 주시면 됩니다.
+
+
+
+위 이미지는 글또의 공식 홈페이지입니다.
+
+---
+
+
+
+
+* 이전 9기에 이어 이번 10기에도 참여하게 되었다.
+
+* 사실 참여를 결정할 때, '과연 내가 2주에 한 번씩 글을 작성할 수 있을까?' 하는 걱정이 있었지만,
+
+* 이번 10기가 마지막이기도 하고, 글을 작성하는 것 외에도 많은 장점이 있어서 참가하게 되었다.
+
+
+* 글또를 시작하기 전에는 내 주변에 IT 업계의 개발자의 모습을 찾아보기 어려웠는데,
+
+* 글또를 통해 대기업부터 스타트업까지 다양한 분들의 글을 읽으며 많은 생각을 나눌 수 있었다.
+
+* 이 경험은 '본인의 인생을 재밌고 열심히 살아가는 사람들이 정말 많구나'라는 것을 느끼게 해 주었다.
+
+
+* 앞으로는 기술적 주제를 중심으로 글을 작성할 예정이며, 비중은 기술 8: 회고 2 정도로 계획하고 있다.
+
+## SIPE 3기
+
+> SIPE에 대한 소개는 [여기](https://sipe.team/about)를 클릭해 주시면 됩니다.
+
+
+
+위 이미지는 SIPE 공식 홈페이지 입니다.
+
+---
+
+
+
+
+* SIPE는 개발자들이 교류하며 성장하는 IT 커뮤니티를 지향하는 동아리다.
+
+ * 글또가 글을 작성하는 데 초점을 맞추고 있다면,
+
+ * SIPE는 개발 관련 다양한 활동을 통해 본인이 원하는 개발자로서의 역량을 쌓아가는 것을 목표로 하고 있다.
+
+* 글또는 글 작성 외 필수적인 과제가 없어 스터디나 사이드 프로젝트에 대한 갈증이 있었고,
+
+* 이를 채우기 위해 SIPE에 관심을 가지게 되었다.
+
+* 특히 올해 4월 SIPE 2기 "두 번째 사담콘"에 게스트로 참여하며, SIPE 멤버들이 개발에 진심이라는 것을 느낄 수 있었고, 이번 3기에 망설임 없이 지원하게 되었다.
+
+* 다음 주부터 정규 미션 1차가 시작되는 만큼, 열심히 노력해 개발 역량을 쌓아가고자 한다.
+
+## 집필
+
+* 최근 출판사에서 이전에 내가 진행했던 스터디를 보고 출간 제안을 주셨고, 이 기회를 소중히 여기며 준비에 매진 중이다. (구체적인 내용은 아직 공유하기 어렵지만, 책이 출간되면 그때 자세히 전할 수 있을 것 같습니다..)
+
+* 사실, 집필 경험이 없어 처음에는 부담감이 컸지만,
+
+ * 집필에 대한 정보를 찾던 중 글또의 재그지그님이 작성한 [주니어 개발자가 처음 책 출판해본 썰.txt](https://wormwlrm.github.io/2021/09/12/Review-of-Book-Publication.html) 글을 읽게 되었고, 덕분에 많은 도움을 받았다.
+
+ * 더 많은 조언을 듣고자 개인적으로 연락을 드렸고, 재그지그님께서 흔쾌히 응해 주셔서 오프라인에서 여러 가지 실질적인 조언을 들을 수 있었다.
+
+* 집필 과정에서 겪을 수 있는 다양한 현실적인 문제들을 가져오면서, 재그지그님이 이전에 경험했던 걸 기반으로 Q&A 시간을 가지게 되었다.
+
+ * 이를 통해 집필에 대한 불안감을 어느 정도 해소할 수 있었고, 구체적인 방향도 잡을 수 있었다. (이 자리를 빌려 [재그지그](https://wormwlrm.github.io/)님께 다시 한번 감사의 말씀을 전합니다)
+
+## 개인 공부
+
+### LeetCode
+
+
+
+* 올해 4월부터 알고리즘 스터디 모임에 참여해 매주 두 문제씩 [LeetCode](https://github.com/devFancy/LeetCode) 문제를 풀고 있다.
+
+* LeetCode에 대해서는 잘 알지 못했기에, 여러 리서치를 참고한 결과, `Grind 169 questions` 를 주변에서 많이들 추천해서 해당 사이트에 있는 문제를 주로 풀고 있다.
+
+> [Grind 169](https://www.techinterviewhandbook.org/grind75/?hours=10&weeks=15)은 유명한 알고리즘 및 자료구조 문제 리스트로, 기술 면접 준비에 초점을 맞춘 [Grind 75](https://www.techinterviewhandbook.org/grind75/)의 확장판이다.
+>
+> Grind 75가 핵심 문제 75개를 선별한 것이라면, Grind 169는 이를 더 포괄적으로 확장해 깊이 있는 학습을 가능하게 한다.
+> 문제들은 난이도, 주제, 빈도 등을 기준으로 선정되며, 단계별로 체계적인 학습을 유도한다.
+
+* 목표는 알고리즘 실력을 급격히 향상시키기보다는 최소한의 역량을 유지하고, 조금씩 발전해 나가는 것이다.
+
+* 알고리즘 문제를 풀지 않으면 실력이 떨어질 것 같아 불안했는데, 이 스터디가 그 불안을 해소해 주고 있다.
+
+* (당장 해야할 게 많다면 잠깐 쉬고, 여유로워지면 다시 푸는 방식으로 꾸준히 노력하자)
+
+### 좋은 코드, 나쁜 코드
+
+
+
+* 9월부터 읽기 쉬운 코드 작성하는 방법을 배우기 위해 "좋은 코드, 나쁜 코드" 책을 혼자 공부하기 시작했지만, 이후 여러 일로 인해 진도가 더딘 상태다.
+
+* 올해 안에 책을 완독하고, 실무에 적용해보는 것을 목표로 다시 꾸준히 진행할 계획이다.
+
+## 생각 정리
+
+* 이 글을 통해 복잡했던 생각이 조금 정리되어 기분이 한결 나아졌다. 앞으로는 우선순위에 따라 시간을 잘 조절해야겠다.
+
+* 최근 회사 일 외에도 여러 활동을 병행하고 있는데, 시작한 만큼 책임감을 가지고 컨디션을 조절하며 차근차근 처리해 나가야겠다.
+
+* 무엇보다도 회사 일이 최우선이라는 점을 잊지 말자.
\ No newline at end of file
diff --git a/src/content/posts/Algorithm-Baekjoon-24479.md b/src/content/posts/Algorithm-Baekjoon-24479.md
new file mode 100644
index 00000000..4435994f
--- /dev/null
+++ b/src/content/posts/Algorithm-Baekjoon-24479.md
@@ -0,0 +1,239 @@
+---
+title: "알고리즘 수업 - 깊이 우선 탐색 1(DFS)"
+date: 2023-11-29
+categories: ["알고리즘"]
+tags: ["백준"]
+---
+
+[문제 링크](https://www.acmicpc.net/problem/24479)
+
+## 성능 요약
+
+* 메모리: 92592 KB, 시간: 1076 ms
+
+## 구분
+
+* 그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색
+
+## Answer Code(2023.11.29)
+
+```java
+import java.util.*;
+import java.io.*;
+
+public class Main {
+ static final int MAX = 100000 + 10;
+ static ArrayList
+
+### F-분포의 특성
+
+* F 분포는 t분포와 마찬가지로 다양함
+
+* 연속적 (범위 : 0 ~ 무제한)
+
+* x축에 점근
+
+* F 값은 음수일 수가 없음 (최소값 = 0)
+
+* 양의 비대칭정도를 가짐 (자유도 증가 → 정규분포와 유사해짐)
+
+### F-분포표
+
+* F값은 유의수준 $\alpha$ 와 두 자유도 v1, v2에 의해 결정됨
+
+* 동일 모집단 분산의 비교 검정(= **검정통계량**)
+
+ * $F = \frac{S_{1}^2}{S_{2}^2}$
+
+
+## 분산분석
+
+* 분산분석(ANOVA, Analysis of Variance) 특징
+
+ * 세계의 모평균을 비교할 때, z or t 검정을 할 경우 3번의 검정을 해야함
+
+ * 표본집단은 처리(Treatment)라 불림
+
+ * 분산분석은 인자(Factor)의 수에 따라 구분됨
+
+* **검정통계량** : $F = \frac{MSB}{MSW}$ MSB: 처리간 제곱평균, MSW: 처리내 제곱평균
+
+* 분산분석의 가정
+
+ * `정규성`(Normality) : 모집단들은 서로 정규분포를 따른다.
+
+ * `등분상성`(Homoscedasticity) : 모집단들의 분산($\sigma$)은 동일하다.
+
+ * `독립성`(Independence) : 모집단들은 독립이다.
+
+
+### 일원분산분석
+
+* 변동을 표현하기위해 **ANOVA에서는 제곱합(SS, Sum of Squares)을 사용**
+
+ * SST(총 변동) = SSB(처리에 의한 변동) + SSW(처리와 관계 없는 임의 변동)
+
+
+
+
+* **제곱평균**(MS, Mean Squares (= SS/df = 제곱합/자유도))
+
+ * F-검정을 위해 사용되는 두 분산
+
+ * MSB: SSB의 제곱평균 (자유도: df = k - 1)
+
+ * MSW(MSE): SSW(SSE)의 제곱평균 (자유도: df = n - k)
+
+ * where k = 처리 그룹의 수, n = 전체 관측치의 수
+
+ * $MSB = \frac{SSB}{k-1}$
+
+ * $MSW = \frac{SSW}{n-k}$
+
+### 일원분산분석의 절차
+
+1. 가설 설정
+
+2. 유의수준
+
+3. 검정통계량 선택 : $F = \frac{MSB}{MSW}$ $\sim F(k-1, n-k)$
+
+4. 임계값 및 기각영역 결정 - 기각역: $F > F_\alpha$ (우측검정)
+
+5. 분산분석표(ANOVA Table)작성 및 결론
+
+
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-Continuous-Probability-Distribution.md b/src/content/posts/BS-Continuous-Probability-Distribution.md
new file mode 100644
index 00000000..431a88ce
--- /dev/null
+++ b/src/content/posts/BS-Continuous-Probability-Distribution.md
@@ -0,0 +1,219 @@
+---
+title: "07. 연속확률분포 (Continuous probability distribution)"
+date: 2022-05-20
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+> 이 글은 경영학부 경영통계 수업에서 배운 자료들을 정리한 내용입니다.
+
+* Key Point : 균등분포, 정규분포, 표준정규분포
+
+## Contents
+
+* 균등분포를 활용하여 확률을 계산한다.
+
+* 정규분포의 특징을 파악한다.
+
+* 표준정규분포를 활용하여 확률을 계산한다.
+
+* 표준정규분포를 활용하여 이항 분포의 확률값을 근사적으로 계산한다.
+
+### 이산확률변수 vs 연속확률변수
+
+* `이산확률변수`(Discrete random variable)
+
+ * 어떤 정해진 값만 가질 수 있고 값들 사이에 간격이 있는 변수
+
+ * 주로 수를 세어서(counting) 값을 할당
+
+* `연속확률변수`(Continuous random variable)
+
+ * 주어진 구간 내에서 어떤 실수 값이라도 가질 수 있는 변수
+
+ * 주로 측정(measurement)에 의해 값을 할당
+
+### 연속확률분포(Continuous probability distribution)
+
+* 연속확률분포
+
+ * 연속확률변수의 확률분포: 주어진 구간 내 무한 개의 측정값이 가능
+
+ * **균등분포, 정규분포**
+
+* 연속확률분포의 특징
+
+ * **특정한 하나의 값이 나타날 확률 = 0**
+
+ * 특정 구간의 확률 만이 의미가 있음
+
+ * 부등호, 등호의 유무 차이가 없음 ⇒ P(a≤X≤b) = P(a
+
+
+## 모평균에 대한 신뢰구간
+
+* 구간추정(Interval esitmate): 모수의 실제값이 들어 있을 구간을 추정
+
+ * 모평균 → $\sigma$ 알려짐 / $\sigma$ 알려지지 않음
+
+ * 모비율
+
+* 신뢰구간(Confidence interval)
+
+ * 어떤 구간(하한, 상한)내에 모수의 실제값이 있을 것으로 추정되는 구간 값
+
+ * **신뢰수준**, ($1-\alpha$)
+
+ * $\alpha$ : 유의 수준(significance level)
+
+ * $1-\alpha$ : 신뢰수준(confidence level)
+
+ * 예) 유의수준 $\alpha$ = 5% ⇒ 95% 신뢰구간
+
+ * **신뢰구간 = 점추정량 $\pm$ 오차범위**
+
+* **모평균에 대한 신뢰구간의 폭(오차범위)을 결정하는 요인**
+
+ [1] 표본수 : 표본 크기 **n이 증가할수록** 신뢰구간 폭이 좁아진다.
+
+ [2] 모집단의 표준편차, 모를 경우 표본표준편차 : **표준편차가 클수록** 신뢰구간 폭이 넓어진다.
+
+ [3] 원하는 신뢰수준: **신뢰수준이 클수록** 신뢰구간 폭이 넓어진다.
+
+### 신뢰구간 도출 과정
+
+* [1] **신뢰수준**을 설정한다. (주로 문제에 주어짐, ex) 95%)
+
+* [2] $\alpha$ 와 $\alpha / 2$ 계산 ⇒ $1-\alpha$ = 0.95, $\alpha$ = 0.05
+
+* [3] 대응하는 **Z값**을 찾는다 : $Z값$ → $Z_{0.025}$ = 1.96
+
+* [4] **오차범위(margin of error)**를 구하기 위해 Z값에 표준오차를 곱한다.
+
+> $Z_{\alpha / 2} = \frac{\sigma}{\sqrt{n}}$
+
+* [5] 표본평균에 오차범위를 더하고 빼서 **신뢰구간**을 결정한다.
+
+> $( \bar{X} - 1.96\frac{\sigma}{\sqrt{n}}, \bar{X} + 1.96\frac{\sigma}{\sqrt{n}} )$
+
+### T분포
+
+#### t분포의 특성
+
+* $\sigma$ 대신 $S$로 표준화를 할 경우, 표준정규분포를 따르지 않음.
+
+* 종모양 대칭의 연속확률분포
+
+* 자유도(df, degree of freedom)에 따라 모양이 결정되어 여러개의 분포가 존재함
+
+ * df = n - 1
+
+* t분포는 z분포에 비해 평평한 분포를 가짐.
+
+
+
+
+* 표본크기 n의 증가함에 따라 폭이 좁아져 z분포에 가까워짐
+
+#### 자유도(df)
+
+* 어떤 데이터 집합 내에서 자유로운 값들의 수
+
+* 예) n=4, 표본 평균 = 10일때
+
+* 자유도 = 3 = (n-1)
+
+#### t값 구하기 (**중요**)
+
+* 모집단의 분포가 정규분포라고 가정
+
+* 자유도(df)값을 구한다. ⇒ df = n - 1(표본크기 n = 10 → 자유도 = 9)
+
+* $\bar{X} \pm t_{n-1} \frac{s}{\sqrt{n}}$
+
+* t 분포표 에서 해당 신뢰구간에 대한 t값을 구한다.
+
+
+
+## 모비율에 대한 신뢰구간 **(중요)**
+
+* 표본비율: $p = \frac{x}{n}$ (⇒ **모비율에 대한 점추정치**)
+
+* 표본비율의 표본분포(Sampling distribution of the sample proportion)
+
+* $\mu = n\pi, \sigma^{2} = n\pi(1-\pi)$
+
+ * $**\pi$ : 성공확률**
+
+ * 표본비율의 표본분포의 평균과 분산
+
+ * 평균 E(p) = $\pi$
+
+ * 분산 V(p) = $\frac{\pi(1-\pi)}{n}$
+
+
+* 모비율 추정 시 중심극한정리 적용을 위한 조건
+
+ * np ≥ 5이고 n(1-p) ≥ 5 일때 → 중심극한정리 적용, **표준정규분포(z) 활용**
+
+* **모비율에 대한 구간 추정 (중요)**
+
+ * 모비율 $\pi$ 의 신뢰구간 = $p \pm z\sqrt{\frac{p(1-p)}{n}}$
+
+## 표본크기 결정 **(중요)**
+
+* 구간추정에서 표본크기를 정할 때 고려요인
+
+ * 오차한계(E): 신뢰구간의 폭을 좁히기 위해서는 작은 오차한계가 필요하며 이를 위한 표본크기는 커지게 됨 ⇒ $E = X - \mu$
+
+ * 원하는 신뢰수준: 신뢰수준이 커질 수록, 필요한 표본크기는 커짐
+
+ * 모집단의 변동성: 모표준편차가 커지면, 더 많은 표본자료가 필요함
+
+* 구간추정에서 사용된 오차한계(E)를 통해 표본크기를 정할 수 있다.
+
+ * 모평균에 대한 구간추정 : $E = z\frac{\sigma}{\sqrt{n}}$ ⇒ $n = ({\frac{z\sigma}{E}})^{2}$
+
+ * 모비율에 대한 구간추정: $E = z\sqrt{\frac{p(1-p)}{n}}$ ⇒ $n = p(1-p)(\frac{z}{E})^{2}$
+
+ * 모분산과 표본분산을 모른다면? ⇒ 자료의 범위 사용 : **R = 4$\sigma$ ↔ $\sigma = \frac{R}{4}$)**
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-Hypothesis-Testing.md b/src/content/posts/BS-Hypothesis-Testing.md
new file mode 100644
index 00000000..526191d1
--- /dev/null
+++ b/src/content/posts/BS-Hypothesis-Testing.md
@@ -0,0 +1,190 @@
+---
+title: "10. 단일표본 가설검정"
+date: 2022-06-23
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+> 이 글은 경영학부 경영통계 수업에서 배운 자료들을 정리한 내용입니다.
+
+
+## Contents
+
+* 가설검정 과정을 설명한다.
+
+* 여섯 단계의 가설검정 과정을 적용한다.
+
+* 한쪽꼬리검정과 양쪽꼬리검정을 구별한다.
+
+* 모평균에 대한 가설검정을 수행한다.
+
+* P-값을 계산하고 해석한다.
+
+* 가설검정을 위해 t 통계량을 사용한다.
+
+
+## 가설과 가설검정
+
+* 가설(Hypothesis)
+
+ * 모집단의 모수에 대한 진술, 주장, 표본추출을 통한 통계분석으로 검정해야 할 대상
+
+* 가설검정(Hypothesis testing)
+
+ * 모수에 대한 어떤 가설을 수립하고 수집된 표본정보를 이용해 가설의 옳고 그름을 판정하는 과정
+
+
+## 귀무가설, 대립가설
+
+* 두 가설은 항상 함께 표현되며, 서로 여집합의 관계 (서로 상호배타적이며 포괄적)
+
+* 귀무가설($H_{0}$, Null hypothesis)
+
+ * 수치증거를 검정하기 위한 목표로 만들어진 모집단 모수 값에 대한 진술
+
+ * 현재 진실로 받아들여지고 있는 사실 또는 일반적으로 알려져 있는 내용
+
+ * 등호가 항상 포함됨(”=”, “≥”, “≤”)
+
+* 대립가설($H_{1}$, Alternative hypothesis) == 연구가설(research hypothesis)
+
+ * 표본의 데이터 정보가 귀무가설이 거짓이라는 충분한 증거를 제시할 때 채택되는 진술
+
+ * 귀무가설을 부정함으로써 새롭게 입증하려는 내용
+
+ * 등호를 포함하지 않음. (”<”, “>”, “ $\ne$”)
+
+
+## 검정통계량, 기각역
+
+* 검정통계량(test statistic) → 귀무가설 “결백”
+
+ * 가설검정을 위해 사용되는 통계량. Ex) $z, t, F, \lambda^{2}$
+
+ * 가설검정은 항상 귀무가설이 사실이라는 전제하에 진행됨
+
+* 기각역(rejection region)
+
+ * 귀무가설을 기각할 수 있는 검정통계량 값의 범위
+
+ * 추출된 표본으로부터 검정통계량 값이 이 기각역에 들어가면 귀무가설을 기각하고, 대립가설을 채택하게 됨.
+
+ * 가설이 $\ne$ 형태 → 양쪽꼬리(양측)검정(two-sided test)
+
+ * 가설이 “<”, “>” 형태일 때는 한쪽꼬리(단측)검정(one-sided test)
+
+ * 기각역이 넓으면 귀무가설을 기각할 가능성이 높아짐(기각역의 범위가 넓어지기 때문이다)
+
+## 가설 검정의 종류
+
+* 가설 검정의 종류
+
+ * 양쪽꼬리(양측)검정
+
+ * 한쪽꼬리(단측)검정 : 대립가설의 기호의 방향을 따름.
+
+
+
+* 가설검정의 목적 및 결론
+
+ * 귀무가설에 검증이 필요하기 때문
+
+ * 일단 귀무가설이 맞다는 가정 하에 가설 검정을 수행
+
+ * 귀무가설을 기각할 수 있으면 → 강한 결론(strong conclusion): 귀무가설을 기각하고 대립가설을 채택
+
+ * 귀무가설을 기각할 수 없으면 → “증거가 불충분하므로 무죄를 선언한다”
+
+
+## 가설검증 단계
+
+* 1단계 : 가설의 설정 → 귀무가설 & 대립가설
+
+* 2단계: 유의수준 결정 → $\alpha$ = 0.05 or 0.01
+
+* 3단계: 검정통계량 선택 → z or t
+
+ * $z = \frac{\bar{X} - \mu}{\frac{\sigma}{\sqrt{n}}}$ or $z = \frac{\bar{X} - \mu}{\frac{s}{\sqrt{n}}}$ or $t= \frac{\bar{X} - \mu}{\frac{\sigma}{\sqrt{n}}}$
+
+* 4단계: 임계값 및 기각영역 결정
+
+ * 임계값: $\alpha$에 대항하는 양측일 때 → $z_{\alpha/2}$ or $t_{\alpha/2}$ / 한쪽일 때 → $z_{\alpha}$ or $t_{\alpha}$
+
+
+
+* 기각영역: 임계값이 결정
+
+* 5단계: 귀무가설의 기각여부 결정
+
+ * 검정통계량 계산
+
+ * 임계값 또는 기각영역과 비교
+
+
+
+
+
+
+## 한쪽 꼬리검정과 양쪽 꼬리 검정
+
+* 한쪽 꼬리 검정 ⇒ 왼쪽 or 오른쪽
+
+* 양쪽 꼬리 검정
+
+* 예) 정규분포의 면적은 1이다.
+
+
+
+
+## 모평균에 대한 가설검정
+
+* 모표준편차($\sigma$)을 아는 경우 → **z 분포** - 양쪽 꼬리 검정 또는 한쪽 꼬리 검정
+
+* 모표준편차($\sigma$)을 모르는 경우 and n < 30인 경우 → **t 분포**- 양쪽 꼬리 검정 또는 한쪽 꼬리 검정
+
+ * 조건: **n < 30 이고, 모표준편차를 모르는 경우** t 분포를 사용한다.
+
+* t 분포의 주요 특징
+
+ * 종모양의 좌우대칭형 연속분포이다.
+
+ * 자유도가 변할 때마다 새로운 분포가 형성된다.
+
+ * 자유도가 증가함에 따라 t 분포의 모양은 표준 정규분포의 모양에 가까워진다.
+
+ * 표준 정규분포보다 더 평평한 모양을 가짐 → **z 분포보다 더 큰 값을 가진다.**
+
+## p-값을 이용한 가설검정
+
+* `p-값`: 귀무가설이 참이라고 가정할 때 실제 관측지보다 극단적인 결과가 실제로 관측될 확률
+
+* p-값은 $**H_{0}$ 이 거짓이라는 가능성을 표현하는 방식**임
+
+* **p-값과 유의수준($\alpha$)을 비교** → 유의수준보다 작으면 $H_{0}$ 기각함.
+
+* **정리**
+
+ * [1] 검정통계량(z값, t값)에 해댱하는 꼬리 쪽의 확률 → p-값
+
+ * [2] 그런 p-값과 유의수준을 비교하여 작으면 귀무가설을 기각하고, 아니면 기각하지 않는다.
+
+
+## 모비율에 대한 가설검정
+
+Step 1, 3 ⇒ Step1(가설 설정)과 Step3(검정통계량)에 수정을 제외하고 나머지 순서는 같다.
+
+* Step 1: 모비율 $\pi$ 를 이용한 가설 검정 ⇒ 대립가설로 방향 결정하는 것은 같다.
+
+* Step 3: 검정통계량 선택 ⇒ $\mu = \pi, \sigma^{2} = \pi(1-\pi)/n$ 이용
+
+ * 귀무가설이 참이라는 가정하에 검증시작( 항상 모분산이 주어짐)
+
+ * z 분포를 사용할 수 있음
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-Introduction-To-Probability-Theory.md b/src/content/posts/BS-Introduction-To-Probability-Theory.md
new file mode 100644
index 00000000..e82ffbca
--- /dev/null
+++ b/src/content/posts/BS-Introduction-To-Probability-Theory.md
@@ -0,0 +1,113 @@
+---
+title: "05. 확률론개론"
+date: 2022-04-19
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+> 이 글은 경영학부 경영통계 수업에서 배운 자료들을 정리한 내용입니다.
+
+* Key Point : 곱셈법칙, 조건부확률 / 경우의 수
+
+## Contents
+
+* 확률, 실험, 사건 결과에 대해 정의
+
+* 덧셈 법칙을 활용하여 확률 계산
+
+* 곱셈법칙을 활용하여 확률 계산
+
+* 분할표를 활용하여 확률 계산
+
+* 계수법칙을 활용하여 경우의 수를 결정
+
+### 확률 관련 용어 정리
+
+* 확률 : 불확실한 상황에서 어떤 일이 일어날 가능성 (or 우연성)
+
+* 확률을 정의하는 용어
+
+ * 실험(Experiment) : 어떤 결과를 발생시키는 행위
+
+ * 표본공간, 결과(S, Sample space) : 어떤 실험에서 얻을 수 있는 모든 결과의 집합
+
+ * 사건 or 사상(Event) : 어떤 실험에서 가능한 한 개 또는 여러 개 결과의 집합 (**표본공간의 부분집합**)
+
+ * 확률 : 어떤 사건이 일어날 가능성**(0≤ P(A) ≤ 1)**
+
+### 덧셈 법칙
+
+* 확률의 덧셈법칙 (Rule of addition)
+
+ * P(A or B) = P(A) + P(B) – P(A and B) (덧셈의 일반법칙)
+
+ * P(A or B) = P(A) + P(B), 사건 A와 B가 상호배반적일 때 (덧셈의 특수법칙)
+
+* 결합확률 (Joint probability)
+
+ * 두 개 이상의 사건이 동시에 일어날 확률
+
+ * P(A and B) = P(A) + P(B) – P(A or B)
+
+ * P(A and B) = 0, 사건 A와 B가 상호배반적일 때
+
+### 곱셈 법칙
+
+* 확률의 곱셈법칙 (Rule of multiplication)
+
+ * 두 사건 A와 B가 동시에 일어날때의 결합 확률(Joint probability)
+
+ * 종속 → P(A ∩ B) = P(A)P(B|A) = P(B)P(A|B)
+
+ * 독립 → P(A ∩ B) = P(A)P(B) > 0
+
+* 조건부 확률 (Conditional probability)
+
+ * 어떤 사건이 이미 발생한 상태에서 다른 사건이 일어날 확률
+
+ * 종속 → P(A|B) = $\frac{P(A ∩ B)}{P(B)}$
+
+ * 독립 → P(A|B) = $\frac{P(A)P(B)}{P(B)}$ = P(A)
+
+* **상호배반적 사건과 독립사건**
+
+ * 두 사건이 상호 배반적이라면 두 사건은 독립일까 ?
+
+ * 결론적으로는 “No”
+
+ * 구체적 이유 : 상호배반적은 P(A ∩ B) = 0 이고, 독립일 경우, P(A ∩ B) = P(A)P(B) > 0 이기 때문이다.
+
+### 분할표
+
+* 2개 이상의 식별 가능 한 카테코리나 구간으로 표본 관측치를 분류하는 표 → 곱셈 법칙 활용
+
+### 경우의 수
+
+* 팩토리얼
+
+ * n 개의 사물 **모두를 순서대로** 배열하는 경우의 수 = n!
+
+* **순열과 조합**
+
+ * 순열 $_{n}\mathrm{P}_{r}$ (Permutation)
+
+ * n개 물건 중 r개를 **순서대로 배열**하는 경우의 수
+
+ * $*_{n}\mathrm{P}_{r} = \frac{n!}{(n-r)!}*$
+
+ * n : 전체 개수, r: 선택한 개수
+
+ * 조합 $*_{n}\mathrm{C}_{r}$* (Combination)
+
+ * n개 물건 중 r개를 **순서와 관계없이 선택**하는 경우의 수
+
+ * 순서 고려 X
+
+ * $*_{n}\mathrm{C}_{r} = \frac{n!}{r!(n-r)!}*$
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-Introduction.md b/src/content/posts/BS-Introduction.md
new file mode 100644
index 00000000..741c54ca
--- /dev/null
+++ b/src/content/posts/BS-Introduction.md
@@ -0,0 +1,69 @@
+---
+title: "0. 경영통계 과목 소개"
+date: 2022-04-15
+categories: ["대학교"]
+tags: ["경영통계"]
+---
+
+> 이 카테고리는 경영학부 경영통계 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+# Business Statistics
+
+## Text book
+
+* 경영경제통계학17판, Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
+
+
+
+
+## Reference
+
+* Excel 활용 통계학개론(제6판), 박명섭, 박광태, 이민호, 홍문사, 2014
+
+* Basic statistics for business and economics 17th edition, Lind, D. A., Marchal,
+W.G. and Wathen S.A. ,2018, McGraw-Hill/Irwin, New York, NY.
+
+* Essentials of Contemporary Business Statistics 17th edition, Anderson, D. R.,
+ Sweeney, D. J. and Williams, T. A. ,2018, South-Western
+
+
+## Course Objective
+
+* 다양한 통계 분석 기법의 이해
+
+ * 기술통계: 자료의 정리/요약
+
+ * 추론통계: 표본으로부터 모집단의 특성을 추론
+
+* 다양한 의사결정 상황에서의 각 통계 기법들의 적용 방법을 학습
+
+* MS 엑셀을 이용한 통계분석 활용 방법 습득 및 결과 해석 방법 학습
+
+
+## Lecture plan
+
+* [CH01. 통계학은 어떠한 학문인가](https://devfancy.github.io/BS-What-Is-Statistics/)
+
+* [CH02-03. 데이터 기술하기: 도수표, 도수분포 및 도표표현](https://devfancy.github.io/BS-Describing-Data/)
+
+* [CH03. 데이터 기술하기: 수치적 척도](https://devfancy.github.io/BS-Describing-Data-2/)
+
+* [CH04-05. 자료기술, 확률론 개론](https://devfancy.github.io/BS-Data-Technology/)
+
+* [CH05. 확률론 개론](https://devfancy.github.io/BS-Introduction-To-Probability-Theory/)
+
+* [CH06. 이산 확률분포](https://devfancy.github.io/BS-Discrete-Probability-Distribution/)
+
+* [CH07. 연속 확률분포](https://devfancy.github.io/BS-Continuous-Probability-Distribution/)
+
+* [CH08. 표본 추출법과 중심극한정리](https://devfancy.github.io/BS-Sampling-Methods-And-Central-Limit-Theorem/)
+
+* [CH09. 추정과 신뢰구간](https://devfancy.github.io/BS-Estimation-And-Confidence-Interval/)
+
+* [CH10. 단일 표본 가설검증](https://devfancy.github.io/BS-Hypothesis-Testing/)
+
+* [CH11. 두 표본 가설 검정](https://devfancy.github.io/BS-Two-Sample-Hypothesis-Test/)
+
+* [CH12. 분산분석](https://devfancy.github.io/BS-Analysis-Of-Variance/)
+
+> 2022년 1학기 경영통계 수업을 강의해주신 권혜정 교수님께 이 자리를 빌어 감사의 말씀을 드립니다.
\ No newline at end of file
diff --git a/src/content/posts/BS-Sampling-Methods-And-Central-Limit-Theorem.md b/src/content/posts/BS-Sampling-Methods-And-Central-Limit-Theorem.md
new file mode 100644
index 00000000..187302ed
--- /dev/null
+++ b/src/content/posts/BS-Sampling-Methods-And-Central-Limit-Theorem.md
@@ -0,0 +1,179 @@
+---
+title: "08. 표본추출법과 중심 극한정리"
+date: 2022-05-20
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+> 이 글은 경영학부 경영통계 수업에서 배운 자료들을 정리한 내용입니다.
+
+## Contents
+
+* 표본을 추출하는 이유, 4가지 표본추출법
+
+* 표본오차 정의
+
+* 표본평균의 표본분포 정의
+
+* 중심극한정리의 정의 → 표준오차 정의
+
+* 중심극한정리를 활용 → 확률 계산
+
+
+## 전수조사와 표본조사
+
+* `전수조사` : 대상 모집단의 모든 구성원소를 전부 조사
+
+* `표본조사` : 모집단으로부터 추출된 일부만을 조사, 표본추출의 종류
+
+ * [1] 확률추출(Probability sampling)**
+
+ * 표본 추출 시 주관적 판단이 개입되지 않음.
+
+ * 종류 4가지 - **단순무작위 추출, 체계적 추출, 층화 추출, 군집추출**
+
+ * [2] 비확률 추출(Non-probability sampling)
+
+ * 주관적 판단에 의해 표본 추출(직관 및 재량)
+
+
+## 표본추출법(Sampling Method)
+
+
+### 단순 무작위 추출법(Simple Random Sampling)
+
+* 표본으로 선택될 가능성이 모집단에 속한 모든 요소에 의해 동일한 조건에서 추출된 표본
+
+* 어떤 한 개체의 선택이 다른 개체의 선택에 영향을 미치지 않도록 추출
+
+* 시간이 많이 소요될 수 있고 표본이 편중될 가능성을 완전히 배제할 수 없음
+
+
+
+
+### 체계적 추출법(Systematic Random Sampling)
+
+* 임의로 시작지점을 선택한 후 모집단에서 그 다음 매 k번째 요소를 선택하는 방식으로 추출된 표본(k = N/n 으로 정함)
+
+* 주기성(periodicity)의 문제가 있을 수 있음
+
+
+
+
+### 층화 추출법(Stratified random sampling)
+
+* 모집단을 층(strata)이라 부르는 몇 개의 집단으로 나누고 각 층에 대해 무작위 추출을 시행하여 얻은 표본
+
+* 각 층내에서는 기본 단위 특성이 균일하고, 층 별로는 차이가 클 때 사용
+
+
+
+* 전체 대비 각 계층에 속한 **모집단 수의 비율**을 구함
+
+* 추출할 **각 집단의 표본수**를 위에서 구한 비율로 결정
+
+* 각 집단 별로 정해진 수 만큼 **단순임의표본**을 추출
+
+* 예시) 교육수준에 따른 층화 표본의 수 결정(표본 수 n = 1000)
+
+
+ | 학력 | 1. 모집단 | 2. 비율 | 3. 층화표본수 | 3. 층화표본수(반올림) |
+ | --- | --- | --- | --- | --- |
+ | 고졸 미만 | 10466000 | 9.46% | 94.5 | 95 |
+ | 고졸 이상 | 34011000 | 30.74% | 307.3 | 307 |
+ | 대학 중퇴 | 31298000 | 28.29% | 282.8 | 283 |
+ | 대졸 | 34874000 | 31.52% | 315.1 | 315 |
+ | 전체 | 110649000 | 100% | 1000 | 1000 |
+
+
+### 군집 추출법(Cluster sampling)
+
+* 모집단이 지리적 또는 다른 기준에 의해 여러 개의 지역으로 구분되는 경우에, 그 중 몇개의 지역을 무작위로 선택하고 선택된 지역으로부터 무작위로 추출된 표본
+
+* 예시) 미국 광역시카고의 12개 카운티에 거주하는 주민들의 의견조사
+
+
+
+* 모집단이 넓은 지역에 퍼져있는 경우 효율적 표본 추출 방법이 될 수 있음
+
+* 군내에서는 기본 단위 특성차이가 크고 군간 차이가 작을때 사용
+
+## 표본오차
+
+* 모집단의 일부분인 표본에 의해서 전체의 특성을 파악하려는 데서 오는 오차
+
+* 전수조사에서는 발생치 않음
+
+* 비용, 시간등의 현실적인 제약요건 존재
+
+* 정의: 표본통계량과 이에 대응하는 모집단 모수 간의 차이 ⇒ **모평균 - 표본평균**
+
+
+## 표본평균의 표본분포
+
+* 간단히 말하면, **표본의 평균값들을 분포로 나타낸 것**
+
+* 같은 크기로 가능한 모든 표본을 추출하여 평균값을 구하면, 표본평균분포를 기대할 수 있음.
+
+* 정의: 동일한 크기의 모든 가능한 표본들로 얻어진 **표본평균들의 확률 분포**
+
+* 표본평균의 평균: **표본평균들의 합 / 표본의 숫자**
+
+ * 표본의 숫자 ⇒ 조건부확률($_{n}\mathrm {C}_{k}$)
+
+* 표본평균의 표본분포의 **평균**과 **표준오차**
+
+ * `평균` = $\mu$
+
+ * `표준오차` = $\frac{\sigma }{\sqrt{n}}$
+
+* n이 증가하면 표준오차가 작아져 표본분포가 좁아지게 된다.
+
+
+
+
+## 중심극한정리(Central Limit Theorem, CLT)
+
+* 어떤 모집단으로부터 **동일한 크기의 모든 가능한 표본들을 추출**하고, 이로부터 **표본평균분포를 구하면 정규분포에 근사하게 된다**. 이러한 근사화는 **표본의 크기가 커질수록 더욱 강화된다.**
+
+* $\bar{X} \sim N ( \mu, ( \frac{\sigma}{\sqrt{n}})^2 )$
+
+* z = $\frac{\bar{X} - \mu}{\sigma / \sqrt{n}}$
+
+
+## 표본평균의 확률분포의 활용
+
+* n > 30 일때 (중심극한 정리에 근거)
+
+ * 모 표준편차 $\sigma$ 을 알 때의 표준화 : z = $\frac{\bar{X} - \mu}{\sigma / \sqrt{n}}$ ~ N(0,1)
+
+ * 모 표준편차 $\sigma$ 을 모를때 → 표본 표준편차($s$)를 $\sigma$ 대신 활용 : z = $\frac{\bar{X} - \mu}{s / \sqrt{n}}$ ~ N(0,1)
+
+* n < 30 이고, 모분포가 정규분포일때
+
+ * 모 표준편차 $\sigma$ 을 알 때의 표준화 : z = $\frac{\bar{X} - \mu}{\sigma / \sqrt{n}}$ ~ N(0,1)
+
+ * 모 표준편차 $\sigma$ 을 모를때 → t분포 활용 : t = $\frac{\bar{X} - \mu}{s / \sqrt{n}}$ ~ Student’$t$ 분포
+
+
+## 표본비율의 분포
+
+* 분석의 대상이 모집단의 평균이 아니라 **비율인 경우**
+
+* 예시) 제품의 불량률, 특정 선거후보자에 대한 투표자의 지지율
+
+* 표본비율에 대한 평균 : $p$
+
+* 표본비율에 대한 분산 : $\frac{pq}{n}$
+
+* 조건) np ≥ 5이고 n(1-p)≥ 5 일때
+
+ * $N~(p, \frac{p(1-p)}{n})$
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-Two-Sample-Hypothesis-Test.md b/src/content/posts/BS-Two-Sample-Hypothesis-Test.md
new file mode 100644
index 00000000..15c3c1de
--- /dev/null
+++ b/src/content/posts/BS-Two-Sample-Hypothesis-Test.md
@@ -0,0 +1,69 @@
+---
+title: "11. 두 표본 가설 검정"
+date: 2022-06-24
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+## Contents
+
+* 모표준편차를 알고 동일할 때, 두개의 독립적인 모평균이 동일하다는 가설검정을 수행한다.
+
+* 모표준편차를 알지 못할 때, 두 개의 독립적인 모평균이 동일하다는 가설검정을 수행한다.
+
+* 쌍세 표본 또는 종속적 표본의 관측자료를 통한 모집단 평균의 차이에 대한 가설검정을 수행한다.
+
+* 독립적인 표본과 종속적인 표본의 차이를 설명한다.
+
+
+## 독립표본
+
+* `독립표본` : 독립 모집단들로부터 별도로 수집된 표본들
+
+ * 각 모집단은 다른 모집단에서 일어난 사건에 영향을 받지 않음
+
+* 두 표본을 대상으로 하는 가설 검정: **독립표본**
+
+ * 두 모집단 비교를 위해서, **두 표본의 차이를 살펴본다.**
+
+ * 평균에 대한 두 표본검정 $\sigma$ 를 아는 경우
+
+ * $z = \frac{\bar{x_1} - \bar{x_2}}{\sqrt{\frac{\sigma^{2}}{n_1}} + \frac{\sigma^{2}}{n_2}}$
+
+
+## 가설검정 절차
+
+### 두 표본을 활용할 경우 가설검정의 단계
+
+* 단계1: 가설의 설정 → 귀무가설 & 대립가설
+
+* 단계2: 유의수준 결정 → $\alpha$ = 0.01 or $\alpha$ = 0.05
+
+* 단계3: 검정통계량 선택 → z or t
+
+
+
+* 단계4: 임계값 및 기각영역 결정 → 기각값: $\alpha$에 해당하는 z값 또는 t값 , 기각영역: 기각값이 결정
+
+* 단계5: 귀무가설의 기각여부 → 검정통계량 계산 후 기각값 또는 기각영역과 비교
+
+
+## 종속표본
+
+* `종속표본` : 종속된 모집단들로부터 수집된 서로 대응되는 표본들
+
+* 종속표본의 구조: 두 표본의 관측치 간 차이값으로 가설검정을 진행함
+
+* 차이값을 하나의 표본으로 간주하여 가설검정을 진행
+
+* 평균 → $\bar{d} = \frac{\sum d_i}{n}$
+
+* 표준편차 → $s_d = \sqrt \frac{\sum (d_i - \bar{d})^2}{n-1}$
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/BS-What-Is-Statistics.md b/src/content/posts/BS-What-Is-Statistics.md
new file mode 100644
index 00000000..78435646
--- /dev/null
+++ b/src/content/posts/BS-What-Is-Statistics.md
@@ -0,0 +1,203 @@
+---
+title: "01. 통계학은 어떠한 학문인가"
+date: 2022-04-16
+categories: ["대학교"]
+tags: ["경영통계"]
+use_math: true
+---
+
+> 이 글은 경영학부 경영통계 수업에서 배운 자료들을 정리한 내용입니다.
+
+* Key Point : 정성변수 vs 정량변수 / 이산변수 vs 연속변수/ 4가지 척도
+
+## Contents
+
+* 통계학을 정의한다.
+
+* 기술통계학과 추론통계학 차이를 구분한다.
+
+* 정성변수와 정량변수, 이산변수와 연속변수를 분류한다.
+
+* 명목척도, 순서척도, 등간척도, 비율척도를 구분한다.
+
+
+## 통계학 정의
+
+* 통계(statistic): 수치적인 사실
+
+* 통계학: 보다 효과적인 의사결정을 도와주는 데이터 수집, 정리, 표현, 분석 및 해석에 대한 과학
+
+* 변동성(Variability)
+
+ * 통계는 **변동성이 있는 데이터를 다루는 과학이다**
+
+
+## 통계학의 종류
+
+* `기술통계학(descriptive statistics)`
+
+ * **데이터를 이용하여 유용한 정보를 주는 방식**으로 체계화하고, 요약하고, 표현하는 방법 → 2~4장에서 다룰 내용
+
+* `추론통계학(inferential statistics)`
+
+ * **표본에 기반**하여 모집단의 특성으 추정하기 위한 방법
+
+ * 한정된 크기의 데이터(표본)을 사용하여 의사결정을 하게 됨
+
+ * 모집단(population): 관심의 대상인 모든 개인이나 개체
+
+ * 표본(sample): 관심의 대상인 모집단의 부분 또는 일부
+
+
+### 모집단과 표본
+
+* 모집단과 모수
+
+ * 모집단(population): 통계분석의 대상이 되는 모든 개체들의 집합
+
+ * 모수(parameter): 모집단의 특성을 나타내는 수치로 모평분, 모분산, 모비율이 쓰임
+
+* 표본과 표본 통계량
+
+ * 표본(sample): 모집단으로부터 임의로 추출된 모집단의 부분집합
+
+ * 표본통계량(sample statistic): 표본의 특성을 나타내는 척도로 표본평균, 표본분산, 표본비율이 쓰임
+
+* 표본조사의 이유
+
+ * 모집단의 수가 클 경우의 전수 조사: **시간, 비용 등의 이유**로 불가능한 경우가 많다.
+
+
+### 통계적 의사결정(Statistical decision making)
+
+* 통계학의 목적은 표본정보를 바탕으로 모집단의 특성을 추측하는 것
+
+* 부분적인 정보를 근거로 예측이나 의사결정을 내리는 것을 통계적 의사결정
+
+
+## 변수의 종류
+
+* 정성적 변수(qualitative Variables)
+
+ * 비 수치적인 특성치 또는 속성으로서 관찰 또는 기록된 변수
+
+ * 예시) 성별, 음료수 선호도, 눈의 색깔
+
+* 정량적 변수(quantative Variables)
+
+ * 수치적으로 기록된 변수
+
+ * 예시) 계좌에 있는 잔액, 자동차 배터리의 수명, 회사의 직원 수
+
+* 정량적 변수(quantative variables)는 이산변수와 연속변수로 분리됨
+
+* 이산변수(discrete variables)
+
+ * 대개 수를 **센(counting)** 것의 결과
+
+ * 두 값 사이에 “차이"가 존재
+
+ * 예시) 집의 침실 수, 경영통계학 각 분반의 학생 수
+
+* 연속변수(continuous variables)
+
+ * 대개 **측정(measurement)**의 결과
+
+ * 특정한 범위 내의 어떤 값도 가질 수 있다고 가정
+
+ * 예시) 타이어 내부의 공기압, 한국에서 LA까지의 비행시간
+
+
+### 변수의 종류 요약
+
+* 변수의 유형
+
+ * 정성변수
+
+ * 혼인 여부
+
+ * 머리카라 색깔
+
+ * PC의 상표
+
+ * 정량변수
+
+ * 이산변수
+
+ * 가구당 자녀 수
+
+ * TV 세트 수
+
+ * 연속변수
+
+ * 납부한 소득세 금액
+
+ * 학생의 체중
+
+ * 대한민국 연중 강우량
+
+ * 정성적변수 vs 정량적변수 구분
+
+ 
+
+
+
+## 측정의 척도(levels of measurement)
+
+* 측정의 척도는 **명목, 순서, 등간, 비율** 4가지로 구분
+
+1. `명목 척도` : 카테고리로 분류됨. 하지만, 특정 순서대로 정렬할 수 없음
+
+2. `순서 척도` : 순서대로 정렬 O. 하지만, 데이터 값 간의 차이를 확인할 수 없고 차이가 의미가 없음.
+
+3. `등간 척도` : 순서대로 정렬 O, 데이터 값 간의 차이 계산 및 차이가 의미 O, 하지만, 절대적인 0점이 없음.
+
+4. `비율 척도` : 순서대로 정렬 O, 데이터 값 간의 차이 계산 및 차이가 의미 O, 절대적인 0점 존재 O 및 의미가 있음. 비율을 측정하는 것이 가능 및 의미 O
+
+* 명목의 척도는 가장 하위의 측정척도
+
+ * 카테고리 분류 가능, 빈도수 셀 수 있음
+
+ * 특정한 순서 X
+
+ * 예시) 초콜릿에 대한 색상별 분류, 학생에 대한 성별 분류
+
+* 순서 척도
+
+ * 정의된 속성 또는 정성변수에 대한 **상대적인 순위 또는 등급에 기반**
+
+ * 변수는 오로지 **순위**가 매겨지거나 **빈도수가 세어 짐**
+
+ * 각 그룹간의 차이는 알 수 없으며 의미가 없음
+
+ * 예시) 상위 10위까지 사업하기 가장 좋은 환경을 가진 주, 교수에 대한 학생의 강의평가
+
+* 등간 척도
+
+ * 서열척도의 모든 특징을 포함하면서 값들 사이의 간격 또는 차이가 의미 있음.
+
+ * 알려진 측정단위의 척도를 기반으로 함
+
+ * 절대적인 “0”이란 값이 존재하지 않음
+
+ * 예시) 온도 체계(섭씨), 의복 사이즈
+
+* 비율 척도
+
+ * 등간척도 + 두 숫자 사이의 비율이 의미가 있음, 절대적인 “0” 존재
+
+ * 예시) 임금, 주가의 변화, 무게
+
+* 4가지 척도 비교-1
+
+
+
+* 4가지 척도 비교-2
+
+
+
+## Reference
+
+* [경영경제통계학17판](https://m.yes24.com/Goods/Detail/60561679)
+
+ * Lind, Marchal, Wathen, (2018), McGrawHill, 강종열 등 역, 지필미디어
\ No newline at end of file
diff --git a/src/content/posts/Book-Growing-Up-Together.md b/src/content/posts/Book-Growing-Up-Together.md
new file mode 100644
index 00000000..399b60b0
--- /dev/null
+++ b/src/content/posts/Book-Growing-Up-Together.md
@@ -0,0 +1,168 @@
+---
+title: "[리뷰] 함께 자라기 (애자일로 가는 길)"
+date: 2023-11-19
+categories: ["에세이"]
+tags: ["책"]
+---
+
+> 이 글은 [함께 자라기](https://product.kyobobook.co.kr/detail/S000001033071) 책을 읽고 저의 생각과 같이 정리한 내용입니다.
+
+
+
+책을 2월에 사고 난 뒤 9개월이 지난 지금에서야 다 읽게 되었다.
+
+2월 당시에는 팀 프로젝트를 하기 전이라, `협업`에 대해 크게 흥미가 없어서 그런지 집중이 잘 안됐다.
+
+하지만 3월부터 10월까지 진행했던 [히빗](https://github.com/hibit-team/hibit-backend)과 8월부터 9월까지 진행했던 [굿프렌즈](https://github.com/woorifisa-projects/GoodFriends) 팀 프로젝트를 경험한 이후에, 이 책을 다시 읽어보자는 생각이 들었다.
+
+그래서 기존에 중반까지 읽었던 내용을 주말 동안 다시 복습 겸? 읽으면서 완독을 했다.
+
+확실히 협업과 관련된 경험을 하고 나서 읽으니까, 공감된 부분들도 많았고 더 관심 있게 읽으면서 빠르게 완독할 수 있었다.
+
+아래는 책을 읽으면서 개인적으로 느낀 인상 깊었던 부분 몇 개를 내 생각과 같이 정리해 보려고 한다.
+
+## 실제 실력과 상관있는 것은 **의도적 수련**이다.
+
+"소프트웨어 개발에서 개발에서 점차 경력 연수를 중시하는 문화가 사라질 것이다. 따라서 개발자들은 자신의 경력 연차 외에 다른 것에도 신경을 써야 한다."
+
+몇 년 전까지만 해도 안데쉬 에릭손의 `1만 시간 법칙`이 유행이었다. 그런데 이 법칙에서 나오는 시간을 **본인의 `경력`과 연관 지어선 안된다**는 의미이다.
+
+예를 들어, 일상생활에 우리는 어렸을 때부터 하루 세 번 3분씩 이를 닦는다. 하지만 이를 매일 닦는다고 10년, 20년 이후에도 이를 닦는 경력이 실력과 관련이 없다는 것을 누구나 알 수 있다.
+
+여기서 말하는 `의도적 수련`(deliberate practice)이란 **자신의 기량을 향상시킬 목적으로 반복적으로 하는 수련**을 의미한다.
+
+국내 여러 스포츠 종목에서 국가대표로 지내는 선수분들은 세계 대회에 출전해서 메달을 따기 위해 **매일 본인의 약점을 개선하고, 강점을 더 강화하는 애쓰는 수련**을 하고 있다.
+
+이 글을 읽고, '내가 공부한 것이 의도적인 수련인가?'라는 생각을 하게 되었다. 단순히 남이 작성한 글을 읽거나 강의를 듣는 시간이 아니라, 누군가한테 설명할 정도의 수준까지 **내 것**으로 만드는 시간이 `의도적인 수련`이라고 생각한다.
+
+정리하자면, 단순히 인풋만 하는 게 아니라 아웃풋까지 이어 나가는 과정과 결과가 중요하다고 생각한다.
+
+> 유튜브 채널: 개발바닥 - [용기를 잃지않는 개발자 이력서](https://www.youtube.com/watch?v=4OWuDjCk16M&ab_channel=%EA%B0%9C%EB%B0%9C%EB%B0%94%EB%8B%A5) (55초 ~)
+
+위의 내용과 완전히 일치하진 않지만, 최근 개발바닥 채널에서 "용기를 잃지않는 개발자 이력서"에서도 향로님이 말씀해주신 내용을 가져와 봤다.
+
+
+
+
+
+나는 ~~을 위해 이걸 했고, 그래서 그 결과가 ~~이다 이어져야 개인의 실력이 성장하지 않을까 생각한다. 흔히 이력서를 작성할 때에도 `Why - What - How - Result`과 같이 작성해야 보는 사람에게도 더 읽기 쉬워진다.
+
+## 자기개발은 **복리**로 돌아온다.
+
+IT 기업에서 종사하시는 여러 직무의 분들이 연말에 한 해를 되돌아보면서 **회고**라는 글을 작성한다.
+
+일 년 회고를 할 때 항상 되짚어 보는 것 중 하나가 **나 자신에게 얼마나 투자를 했냐**라는 것이다.
+
+자기개발이 중요한 이유는 현재 나에게 무엇을 투자했느냐가 1년, 혹은 2년 후의 나를 결정한다고 느끼기 때문이다.
+
+2022년 2학기 때 대학교에서 '운영체제'라는 과목을 수업하시는 교수님이 하신 말씀이 기억이 문득 생각났다.
+
+교수님이 이전 삼성전자에 재직할 당시에, '전체 사원들 중 10% 이하 만이 자기개발을 하고, 나머지 90%는 현재 삶에 만족하는 경우가 많다' 라고 하셨다.
+
+이 책에서도 2시간 이상 자기개발에 투자하는 사람이 13.2%밖에 되지 않았다. (물론 2012년에 조사한 자료라, 현재와 다를 수 있다)
+
+평소 자기개발을 열심히 하시면서, 블로그를 운영하시는 여러 현직자분들이 좋은 회사에 이직한 것을 블로그를 통해 많이 봤다.
+
+나는 회사에서 일을 해본 경험이 적고, 이직 경험도 없어서 크게 와닿지는 않지만, 꾸준히 자기개발을 하면서 그러한 경험을 맛보는 기회를 언젠간 찾아오지 않을까 기대해 본다.
+
+## 적절한 실력과 작업 난이도를 조절하면서 성장한다.
+
+
+
+위 그림은 `실력`과 `작업 난이도`를 기준으로 심리 상태를 그린 도식이다.
+
+주목해야 할 부분은 `몰입`에 해당하는 영역인데, 이때 최고 수준의 **집중력**을 보이고, 그 덕분에 **퍼포먼스**나 **학습 능력**이 최대치가 될 수 있다고 한다.
+
+해당 영역이 아닌, 실력이 작업 난이도를 초과하면 **지루함**을 느끼는 영역이나 실력보다 높은 난이도의 작업을 하면 **불안함**(혹은 두려움)을 느낀다고 한다.
+
+'팬시님! 현 프로젝트에 통합 및 인수 테스트를 작성해 주세요~ '와 같은 작업이 왔을 때 어렵다고 느껴지면, 우선 단위 테스트 작성하는 방법부터 익히도록 하자.
+
+## 실수는 예방하는 것이 아니라 **관리**하는 것이다.
+
+
+
+**`실수 관리 문화`** 에서는 실수가 나쁜 결과를 내기 전에 빨리 회복하도록 돕고, 실수를 공개하고, 실수에 대해 서로 이야기하고 거기에서 배우는 분위기가 생긴다.
+
+회사 문화가 실수 관리에 가까울수록 그 **기업의 혁신 정도**가 더 높고, **회사의 수익성**이 더 높다는 연구 자료가 있다.
+
+즉, 실수 관리를 하는 문화일수록 `학습`을 더 잘한다.
+
+팀 프로젝트를 하다 보면 반드시는 아니지만, 실수가 종종 나타나는 경우가 있다. 그럴 때마다 실수를 한 팀원에게 따끔한 충고보단 따뜻한 조언을 하는 게 중요하다고 생각한다.
+
+똑같은 실수에 대해 반복적이면 안 되겠지만, 처음 하는 실수에 대해서는 누구에게나 생길 수 있고, 그런 상황이 발생할 때 어떻게 해야 나은 방향으로 개선할 수 있을지 스스로에게 질문을 하면서 답을 찾아가 보자.
+
+## 사회적 자본과 기술
+
+새로운 기술을 개인 또는 외부 스터디 활동을 통해서 배웠다고 회사에 바로 적용하기가 쉽지 않다.
+
+아무리 기술적인 실천법이라고 해도 그 기술은 **사회적 맥락**속에서 실천되어야 하며, 그 기술의 성공을 위해서는 **사회적 자본과 사회적 기술**이 함께 필요하다.
+
+이 책에서는 **신뢰 구축을 보다 잘하는 사람**을 사회적 자본이 좋은 사람들이라고 합니다. 그리고 사회적 자본이 좋은 사람들이 통상 사회적 기술이 뛰어나다고 합니다.
+
+뛰어난 개발자일수록 **동료와의 협업**에 시간을 투자하는 부분으로 **커뮤니케이션**의 중요성을 강조합니다.
+
+TDD(테스트 주도 개발)이라는 프로그래밍 기법을 가져왔다면, 해당 기법 전체를 단번에 적용하는 것보다는 **팀원들과 지속적으로 협업하면서 기초적인 개념부터 천천히 도입하는 방향**으로 가는게 좋다고 생각한다.
+
+실제로 이전 팀 프로젝트에서 DDD 패턴을 도입했을 때, 해당 개념의 전체적인 것을 적용하지 않고 일부의 개념만 도입하고 이후에 추가하는 식으로 진행했었다.
+
+## 신뢰 자산의 중요성
+
+신뢰 자산이 높은 조직은 커뮤니케이션 효율이나 생산성이 높다.
+
+특히 애자일을 제대로 하려는 조직이라면 이 부분에 많은 노력을 들이고 있다.
+
+이 책에서는 신뢰를 쌓는 데에 널리 사용되는 한 가지 방법은 **투명성, 공유, 인터랙션**이라고 한다.
+
+자신이 한 작업물을 투명하게 서로 공유하고 그에 대해 피드백을 주고받으며 인터랙션을 하는 것이다.
+
+개발자끼리 팀 프로젝트를 진행했을 때, 기획부터 같이 진행한 적이 있었다. 그때 각자만의 아이디어를 공유할 때 **한 사람당 여러 개의 아이디어를 공유**했는데, 여기서도 그와 관련된 글이 있다.
+
+나의 아이디어가 1개밖에 없다면, `아아디어=나`가 되어서 상대방이 나에게 뭐라고 하기가 쉽지 않다.
+
+반면에 복수로 공유하면, 그런 불안감이 상대적으로 덜하고, 부정적인 피드백을 수용하려는 마음도 있다.
+
+이 책에서는 복수 공유를 한 그룹이 단수로 공유하는 것보다(개인당 아이디어가 1개) **신뢰도가 높아지고 성과도 더 좋았다**고 합니다.
+
+## 설득할 때 주관적인 부분도 필요하다.
+
+품질 전문가 제럴드 와인버그는 품질을 다음과 같이 정의했습니다.
+
+"품질 이란 누군가에게 가치가 되는 것이다."
+
+사실 품질은 사람을 빼놓고 이야기할 수가 없다.
+
+고품질을 얻으려고 노력하는 사람들은 '인간'에 대한 이해가 필수적이다.
+
+`설득`도 마찬가지이다. 대부분의 사람들이 설득을 하기 위해 객관성이 필요하다고 하는데, 사실 **객관성을 정의하는 것도 사람**이기 때문에, 이 개념 자체가 매우 주관적이라는 것이다.
+
+회사에는 직원과 사장이 있고, 중요한 부분을 결정하고 실행하기 전에는 직원이 사장으로부터 승인을 받아야 하는 경우가 있다.
+
+사장도 사람이기 때문에, 사장을 설득하라면 어쩔 수 없이 객관적인 자료뿐 아니라 **감정적이고 직관적인 부분**도 필요하다.
+
+이 책에서는 남을 설득하려면 논리성과 객관성에 대한 환성을 버려야 하고, 그래야 현실적으로 설득이 가능하다고 한다.
+
+결국, 설득에 성공하려면 **우선 그 사람을 이해하는 것에서 출발**해야 한다. 그런 이유로 설득을 하기 위해 '객관적'인 자료뿐 아니라 그 이상으로 상대를 이해하는데 많은 시간을 투자해야 한다.
+
+상대방에게 신뢰감을 잃어버리면, 아무리 좋은 '객관적'인 자료와 근거가 있더라도 소용없다.
+
+## 심리적 안전감
+
+이 책에서는 `심리적 안전감`을 내 생각이나 의견, 질문, 걱정, 혹은 실수가 드러났을 때 **처벌받거나 놀리지 않을 거라는 믿음**을 말한다고 한다.
+
+이 개념은 정말 중요하다고 생각한다. 어떤 프로젝트를 진행할 때, 팀원 간의 의견을 주고 받는게 없다면, 이러한 심리적 안전감이 떨어질 것이고, 갈수록 상대방에 대한 이해가 낮아질 것이라고 본다.
+
+히빗 프로젝트를 진행하면서, 매주 회의를 팀원들과 같이 진행하면서 모르는 부분이나 궁금한 부분들을 적극적으로 물어봤고, 나에게 질문이 들어오는 경우에도 최대한 자세히 알려주려고 노력했다.
+
+개발을 하면서, 어려운 부분을 마주쳤을 때 혼자서 끙끙 앓는 것보다는 혼자서 어느 정도의 시간을 투자한 뒤에 동일 직군의 팀원에게 물어보는게 팀 전체적으로 더 도움이 된다고 생각한다.
+
+## Review
+
+이 책의 제목인 `함께 자라기`는 함께(협력)과 자라기(학습)을 내포하고 있다.
+
+협력과 학습에 대한 중요성을 여러 가지 상황을 예시로 들면서, 좋은 해결 방안을 알려주고 있는 내용이었다.
+
+이후에 팀 프로젝트를 진행한다면, 이 책을 다시 한번 복기해봐야 겠다는 생각이 들 정도로, 나에게 도움을 많이 준 책이다.
+
+## Reference
+
+* [책: 함께 자라기](https://product.kyobobook.co.kr/detail/S000001033071)
\ No newline at end of file
diff --git a/src/content/posts/Book-Interview-Questions.md b/src/content/posts/Book-Interview-Questions.md
new file mode 100644
index 00000000..1622ccb8
--- /dev/null
+++ b/src/content/posts/Book-Interview-Questions.md
@@ -0,0 +1,150 @@
+---
+title: "[리뷰] 삶의 태도를 돌아보는 면접의 질문들 - 면접을 넘어, 일하는 태도를 고민하다"
+date: 2025-02-12
+categories: ["에세이"]
+tags: ["책"]
+---
+
+> 이 글을 [삶의 태도를 돌아보는 **면접의 질문들**](https://product.kyobobook.co.kr/detail/S000214779954) 책을 읽고,
+> 책의 내용을 정리하며 필자의 개인적인 생각을 함께 정리한 것입니다.
+
+## 시작하며
+
+
+
+이 책의 제목을 보면 처음에는 ‘면접을 어떻게 잘 볼 수 있을까?’라는 궁금증에서 읽기 시작했다.
+
+하지만 책을 읽어갈수록, 면접 기술을 배우는 것을 넘어 면접이라는 과정이 어떤 의미를 가지는지 고민하게 되었다.
+특히 직장인이라면, 면접을 단순한 평가가 아니라 자신의 일하는 방식과 태도를 되돌아볼 기회로 삼을 수 있다는 점에서 더욱 의미 있는 책이었다.
+
+이 책은 단순히 면접을 잘 보는 법을 알려주는 것이 아니라, **자신이 해왔던 일들을 돌아보고, 앞으로 어떤 방식으로 일해야 하는지 고민할 기회를 제공하는 책**이다.
+필자는 책을 읽으며 정리한 내용을 개인적인 경험과 해석을 덧붙여 작성했다. 따라서 본문의 내용이 실제 책과 100% 일치하지 않을 수 있다는 점을 미리 밝힌다.
+
+
+---
+
+## 1. 자기 성찰과 솔직한 답변의 중요성
+
+면접을 준비하면서 가장 먼저 해야 할 일은 **자기 성찰**이다.
+"왜 이 회사를 지원하는가?"라는 질문에 대해 충분히 고민하고, 자신의 장점과 단점, 그리고 이직의 이유를 논리적으로 정리해야 한다.
+이는 단순히 좋은 회사라서가 아니라, 자신의 커리어 목표와 회사의 방향성이 어떻게 맞닿아 있는지를 설명하기 위함이다.
+
+책을 읽으며 필자는 대학 시절 인턴을 지원할 때 이러한 고민을 충분히 하지 못했던 점을 반성하게 되었다.
+여러 회사에 지원하다 보니 면접을 위한 준비 시간이 부족했고, 면접관이 납득할 만한 논리를 구성하지 못한 경우가 많았다.
+하지만 경력직의 경우에는 더욱 신중한 접근이 필요하다는 점을 다시 한번 깨닫게 되었다.
+
+또한, 면접에서 솔직한 답변이 중요하다는 점도 강조된다.
+여기서 말하는 "솔직함"이란 무조건 사실을 나열하는 것이 아니라, **자신이 어떤 성과를 냈고, 실패를 통해 무엇을 배웠으며,
+이를 극복하기 위해 어떤 노력을 했는지를 명확하게 전달하는 것**이다. 단점을 숨기기보다는,
+이를 극복하기 위한 노력과 성장을 함께 설명하는 것이 더 효과적이다. 면접관이 원하는 것은 완벽한 지원자가 아니라,
+**스스로 성장하고 발전할 수 있는 사람**이라는 점을 기억해야 한다.
+
+마지막으로, 면접 질문에는 정해진 정답이 없는 경우가 많다. 특히 경험과 상황을 반영해야 하는 질문에서는
+**그 답을 도출하는 과정**이 더욱 중요하게 평가된다. 면접관이 원하는 것은 단순한 정답이 아니라, 지원자의 사고방식과 문제 해결 능력을 확인하는 것이다.
+
+결국, 면접에서 가장 중요한 것은 면접관이 '이 지원자와 함께 일하고 싶다고 느끼는가' 하는 점이다.
+이를 위해서는 스스로를 돌아보고, 자신이 어떤 일을 좋아하고 어떤 환경에서 즐겁게 일할 수 있는지를 고민하는 과정이 필요하다.
+
+
+## 2. 면접을 대화처럼 주도적으로 이끌기
+
+면접은 단순한 질문과 답변이 아니라, 면접관과의 자연스러운 대화를 통해 지원자가 자신을 효과적으로 표현하는 과정이다.
+이를 위해 지원자는 면접을 수동적으로 받아들이기보다는 **주도적으로 이끌어나가려는 자세**를 가져야 한다.
+
+면접관은 `자기소개서`를 통해 지원자를 파악하고 면접의 방향을 설정한다.
+따라서 단순 암기보다는 **자신의 개성과 강점을 자연스럽게 드러낼 수 있도록 이야기하는 것이 중요하다**.
+기계적으로 외운 내용을 말하면 어색한 분위기가 형성될 수 있으므로, 자연스러운 흐름을 익히는 방식으로 연습하는 것이 효과적이다.
+
+또한, 면접에서는 본인의 업무를 체계적으로 정리하여 전달하는 능력이 중요하다.
+면접관이 지원자의 직무를 완벽히 이해하고 있지 않을 수 있기 때문에, 누구나 이해할 수 있도록 논리적으로 설명하는 연습이 필요하다.
+평소 자신의 업무 내용을 정리하는 습관을 기르고, 면접관이 어떤 부분을 궁금해할지를 미리 고민해보는 것이 좋다.
+
+면접에서 자주 등장하는 질문 중 하나는 "당신을 꼭 채용해야 하는 이유"와 "당신을 채용하지 말아야 하는 이유"이다.
+강점을 이야기할 때는 자신이 가진 차별성을 강조하고, 단점을 이야기할 때는 그것이 강점에서 파생된 것임을 밝히면서, 이를 극복하기 위한 노력을 함께 설명하는 것이 효과적이다.
+
+마지막으로, 면접자는 단순히 면접관의 질문에 답하는 사람이 아니라, **필요할 때는 면접관에게 질문을 던질 수도 있다**.
+면접은 일방적인 평가가 아니라, 면접관과 지원자가 서로를 알아가는 과정이다.
+면접 중 질문의 의미가 명확하지 않거나, 좀 더 구체적인 의도를 알고 싶다면 면접관에게 질문하는 것이 도움이 될 수 있다.
+
+결국, 면접은 단순한 질문과 답변이 아니라, **면접관과 지원자가 서로의 ‘`Fit`’을 확인하는 과정**이다.
+면접을 준비하면서 자신과 회사에 대해 충분히 고민하고, 면접 중에는 자연스럽고 당당한 태도로 자신의 생각을 전달하는 것이 중요하다.
+
+
+## 3. 면접을 객관적으로 바라보기
+
+면접에서 당락이 결정되는 시간은 대개 **초반 10분 내외**이며, 이후의 시간은 그 결정을 검증하는 과정이라고 볼 수 있다.
+따라서 면접이 진행되는 동안 자신을 `3인칭` 관점에서 바라보며 면접관이 어떤 점을 주목하고 있는지를 생각해보는 것이 도움이 된다.
+
+이력서를 작성할 때는 **자신의 경력을 타인의 시각에서 분석하는 과정**이 중요하다.
+면접관이 쉽게 눈에 띌 만한 요소가 무엇인지 파악하고, 예상 질문을 미리 정리해보는 것이 좋다.
+자신을 객관적으로 이해해야 면접관이 어떤 부분을 궁금해할지 예측할 수 있으며, 이에 맞는 답변을 준비할 수 있다.
+
+이직 사유를 설명할 때는 설득력 있는 논리를 갖추는 것이 중요하다.
+근무 기간이 짧다면 그 이유와 그 경험을 통해 무엇을 배웠는지에 대해 이야기해야 한다.
+반대로 한 직장에서 오래 근무했다면, 현재 회사에서의 경험이 특정 환경에만 국한되지 않았는지 점검해볼 필요가 있다.
+면접에서는 자신의 선택을 돌아보고, 그 이유를 논리적으로 전달하는 것이 중요하다.
+
+공백기가 있다면 이를 부정적으로 보기보다는, 자신을 알아가는 시간으로 활용했다는 점을 강조하는 것이 좋다.
+솔직하면서도 의미 있는 경험으로 풀어나가면 면접관에게 긍정적인 인상을 줄 수 있다.
+또한, 학벌이나 학점보다는 **자신의 가치관과 경험을 어떻게 설명하는지가 더 중요하다**.
+학점이 낮다면, 대학 이후 관심을 갖게 된 분야와 그 계기, 그리고 그 경험이 자신의 삶에 어떤 영향을 미쳤는지를 이야기하는 것이 효과적이다.
+
+1차 면접과 2차 면접의 질문 유형은 다를 수 있다. 1차 면접에서는 ‘What’(무엇을 했는가)에 대한 질문이 많다면,
+2차 면접에서는 ‘Why’(왜 그렇게 했는가)와 ‘How’(어떻게 해결했는가)에 대한 질문이 주를 이룬다.
+특히 2차 면접에서는 **면접관의 시각에서 질문의 의도를 파악하고, 논리적으로 자신의 관점을 설명하는 능력**이 중요하다.
+
+신입이든 경력직이든, 이력서 작성 시에는 자격증이나 활동 내역을 나열하는 것보다, 자신이 무엇을 좋아하고 어떤 경험을 통해 성장했는지를 강조하는 것이 더 효과적이다.
+신입의 경우에는 기존 직원에게 없는 새로운 감각과 적극성을 보여주는 것이 중요하며, 지원하는 회사와 자신의 경험을 연결하는 것이 필요하다.
+
+또한, 지원하는 회사의 제품과 서비스를 직접 경험하고 이에 대한 의견을 정리하는 것이 필요하다.
+필자 역시 무조건 많은 회사에 지원하기보다는 정말 가고 싶은 회사라면 해당 회사의 제품과 서비스를 깊이 이해하고, 이를 바탕으로 지원 동기와 면접 답변을 구성하는 것이 중요하다고 생각한다.
+면접에서 구체적인 생각을 전달한다면, 면접관 입장에서도 지원자에 대한 긍정적인 평가를 할 가능성이 높다.
+
+
+## 4. 몰입의 경험과 나를 표현하는 법
+
+일과 관련되지 않더라도, **무언가에 깊이 몰입한 경험은 업무에도 긍정적인 영향을 미칠 수 있다**.
+스티브 잡스가 스탠퍼드 연설에서 언급한 ‘Connecting Dots’ 개념처럼 현재 관심 있는 것에 완전히 몰입하는 순간이 필요하며,
+그러한 경험이 예상치 못한 방식으로 미래에 연결될 수도 있다.
+
+삶은 자신이 의도한 대로 흘러가지 않을 때가 많고, 선택의 연속이다.
+그렇기 때문에, 자신이 몰입했던 경험이 무엇인지 떠올려 보고, 그것이 자신의 성장에 어떤 영향을 미쳤는지를 돌아보는 과정이 중요하다.
+면접에서는 단순히 경험을 나열하는 것이 아니라 그 경험이 자신을 어떻게 변화시켰고, 어떤 배움을 얻었는지를 중심으로 설명하는 것이 효과적이다.
+
+일하면서 즐거웠던 순간이 있었다면, **왜 그 순간이 즐거웠는지를 탐구하는 것**도 도움이 된다.
+자신이 어떤 상황에서 몰입하고 만족감을 느끼는지 이해하면, 더 나은 커리어 방향을 설정하는 데에도 도움이 된다.
+아직 그런 경험이 없다면 어떤 환경에서 흥미를 느낄 수 있을지 고민하고, 직접 경험해보며 탐구하는 과정이 필요하다. 이 과정을 통해 자신을 더 깊이 이해할 수 있다.
+
+업무를 잘하기 위해서는 무언가에 깊이 빠져보는 것도 중요하지만, **때로는 현재 하고 있는 업무에서 한 걸음 물러나 넓은 시야에서 바라볼 수 있어야 한다**.
+바쁜 일상 속에서 이런 고민을 하기 쉽지 않지만, 스스로를 돌아보며 일하는 사람과 그렇지 않은 사람 사이에는 시간이 갈수록 성장의 차이가 벌어진다.
+
+또한, 업무를 하면서 자신이 가진 관점과 생각을 다른 사람에게 명확하게 설명하는 능력이 중요하다.
+면접에서도 마찬가지로, 단순히 ‘정답’을 맞히는 것이 아니라, **자신의 생각을 논리적으로 설명하고 상대방이 공감할 수 있도록 전달하는 것이 중요하다**.
+이를 위해 평소에 다음과 같은 질문을 스스로에게 던져보는 습관이 필요하다.
+
+* 나는 왜 이 업무를 하는가?
+* 정말로 하고 싶은 일인가?
+* 이 일을 잘하기 위해 필요한 것은 무엇인가?
+
+면접에서는 당당하고 자연스럽게 자신을 표현하는 것이 중요하다.
+면접을 준비하는 과정에서 자신에 대해 깊이 고민하고, 지원하는 회사에 대한 충분한 연구를 해야 한다.
+
+면접을 보는 순간에는 본인의 모습을 너무 포장하기보다는, 편안한 태도로 자신을 드러내는 것이 좋다.
+면접관 역시 같은 조직에서 함께 일할 ‘좋은 동료’를 찾기 위해 면접을 진행하는 것이므로, 결국 면접은 서로의 ‘Fit’을 확인하는 과정이다.
+
+면접은 단순한 평가가 아니라, **새로운 사람을 만나고 자신의 경험을 돌아볼 수 있는 좋은 기회**이기도 하다.
+
+
+## 마치며
+
+이 책은 면접을 준비하는 사람뿐만 아니라, 직장인이라면 누구나 한 번쯤 읽어볼 만한 책이라고 생각한다.
+IT 업계뿐만 아니라, 다른 업계에서도 충분히 도움이 될 만한 내용이 많다.
+
+책에서 다루는 내용들은 절대적인 정답이 존재하지 않는다.
+필자 역시 이성적으로, 비판적으로 읽으려 노력했으며, 공감이 되는 부분도 많았지만 일부는 다르게 생각하기도 했다.
+저자 또한 "이 책은 모든 면접에서 합격하는 방법을 알려주는 것이 아니다"라고 프롤로그에서 강조했다.
+
+개발자로서 아직 회사 경험이 많지 않은 필자는 이 책을 통해 ‘일’이라는 것의 의미를 다시금 진지하게 고민해볼 기회를 가질 수 있었고, 덕분에 많은 배움을 얻었다.
+
+결론적으로, 이 책은 면접을 준비하는 사람뿐만 아니라, **일하는 방식과 태도에 대해 고민하는 사람들에게도 도움이 되는 책**이다.
+만약 자신의 커리어에 대해 고민하고 있다면, 이 책을 통해 스스로를 돌아보는 시간을 가져보길 추천한다.
\ No newline at end of file
diff --git a/src/content/posts/Book-Software-Master-Craftsman.md b/src/content/posts/Book-Software-Master-Craftsman.md
new file mode 100644
index 00000000..137996c8
--- /dev/null
+++ b/src/content/posts/Book-Software-Master-Craftsman.md
@@ -0,0 +1,380 @@
+---
+title: "[리뷰] 소프트웨어 장인 리뷰"
+date: 2023-02-06
+categories: ["에세이"]
+tags: ["책"]
+---
+
+## Prologue
+
+
+
+* 우아한테크코스의 캡틴으로 불리는 `박재성`님이 0순위로 추천한 책이다.
+
+* 책을 읽고 난 소감은 개발과 관련해서 더 나은 개발자가 되기 위한 `마인드` 위주의 책이었다.
+
+* 이 책은 개인적인 일화와 현장 경험에서 비롯된 **무게감 있는 조건**이 가득했다.
+
+* 자신의 일에 자부심을 갖는 프로페셔널로 도약하기 위해 필요한 계획, 전략, 태도, 원칙 등을 여러 가지 관점에서 조언했다.
+
+* 책을 읽으면서 내가 생각한 중요한 부분이나 기억해야 할 부분들을 정리해봤다.
+
+---
+
+## Part1.이념과 태도
+
+### 21세기 소프트웨어 개발
+
+* 개발자라면 다음과 같은 여러가지를 할 수 있어야 한다.
+
+ * 고객과 대화하기
+
+ * 테스트/배포 자동화하기
+
+ * 전체 비즈니스에 영향을 미칠 기술 선정하기
+
+ * 지리적으로 분산된 팀들과 협업하기
+
+ * 고객을 도와 필요한 작업을 정의하기
+
+ * 우선순위 선정하기
+
+ * 진척 상황 보고하기
+
+ * 변경사항과 기대일정 관리하기
+
+ * 잠재 고객 및 파트너에게 제품 소개하기
+
+ * 사전 영업 활동 지원하기
+
+ * 개발 일정과 비용 산출하기
+
+ * 채용 면접하기
+
+ * 아키텍쳐 설계하기
+
+ * 비기능적 요구사항과 계약조건(SLAS) 검토하기
+
+ * 사업 목표 이해하기
+
+ * 주어진 여건에서 최적의 결정하기
+
+ * 새로운 기술 주시하기
+
+ * 더 나은 업무 방식 찾기
+
+ * 고객에게 가치 있는 상품이 전달되고 있는지 고민하기
+
+* 어떤 사람들은 `훌륭한 개발자`라면 위의 일들을 이미 해왔을 거라고 한다.
+
+### 애자일
+
+* `애자일`은 서로 다른 여러 맥락에서 따른 방법론과 테크닉의 조합이다.
+
+* 애자일 원칙의 `절차적인 부분`들은 **팀과 조직이 어떻게 구성되고 협업해야 하는지에 대한 것들을 규정**한다.
+
+ * 회의 방식, 구성원 각각의 역할, 요구사항 파악 방법, 작업 진척 속도 파악 방법, 점진적/반복적으로 일할 때 취하는 방식 등과 같은 것들이다.
+
+ * 팀에 정말로 중요한 것, 비즈니스 가치가 있는 것에 집중한다.
+
+* 애자일 원칙의 `기술적인 부분`들은 개발, 확장, 유지보수, 제품을 출하면서 어려움들에 대해 특정한 기술적 관례나 기술 자체를 매우 구체적으로 가이드한다.
+
+ * 테스트 주도 개발(TDD), 페어 프로그래밍, 지속적인 통합, 단순한 디자인 원칙 등과 같은 것들이다.
+
+
+* 게임 체인저
+
+ * 비즈니스와 고객 가치 창출에 개발자들이 직접 참여하는 것도 매우 중요하다고 주장한다.
+
+ * 소프트웨어 프로젝트의 여러 다른 방면에서도 개발팀의 책임이 있다는 인식이 산업계의 판도를 바꾸고 있다.
+
+#### 애자일 매니페스토
+
+* 다음은 애자일 매니페스토 웹사이트에서 발췌한 내용이다.
+
+* 우리는 스스로 소프트웨어를 개발하고, 다른 사람들이 개발하는 것을 도와주면서 더 나은 소프트웨어 개발 방법들을 찾고 있다.
+
+* 이 과정에서 우리는 다음과 같은 **가치**를 중요하게 생각한다.
+
+ * 절차와 도구보다는 **개성과 화합을**
+
+ * 방대한 문서 작업보다는 **동작하는 소프트웨어를**
+
+ * 계약 조건에 대한 협상보다는 **고객과의 협력을**
+
+ * 계획을 따르는 것을 넘어서서 **변화에 대처하는 것을**
+
+* 더 가치있게 여긴다. (우측의 사항에 더 높은 가치를 둔다)
+
+### 소프트웨어 장인정신
+
+* `소프트웨어 장인정신`은 소프트웨어 개발자가 **스스로 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다는 마음가짐**이다.
+
+* 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 **자부심**을 의미한다.
+
+#### 매니페스토
+
+* 소프트웨어 장인을 열망하는 우리는, 스스로의 기술을 연마하고, 다른 사람들이 기술을 배울 수 있도록 도움으로써 프로페셔널 소프트웨어 개발의 수준을 높인다.
+
+* 이러한 일을 하는 과정에서 우리는 다음과 같은 가치들을 추구한다.
+
+ * 동작하는 SW뿐만 아니라, **정교하고 솜씨 있게 만들어진 작품을**,
+
+ * 변화에 대응하는 것뿐만 아니라, **계속해서 가치를 더하는 것을**,
+
+ * 개별적으로 협력하는 것뿐만 아니라, **프로페셔널 커뮤니티를 조성하는 것을**,
+
+ * 고객과 협업하는 것뿐만 아니라, **생산적인 동반자 관계를**,
+
+* 이 왼쪽의 항목들을 추구하는 과정에서, 오른쪽 항목들이 꼭 필요함을 의미한다.
+
+* 이 매니페스토의 핵심은 부제, `프로페셔널 소프트웨어 개발의 수준을 높인다`에 있다.
+
+### 소프트웨어 장인의 태도
+
+* 고객을 만족시키기 위한 투자는 스스로 해야 한다.
+
+* 고객은 프로페셔널의 교육이 아닌, **그의 지식과 기술**에 대한 돈을 지불하는 것이다.
+
+* 소프트웨어 프로페셔널로 대우받기를 원한다면 **프로**처럼 행동해야 한다.
+
+* 이는 스스로를 발전시키는 데 자신의 `돈`과 `시간`을 들여한다는 것이다.
+
+#### 끊임없는 자기개발
+
+> 오늘날 우리는 계속해서 늘어만 가는 정보 속에, 계속해서 줄어만 가는 의미를 목도하는 세상에 살고 있다.
+>
+> - 장 보드리야르(Jean Baudrillard)
+
+독서
+
+* 커리어를 위해서라면 `개념`이나 `행동양식`에 대한 책들에 더 관심을 두는 것이 좋다.
+
+블로그
+
+* `실제 경험`, `개인적인 발견`, `성공담`, `실패담`들이 짧게 담겨 있기 때문에 소프트웨어 장인정신이나 애자일 모델에 태생적으로 궁합이 잘 맞다.
+
+* 모든 소프트웨어 개발자는 경험 수준과 관계없이 블로그가 있어야 한다. 경험과 발견을 공유함으로써 훌륭한 **프로페셔널 커뮤니티를 이루는 데 도움**이 되어야 한다.
+
+* 우선 블로그는 우리의 배움과 자기개발에 대한 **기록의 장**으로 두는 게 좋다. 무엇이든 글로 써서 기록을 남기는 것은 **가치**가 있다.
+
+기술 웹사이트
+
+* 기술 관련 웹사이트들도 **시장의 최신 동향**을 알아보기에 좋은 수단이다.
+
+### 영웅, 선의 그리고 프로페셔널리즘
+
+* 프로답게 행동하자. 빡빡한 일정을 다루기 가장 좋은 방법은 필요한 모든 것을 분석하여 **가능한 위험과 우려사항을 터놓고 관계자들과 소통**하는 것이다.
+
+* 불편한 사항들이나 우려되는 부분들은 **최대한 이른 시점**에 문제제기해야 한다.
+
+* 개발자들은 협상 기술을 익혀야 한다.
+
+* 다툼을 피하지 말고 부딪혀서 어려운 결정을 내릴 수 있어야 한다.
+
+* 우리가 정직하고 투명한 방법을 사용한다면 누군가 부당하게 피해를 입는 일 없이 팀 전체는 물론 회사에도 이득이 될 것이다.
+
+### 동작하는 소프트웨어
+
+* 동작하는 소프트웨어를 자주, 몇 주나 2개월 단위로, 가능하면 **짧은 주기**로 전달한다. (진척도를 가능하는 주된 기준)
+
+* 항상 프로젝트에 다른 사람들도 있다는 사실을 인식하고 전체 프로젝트에 미치는 영향을 감안하여 책임있게 행동해야 한다.
+
+* 점진적으로 기존 코드에 대한 테스트 코드를 작성하면서 코드에 대한 이해도를 높이고 리펙토링을 해나간다.
+
+### 기술적 실행 관례
+
+* 애자일 방법론은 빠르고 짧은 피드백 루프를 제공하여 우리가 `올바른 일`(Right Things)을 실행하고 있는지 점검하도록 도와준다.
+
+* 이것은 **실행 관례와 몇몇 활동들의 조합**으로 이루어진다.
+
+* 작업 진척도를 시각화하고, 즉각적으로 업무를 계획하거나, 우선순위를 조정하고, 최소 시장 충족 기능(MMFs: minimum marketable features)에 집중하고,
+
+ 백로그를 관리하고, 스탠딩업 미팅을 하고, 번-다운 차트를 만들고, 사용자 스토리와 시나리오를 쓰고, 제품 수용 기준을 정하는 등
+
+* 애자일 방법론에서 이야기하는 여러 다른 종류의 것들이 포함된다.
+
+* 익스트림 프로그래밍(XP)의 실행 관례에는 테스트 주도 개발(TDD), 페어 프로그래밍, 리펙토링, 단순한 디자인, 지속적인 통합 등이 있다.
+
+
+
+#### TDD(테스트 주도 개발)
+
+* TDD(테스트 주도 개발)은 테스트 코드를 먼저 작성하는 것의 진화된 버전이다.
+
+* `TDD`는 코드의 설계, 단순성, 유지보수 용이성에 대해 피드백이 빠르다. 또한 코드에 대한 살아 움직이는 문서 역할을 한다. 더불어 긍정적인 부가효과로 회귀 테스트 역할도 해준다.
+
+* 이러한 것이 `TDD`가 주는 비즈니스적 가치다.
+
+#### 페어 프로그래밍
+
+* 코드의 품질을 보증하기 위해 코드 리뷰를 많은 팀들에서 흔히 적용하고 있다.
+
+* 코드 리뷰는 시스템에 대한 지식과 유용한 코딩 스킬을 팀 전체에 전하는 데도 좋다.
+
+#### 리팩토링
+
+* 프로젝트의 시작단계부터 리팩토링을 하면 코드가 점진적으로 상태가 향상되어 나중에 리팩토링에 너무 많은 시간을 들이는 일이 없어진다.
+
+#### 실용주의
+
+* 무언가를 절대적인 진리로 바라보는 것은 바람직하지 않다.
+
+* 항상 우리가 무엇을 하고 있고 그것을 **왜 하고 있는지 질문해야 한다**.
+
+* 우리의 일에 항상 최선의 기술, 도구, 절차, 방법론 그리고 실행 관례를 선택할 수 있도록 **개발적인 사고 방식**을 가져아 한다.
+
+---
+
+## Part2.완전한 전환
+
+### 인재 채용
+
+* 이 Chapter은 지원자보다는 **면접관 입장** 위주 내용이었다.
+
+* 회사입장에서 채용공고를 작성할 때, 단순히 직무 요건 목록을 나열하는 것 보다 태도와 책임, 프로젝트 종류, 사용 기술 그리고 가치관과 회사의 문화에 집중된 내용으로 채워져야 한다.
+
+* 다음과 같은 요소를 채용공고에 넣으면 더 좋을 것 같다.
+
+ * 이런 분을 찾습니다. : 태도와 책임과 관련된 내용
+
+ * TDD : TDD를 중요시하는 회사라면 TDD 내용을, TDD가 아니면 그와 관련된 내용(이건 회사마다 Case by Case - TDD, DDD, BDD 등)
+
+ * 직무 역할 : 일하는 방식(TDD, 페어프로그래밍, 리펙토링, 지속적인 제품 릴리즈, 정기적인 콘퍼런스 혹은 이벤트 참석 등)
+
+ * 사용 중인 기술 : 프로젝트 종류와 사용 기술들
+
+* 프로젝트 관리자나 중간 관리자가 아닌 **개발자**가 제품 오너 및 이해 관계자와 협력적인 방식으로 직접적으로 함께 일한다는 것을 전달하는 것이 중요하다.
+
+* 또한 개발자 역량 향상을 위해 배우고 연습할 시간(개발 스터디, 정기적인 콘퍼런스 참석, 독서모임)을 따로 제공하고 이러한 부분이 회사에 문화적으로 녹아 있음을 강조하는 것 역시 중요하다.
+
+* 이러한 공고를 낸다면 **열정적이고 재능있는 개발자**를 끌어들이는 데 최적화될 것이다.
+
+#### 효과적인 선별 조건의 정의
+
+* 이력서에 다음과 같은 내용을 추가하면 좋을 것 같다.
+
+ * GitHub 계정
+
+ * 블로그
+
+ * 오픈 소스 활동
+
+ * 기술 커뮤니티 혹은 사용자 그룹 활동 내역
+
+ * 트위터 계정
+
+ * 좋아하는 기술서적 목록
+
+ * 참석했거나 발표했던 콘퍼런스
+
+### 소프트웨어 장인 면접하기
+
+* 면접은 **비즈니스 협상**을 하는 것이다. `회사`는 그들의 목적을 달성하는 데 도움을 줄 수 있는 개발자를 찾으려 하고, `개발자`는 자신의 열망과 커리어 방향에 적합한 회사를 찾으려 한다.
+
+* 면접은 **회사와 개발자들이 `상호 생산적인 파트너십`이 가능할지를 판단**하는 협상 자리다.
+
+* 생산적인 파트너십을 알아보는 방법은 각각의 관점마다 다르다.
+
+ * 회사 입장에서의 관점 : 성숙한 채용 문화의 회사라면 **파트너십**을 기대한다. 면접자의 역할은 지원자가 `협업`을 잘 할 수 있는지, `권한부여`를 잘 감당할 수 있는지 판별하는 것이다. 지원자가 얼마나 많은 질문을 하느냐는 면접관 입장에서 그 사람의 **협업 능력**과 **비즈니스 기여 가능성**을 가늠할 수 있는 중요한 단서가 된다. 즉, 항상 질문을 많이 하는 지원자를 우선시하는 것이 좋다.
+
+ * 지원자 입장에서의 관점 : 다단계 면접으로 진행이 되는지, 그리고 면접관이 개발자인지를 파악해야 한다. 면접관이 개발자라면 회사의 관리층이 개발자를 신뢰할 수 있다는 의미이다. 다단계 면접이 좋은 이유는 회사에서 지원자의 서로 다른 여러 측면을 보는 것이기 때문에 **제대로 된 프로페셔널을 채용하는 데 진지하게 임한다**는 징표일 수 있다. 그리고 면접관들의 질문들을 중요시하게 봐야한다. 그러한 질문들은 대게 면접관이 중요하게 생각하는 것들을 반영하기 때문이다.
+
+### 배움의 문화
+
+* 관리자들을 개발자에게 권한을 위임하고 개발자들 스스로 배움의 문화를 만들어갈 수 있도록 북돋워야 한다.
+
+* 그러한 환경을 조성하기 위해 다음과 같은 해당 사항들을 고려하자.
+
+ * 북 클럽에 가입하기 - 한 주에 한 번정도 점심 시간이나 기타 여유 시간에 모여서 한 권의 책에 대해 서로 의견을 공유하고 대화를 시도해보기.
+
+ * 테크 런치 진행하기 - 일주일에 한 번정도 점심 시간에 기술과 관련된 난상 토론회를 가지는 것을 제안하기.
+
+ * 그룹 토론회에 참여하기 - 가장 많이 득표한 주제를 두 주제를 가지고 사람들을 두 그룹으로 나눈 다음 해당 주제에 대해 토론 시간을 가지기.
+
+ * 업무 교환하기 - 업무가 반복적으로 찾아올 시기일 때 프로젝트의 한 업무 주기 동안 팀끼리 개발자를 서로 바꾸면서 새로운 것을 볼 기회를 만들어주기. 다른 팀의 개발자와 페어 프로그래밍을 하면 다른 기술, 테크닉, 업무 방식, 사고 경험을 경험하게 된다.
+
+ * 그룹 코드 리뷰하기 - 서로간의 코드를 리뷰하면서 더 나은 개선점이 있는 지 확인한다.
+
+ * 그 밖에 코딩 실습하기, 내부 학습 모임 만들기, 회사에서의 펫 프로젝트 시간을 허용하기, 외부 기술 커뮤니티와 교류하기 등 다양한 배움의 문화가 있다.
+
+
+* 만약 아무도 참여하려 하지 않는다면 스스로 먼저 모범을 보이고, 관심을 보이는 사람들에게만 집중한다. 굳이 모든 사람들을 강제로 변화시키는 것은 욕심이고, 소수의 사람들이 변화된 것만으로 큰 진보를 나갈 수 있다.
+
+### 실용주의 장인정신
+
+* 소프트웨어 장인이라면 `J.B. 레인스버거`이 말한 **단순한 설계를 위한 네 가치 원칙**을 먼저 생각해야 한다.
+
+1. 모든 테스트의 통과
+
+2. 중복의 최소화
+
+3. 명료성의 최대화
+
+4. 구성요소의 최소화
+
+* 장인이 가장 중요하게 초점을 맞추는 것은 **고객의 만족**이다.
+
+* 품질은 물론이고 시간과 비용도 고객만족을 위한 구성요소다. 고객에게 가치를 전달할 수 없다면 잘 작성된 코드라고 할 수 없다.
+
+* 깨끗하고 잘 작성된 코드는 비즈니스의 요구에 맞추어 빠르고 안전하게 변경할 수 있는 기반이 된다.
+
+* 요구사항의 변화에 맞추어 코드를 빠르게 바꿀 수 있는 것이 비즈니스를 돕는 최선의 방법이다.
+
+### 소프트웨어 장인으로서의 커리어
+
+* `열정`. 이 단어 하나가 모든 것을 요약한다.
+
+* 장인이 된다는 것은 새로운 것에 대해 호기심을 가지고 실험한다는 것과 같은 의미앋. 장인은 항상 주어진 문제에 가장 적합한 도구를 찾고 단순한 해결책을 추구한다.
+
+* 진정한 소프트웨어 장인은 가장 먼저, 코드 작성이 아니라 **문제 해결**에 집중한다.
+
+* `정직`과 `용기`는 소프트웨어 장인이 갖추어야 할 핵심적인 자질이다. 즉, 고객이 나쁜 의사결정을 할 때 그것이 적절치 못하다고 지적하는 정직함과 용기를 말한다.
+
+* 본인의 커리어를 만들어 나가기 위해서 일을 선택하기 전에 아래와 같은 질문들을 스스로에게 던져보고 생각해보자.
+
+ * 나의 커리어로부터 나는 무엇을 원하는가?
+
+ * 그것이 성취하기 위한 다음 단계는 무엇인가?
+
+ * 이 일은 나의 커리어 방향과 합치하는가?
+
+ * 내가 이 회사에 줄 수 있는 가치의 양은 얼마나 되는가?
+
+ * 그러한 투자에 대한 이익은 무엇인가?
+
+ * 내가 되고자 하는 프로페셔널에 이르는 데 이 일은 어떻게 도움이 되는가?
+
+ * 이 일에서 나는 자율성, 통달, 목적의식을 가질 수 있나?
+
+ * 나의 고용주와 생산적인 동반자 관계를 맺을 수 있나? 양측 모두 가치 얻고 행복할 수 있나?
+
+* 본인이 원하는 바를 모른다면 **최대한 많은 문**을 열어 보아야 한다. 커뮤니티 행사에 참석하고, 오픈소스에 기여하고, 토론 메일링 리스트에 참여한다. 영감을 줄 수 있는 사람도 찾아 나서는 게 좋다.
+
+* 밖으로 나가서 당신이 무엇을 할 수 있는지 다른 사람들에게 보여준다. 그렇게 하면 당신이 모르던 큰 세상이 있음을 알게 될 것이다.
+
+* 이렇게 하다보면 당신이 어디로 가고 싶어 하는지 감이 잡힐 것이다.
+
+> 소프트웨어 장인의 사명
+
+* 소프트웨어 장인은 자신만의 사명이 있다.
+
+* 더 나아지는 데 집중하고, 계속해서 자신의 커리어에 투자하며, 배우고, 가르치고, 공유한다.
+
+* 그가 많은 고객에게 항상 가치를 전달할 수 있도록 해야 한다.
+
+* 진정한 사명은 프로페셔널리즘, 열정, 관심으로 소프트웨어 산업의 수준을 높이는 것이다.
+
+---
+
+## Review
+
+* 개발자가 쉽게 이해할 수 있는 코드를 구현하기 위한 개발의 실력도 중요하지만, IT 분야의 팀 프로젝트 전반적인 이해와 **한 단계 성장하는 계발자**가 되려면 어떤 요소가 필요한 것이 무엇인지 알려줬다.
+
+* 이 책의 아쉬운 점은 예비(신입)개발자 입장에서 보면 Part1의 내용들은 얻어갈 게 많았지만, Part2의 내용들은 Part1에서 얘기했던 내용들과 많은 부분들이 겹쳤고, 크게 중요하다고 생각하는 부분이 별로 없었다는 점이다.
+
+* 책 페이지 전체 수가 300 조금 넘지만, 나에게 실제로 얻어갈 내용은 100 안쪽이였다.
+
+* 그래도 개발자로서 어떻게 살아가야 할지 도움을 주었던 책이었고, 개발자에서의 자기개발 책으로서는 만족한 책이었다.
+
+* 앞으로 개발에 대한 마인드 셋이 필요할 때마다 해당 책을 참고하며 개발자의 마음가짐을 새겨두고 실전에 체화하자.
\ No newline at end of file
diff --git a/src/content/posts/Book-The-One-Who-Leaves-People-Behind.md b/src/content/posts/Book-The-One-Who-Leaves-People-Behind.md
new file mode 100644
index 00000000..540ab958
--- /dev/null
+++ b/src/content/posts/Book-The-One-Who-Leaves-People-Behind.md
@@ -0,0 +1,190 @@
+---
+title: "'삶을 재구성하는 관계의 법칙, 사람을 남기는 사람' 책 리뷰"
+date: 2026-01-04
+categories: ["에세이"]
+tags: ["책"]
+---
+
+> 이 글은 '[삶을 재구성하는 관계의 법칙, 사람을 남기는 사람](https://product.kyobobook.co.kr/detail/S000215101553)'이라는 책을 읽고, 책의 내용과 함께 필자의 개인적인 생각을 정리한 글입니다.
+
+## 시작하며
+
+
+
+나이가 들수록 인간관계의 중요성을 더 많이 체감한다.
+스스로 바쁘게 살아가며 노력한 것에 비해 성과가 나지 않아 지친 부분도 있었고, 그 과정에서 가족이나 친구 등 주변 관계에 소홀했던 것은 아닌가 싶어 생각을 정리하고 싶었다.
+
+마침 생일날 합정동의 한 서점에 들렀다. 사장님께 현재의 고민을 말씀드리니 이 책을 추천해 주셨고, 시간 날 때마다 조금씩 읽으며 마음에 남는 문장들을 기록하기 시작했다.
+
+이 책의 저자는 프롤로그에서 '관계의 안정기'에 접어들며 이 글을 쓰게 되었다고 고백한다.
+관계의 어려움을 어떻게 극복해 왔는지에 대한 그의 이야기가, 관계에 대해 고민하는 이들에게 한 줌의 도움이 되길 바라는 마음을 담았다고 한다.
+
+
+---
+
+## '나'라는 중심
+
+나를 미워하고 좋지 않은 말을 내뱉는 사람들은 생각보다 그 말을 오래 기억하지 않는다.
+납득할 만한 비판은 받아들이는 태도도 중요하지만, 그보다 **나를 좋아해 주고 호의를 베푸는 이들**에게 어떻게 보답할지 고민하는 편이 시간이 아깝지 않다고 느낀다.
+나아가 나 또한 누군가에게 그런 선의를 베푸는 존재가 될 때 더 큰 행복을 느낄 수 있다.
+인생에서 오롯이 **나를 위해 쓸 수 있는 시간은 생각보다 짧기 때문**이다.
+
+삶에서 어떤 일을 '시작'할 때는 타인의 시선을 신경 쓰지 않는 것이 중요하다.
+반면, 그 일을 '제대로' 해내는 단계에서는 타인의 시선과 소통이 필요해지기 시작한다.
+전문적인 영역으로 깊이 들어갈수록, 그리고 자리가 높아질수록 타인의 시선을 어디까지 의식할지 스스로 판단해야 하는 순간이 온다.
+이때 중심을 잡기 위해서는 나의 방식과 태도에 대해 무엇이 옳고 그른지 솔직하게 말해줄 수 있는 존재가 곁에 있어야 한다.
+삶이 어려운 이유는 스스로 균형을 잡으며 성과를 내는 동시에, 행복과 만족을 함께 얻어야 하기 때문일 것이다.
+결국 우리는 스스로의 '나'로 살아가지만, 동시에 '관계' 속에서도 살아가는 존재다.
+
+자기만의 '힘 있는 마음'을 지니고 삶의 보호막을 칠 줄 아는 사람은 주도적인 삶을 산다.
+저자가 만난 이들의 공통점 역시 자신만의 진지한 세계를 구축하고 있었다는 점이다.
+여러 사람을 겪으며 나와 맞는 사람과 그렇지 않은 사람을 구별하는 눈도 생겼다.
+중요한 것은 내가 세계를 공유하고 싶은 사람들과 삶을 확장해 나가는 일이다.
+내가 원하는 삶의 방식을 해치는 이들은 걸러내고, 도움이 되는 이들의 손을 붙잡는 것 말이다.
+
+인간관계를 맺는 나만의 기준은 다음과 같다.
+- 나에게 호의적인 사람에게는 나도 그에 맞게 호의로 보답할 것.
+- 나에게 적대적인 사람의 마음을 얻으려 애쓰지 말 것.
+- 관계에 미련을 두지 말 것.
+
+이 모든 것의 핵심은 관계에 너무 집착하지 않고 에너지를 뺏기지 않는 선을 찾아가는 과정이다.
+인생은 무한하지 않기에 내가 좋아하는 시간을 누리려면 관계에 드는 에너지를 조절할 줄 알아야 한다.
+인간은 자유 의지가 있는 유연한 존재라 본다. 관계뿐만 아니라 여러 환경에 대해 열린 자세가 필요하다.
+
+비판은 **현재의 나를 더 나은 미래의 나로 만들어주는 피드백**이다.
+자존심을 내려놓고 자기 객관화를 할 수 있다면 개선할 점이 보일 것이다.
+나를 가두는 틀을 깨고 나갈 때 성장이 일어나며, 그것이 예상치 못한 기회를 불러온다고 생각한다.
+나 역시 지속적으로 시련을 마주하고 극복하며 한 단계씩 성장하는 과정을 추구하려 한다.
+
+---
+
+## 타인을 있는 그대로 바라본다면
+
+한 심리 연구에 따르면 대화의 80%가 타인에 대한 이야기로 채워진다고 한다.
+남 이야기인 만큼 **함부로 추측하거나 평가하지 않는 자세**가 중요하다.
+필자 또한 군대 가기 전까지는 친구들과 대화할 때 타인의 이야기를 추측성으로 내뱉곤 했다.
+하지만 군 생활 이후 나 자신에 대해 조금씩 알아가면서부터는 남의 이야기보다 **'나'의 이야기**를 중심으로 하려 노력했다.
+
+타인에 대한 부정적인 이야기가 오가는 자리가 불편해지면서 자연스레 인간관계도 정리가 되었다.
+덕분에 타인보다 자신의 이야기를 진솔하게 나누는 친구들을 곁에 두게 되었고 대화도 한결 편해졌다.
+타인에 대해 부정적인 말을 뱉을수록 그 시선은 언젠가 본인에게 돌아오기 마련이다.
+누군가의 고민을 들을 때도 그것이 진실인지 거짓인지 의심하기보다 있는 그대로 받아들인다.
+고민할수록 나만 힘들어질 뿐이며, 그 시간에 나 자신에게 투자하는 것이 훨씬 낫다는 결론에 이르렀기 때문이다.
+타인과 진솔하게 대화할 때는 존중을 기반으로 경청하는 자세가 무엇보다 중요하다.
+
+사람은 시간을 두고 깊이 지켜봐야 비로소 이해할 수 있는 존재다.
+그렇기에 한 사람에 대한 판단을 쉽게 내리지 않는 인내가 필요하다.
+우리 사회는 어느덧 '상대적 박탈감'의 시대가 되었다.
+시기심은 상대에게 집착하게 하거나 스스로를 고립시키며 삶을 파괴한다.
+이러한 감정에 대처하기 위해서는 시기심을 있는 그대로 마주해야 한다.
+시기심은 **나의 결핍이 무엇인지 알려주는 신호**이기도 하다.
+즉, 시기심은 상대방을 통해 나의 결핍이 무엇인지 깨닫게 해준다.
+결국, 이러한 과정을 거쳐 **타인에 대한 존중과 이해를 가진 사람**이야말로 진정으로 깊이 있는 사람이라 생각한다.
+
+## 다정함은 상호적인 것이다.
+
+**자신의 약한 점을 내보이면 오히려 그 지점에서 사람과 사람은 이어지고 접속된다.**
+글쓰기 또한 진솔하게 타인을 만난다는 점에서 이와 다르지 않다.
+나의 한계를 인정하고 받아들이면서도, 스스로의 믿음을 실천해 나가는 의지들이 모여 진실한 소통을 만든다.
+타인과 진솔하게 소통하고 싶다면 내가 먼저 진솔해지면 된다.
+나의 고민을 먼저 털어놓을 때 비로소 대화의 분위기가 부드러워지고 깊은 대화가 가능해진다.
+
+좋은 대화가 들어주기와 말하기로 이뤄진다면 그 중에서 80%는 '들어주기'의 지분일 것이다.
+단순히 공감하고 경청하는 것을 넘어, 상대방으로부터 진솔한 이야기가 나오도록 이끌어주고 상대방의 마음을 잘 들여보는 게 중요하다.
+필자 역시 정말 친한 지인들과 대화할 때는 먼저 마음을 열기도 하고, 상대의 기분에 맞춰 공감하고 이해하려 노력한다.
+굳이 할 필요가 없는 말들은 아끼고 상대의 진솔한 이야기를 듣는 것에서 어느새 즐거움을 느끼게 되었다.
+
+대화가 어려운 경우는 대개 자기방어와 두려움이 앞서기 때문이다.
+본인의 약점을 쉽게 내보이지 않는 만큼 본인의 진심있는 마음을 드러내는게 쉽지 않다.
+그럼에도 상대방과의 좋은 대화, 그리고 좋은 연인 관계를 유지하기 위해서는 서로가 존중을 기반으로 두려움을 서로 알고, 인정해주는 습관을 가지면서 얘기를 해야 대화의 질이 좋아지지 않을까 싶다.
+
+다정한 사람과 만나려면 우선 본인이 다정해질 필요가 있다.
+한 사람이 거칠기만 해도 그 관계는 지속하기가 어려워진다.
+좋은 사람을 만나려면 우선 본인이 좋은 사람이 되기 위해 갖춰야 할 부분을 채워나가지 않을까 싶다.
+더 나아가, 이러한 사고방식이야말로 좋은 삶을 살 수 있지 않을까 싶다.
+
+이는 결혼이라는 주제에서도 이어진다.
+결혼을 고민하기 전에, 본인이 "어떤 사람인가, 어떤 사람이 되어야 하는가"를 고민해볼 필요가 있다.
+상대방을 찾기 전에, 우선 본인 자신을 돌아볼 필요가 있고 결혼을 통해 어떤 사람이 되고자 하는지, 무엇을 얻고자 하는지에 대해 생각을 해봐야 한다고 생각한다.
+단순히 나의 결핍을 채우려는 수단이 아니라, 서로 다른 삶을 살아왔던 타인을 이해하고 함께 살아갈 자세와 태도가 준비되어야 한다.
+여기서 더해, 필자는 '결혼'에 대해 혼자서도 잘 살지만, **둘이 같이 있을 때 더 잘 살고 더 큰 시너지가 넘치는 게 있어야** 결혼까지 가는 거라 생각한다.
+'1+1=2'가 아닌, **'1+1=3 이상의 시너지'** 를 낼 수 있을 때 비로소 의미가 있다고 생각한다.
+결혼은 혼자가 아닌 둘 이상이 함께 어울리는 삶에 대해 고민하며 살아가는 것이기 때문에 신중해져야 한다.
+
+
+## 어떤 '벽'은 필요하다.
+
+여러 글들 중에 '공감하나 동의하지 않는다'는 부분이 기억에 남았다.
+누군가의 이야기를 들을 때, 공감과 동의는 별개의 문제라는 점이다. 각자의 입장을 인정하고 이해하며, 때로는 함께 바꿔나가는 자리에 관계가 있다.
+우리는 완전히 같을 수 없는 서로라는 존재를 바라보고, 서로의 이야기를 듣기 위해 관계를 맺는 것이다.
+
+이 글을 읽으며 연애와 친구 관계 속 장면들이 떠올랐다. 친구의 이야기를 들을 때, 공감은 하지만 동의하지 않았던 순간이 여러 번 있었다.
+친구가 다른 누군가에 대해 안 좋은 말을 할 때, 그것에 동조해야 하는가 하는 문제다.
+이성적으로는 상황을 판단하고 싶고, 감정적으로는 그냥 맞장구를 쳐주는 게 편하기도 하다.
+그런데 남을 비난하는 것에 동조하면서까지 관계를 유지해야 하는가에 대해서는 마음이 편하지 않았다.
+이 글을 읽고 나서야 어느 정도 결론에 이르렀다. **공감은 하되, 동의하지 않는다.**
+그리고 그 마음을 이해해주는 사람만을 곁에 두는 것이 스스로에게도 안정적이라는 것을.
+
+두 번째로 '대박을 이야기하는 사람 경계하기' 부분에서 저자는 **'꾸준함'과 '어려움'을 믿는다**고 한다.
+무언가를 꾸준히 이어가다 보면 그로부터 삶의 기반, 마음의 뿌리, 삶의 태도를 얻을 수 있다는 것이다.
+그리고 중대한 선택의 기로에서 쉬운 길보다 어려운 길을 택하며 꿋꿋하게 걸어가는 것, 그 길이 자신에게 맞는 길이라 믿는다고 한다.
+
+그래서 저자 곁에는 괴로움과 치열함 속에서도 포기하지 않고 삶을 사랑하는 이야기를 하는 사람들이 남아 있다고 한다.
+그런 관계에서는 서로를 지켜보며 응원하는 일만 있다고.
+
+이 대목을 읽으며 지난 5년간 내 주변을 되돌아보게 되었다.
+2022년 대학교 시절, 그 순간순간을 치열하게 살고 자신의 삶을 주도적으로 살아가던 친구들이 있었다.
+그 친구들과 나누는 대화는 서로를 응원하면서도 각자가 열심히 살아가고 있다는 것을 알기에, 마음이 잘 맞았다.
+졸업 후에도 1년에 한 번은 만나는데, 그때마다 이전보다 더 성숙해진 모습을 보며 놀라움과 동시에 존경심이 든다.
+
+## 더 깊은 삶으로
+
+이 책에서 '관계'를 다루는 부분은 가장 깊이 있는 섹션이었다.
+저자는 삶을 살다 보면 사람에게서 두 가지 부류를 만나게 된다고 한다.
+타인이 귀한 줄 모르고 자신의 잘남에만 극도로 몰입하는 사람과, 타인이 귀하고 소중함을 알며 누구에게서나 배울 점을 찾고 대접할 줄 아는 사람.
+**타인이 귀한 줄 아는 사람일수록 자존감이 강하다**는 말이 처음엔 선뜻 이해되지 않았지만,
+생각해보면 주변의 그런 분들이 실제로 자존감이 높은 분들이었다는 걸 이제야 알아차렸다.
+
+'우리는 줄 때 자기 자신이 된다'는 섹션에도 인상 깊은 구절이 있었다.
+인간이 살아가며 하는 일의 대부분은 결국 남을 위한 일이라는 점이다.
+사회에서 돈을 버는 일의 원천은 대개 타인의 만족감과 행복감에서 비롯된다.
+그만큼 타인을 만족시킬 수 있기에 사회에서 인정받는 것이다.
+우리는 흔히 **실력**이란 자신을 위한 것이라 여기지만, 사실 그것은 **타인을 위한 일을 얼마나 잘 해내느냐의 문제**다.
+이 관점을 이해해야 비로소 자신의 능력으로 무언가를 만들어 타인에게 '주는' 사람이 될 수 있다.
+이 글을 읽으며, 어린 시절부터 열심히 공부했던 이유가 결국 타인을 위해서였다는 것을 새삼 떠올렸다.
+삶이란 타인과의 관계 속에서 소비하는 입장과 생산하는 입장이 공존하고, 생산하는 입장이 사회적 역할을 담당하는 존재라는 것을.
+
+마지막으로 '타인에게 시간을 쓰는 일' 섹션을 읽으며 곧바로 행동으로 옮겨야겠다고 느꼈다.
+세상에 소비하고 누릴 것이 넘쳐나는 시대다. OTT, 유튜브, 다양한 즐길 거리들.
+하지만 그것이 내 삶을 진정으로 행복하게 해주는가는 또 다른 문제다.
+사회적 성공과 커리어를 이유로 가까운 사람들을 소홀히 하는 우를 범하기 쉽다.
+친구에서 나에게 소중한 사람이 되려면 결국 시간을 써야 한다.
+소중한 사람이 곁에 있어야 삶이 더 풍요로워진다. 그래서 커리어만큼, 소중한 사람을 만드는 것에도 집중해보려 한다.
+타인과의 관계에서 얻는 행복이 개인적인 성취감보다 더 크다고 느끼기 때문이다.
+
+## 마치며
+
+책을 읽으며 저자의 솔직한 시선을 마주할 수 있었다.
+책을 절반쯤 읽었을 때 이 책을 한 마디로 정리하자면, '나'와 '타인' 사이의 균형을 찾으며 나아가는 법을 담고 있다.
+그리고 건강한 관계를 유지하기 위해 **타인에 대한 존중과 이해를 바탕으로 이야기를 경청하는 자세**가 중요하다는 점을 책 구석마다 반복적으로 다르게 표현해 주고 있다는 걸 느꼈다.
+
+저자는 강연을 준비할 때 초반에는 체계적이고 완벽한 준비를 고집했으나, 점차 사람들과의 자연스러운 소통을 더 중요하게 여기게 되었다고 한다. 준비한 내용을 빠짐없이 전달하는 것보다,
+청중과 눈을 맞추며 인간적인 모습으로 대화하는 것이 더 깊은 울림을 주기 때문이다.
+필자 또한 최근까지 완벽주의적인 자세를 유지하려고 애써왔다. 하지만 이제는 그 무게를 조금씩 내려놓으려 한다.
+**덜 완벽해지더라도 항상 겸손하게 배우려는 자세**, 그리고 **꾸밈없는 인간적인 모습**이 스스로에게 스트레스를 덜 주고 '나다운 모습'을 가장 잘 보여준다는 것을 깨달았기 때문이다.
+
+책을 읽으면서 유재석 님이 '핑계고'에서 했던 말이 다시금 떠올랐다.
+"의도한 대로 일이 풀리지 않아 낙담할 때도 있지만, 때로는 그것이 전화위복이 된다"는 그 말씀처럼 **예상치 못한 시련이 오히려 나를 한 단계 성장시키는 계기가 된다는 것**을 요즘 들어 많이 체감하고 있다.
+이 책의 남은 이야기들이 또 어떤 변화를 선물해 줄지 기대하며 독서를 이어갔다.
+
+> (추가) 2026.06.03 (수)
+
+책의 나머지 부분을 다 읽으며, 타인과의 관계가 인생에서 얼마나 중요하고 값진지를 다시 한번 체감했다.
+회사에서 성과를 낼 때도, 결혼식을 올릴 때도, 무언가를 이룰 때도 결국 그 자리를 함께하는 타인이 있어야 한다는 것.
+책을 다 덮고 나서 가장 먼저 든 생각은, 연락을 미뤄왔던 소중한 사람에게 먼저 손을 내밀어야겠다는 것이었다.
+그래서 개인의 커리어 성장도 중요하지만, 그만큼 주변 사람들을 챙기는 것,
+그리고 **소중한 사람을 잃지 않고 곁에 두는 것** 또한 중요하다는 것을 이 책을 통해 다시 한번 새겼다.
+
+## Reference
+
+- [삶을 재구성하는 관계의 법칙, 사람을 남기는 사람](https://product.kyobobook.co.kr/detail/S000215101553)
\ No newline at end of file
diff --git a/src/content/posts/Competition-KNU-Student-Design-Convergence-Major-Contest.md b/src/content/posts/Competition-KNU-Student-Design-Convergence-Major-Contest.md
new file mode 100644
index 00000000..734abbf7
--- /dev/null
+++ b/src/content/posts/Competition-KNU-Student-Design-Convergence-Major-Contest.md
@@ -0,0 +1,86 @@
+---
+title: "[KNU] 학생설계 융합전공 공모전(대상 수상)"
+date: 2022-10-31
+categories: ["기타"]
+tags: ["커리어"]
+use_math: true
+---
+
+## 대회 소개
+
+[[교육혁신과] KNU 학생설계 융합전공 공모전 참여 안내](https://knu.ac.kr/wbbs/wbbs/bbs/btin/viewBtin.action?bbs_cde=11&btin.bbs_cde=11&btin.doc_no=1326876&btin.appl_no=000000&btin.page=1&btin.search_type=&btin.search_text=&popupDeco=false&btin.note_div=row&menu_idx=73)
+
+## 공모전 안내
+
+공모전 개요
+
+
+
+
+
+* 우리 팀은 총 3명으로 기계공학부와 컴퓨터학부로 구성되었고, 나는 컴퓨터공학부 전공으로 참여하게 되었다.
+
+* 우리는 첨단, 신기술 분야의 주제로 "**자율주행 모빌리티**"를 선정하였고, 그에 맞게 준비했다.
+
+
+## 진행 일정
+
+
+
+* 진행 일정은 약 3개월이였다.
+
+* 전체 지원팀들 중 상위 20팀만 시상이 가능하였고, 그중에 1차 심사(서면)을 통과한 6팀이 2차 심사(발표)를 진행하는 거였다.
+
+## 1차 합격
+
+
+
+* 우리 팀은 운이 좋게도 면접관분들이 좋게 봐주셔서, **상위 6개 팀안에 선정**되어 1차 심사를 통과했다.
+
+* 우선 1차 심사에 통과만 되더라도 "최우수상"은 받을 수 있기 때문에 기뻤다.
+
+* 그래도 우리 팀은 "최우수상"이 아닌 "대상"을 위해 다시 한번 마음잡고 제대로 준비했다.
+
+## 2차 심사일
+
+
+
+* 2차 심사를 보는 날이었다.
+
+* 앞서, 대기실에서 1차적으로 대기하고 있다가 2차로 `교육지원 부본부장실`에서 대기하였다.
+
+* 해당 공모전 담당자님이 어떻게 진행되는지 친절하게 알려주셨다.
+
+
+
+* 이 문을 열고 2차심사에서 PPT 발표가 진행되었다.
+
+* 예상과 달리, 심사위원분들이 다양한 학부의 교수님들이셨고, 생각보다 많으셔서 의도치 않게 당황했지만, **만반의 태세**를 준비했기 때문에 적당히 긴장감을 유지한 상태였다.
+
+* PPT 발표는 총 `10분`이었다.
+
+* 정확히 기억나진 않지만, 여섯 ~ 여덟 분의 교수님들과 교육담당자 두 분 앞에서 발표를 진행했다.
+
+* 그리고 발표 후 바로 질의응답 시간을 가졌는데, 사전에는 1~2개 질문만 나온다고 담당자님이 알려주셨는데, **4~5개** 질문이 나와서 의외였다.
+
+* (개인적으로 좋은 징조이지 않을까..라는 긍정적인 기대감이 있었다)
+
+
+
+* 끝나고, 같이 공모전에 참가한 팀원 두 명과 같이 근처에서 점심으로 찜닭을 먹었다.
+
+## 최종 순위
+
+* 10월 중순 무렵, 오후에 도서관에서 공부하다가 잠깐 카톡을 봤는데, 팀원이 최종 순위 자료를 보내줬다.
+
+
+
+* 운이 좋게도.. **최종 1위**를 하게 되었다!
+
+* 1위를 하게 될 줄은 정말 상상하지 못했고, 그 당시에 좋게 봐주셨던 심사위원분들이자 교수님들께 감사하다는 말씀밖에 생각이 나질 않았다. (다시 한번 감사드립니다)
+
+* 공모전 기간 동안 셋이서 **아이디어부터 끊임없이 연구하고 개발**한 보람이 있었다.
+
+
+
+* 상장하고 돈 받으니 뿌듯하면서 행복했다.
diff --git a/src/content/posts/Coursera-Certificates.md b/src/content/posts/Coursera-Certificates.md
new file mode 100644
index 00000000..3c8d487d
--- /dev/null
+++ b/src/content/posts/Coursera-Certificates.md
@@ -0,0 +1,75 @@
+---
+title: "[Coursera] 5개 수료증 취득"
+date: 2023-01-01
+categories: ["기타"]
+tags: ["커리어"]
+---
+
+* IT업계에서 프로젝트를 할 때 기본적으로 팀 구성이 PM, 디자인, 프론트, 백엔드로 구성되어 있다.
+
+* 내가 주로 공부중인 `백엔드 개발자 역량`뿐만 아니라, 다른 직무에 대한 이해도 필요하다고 생각해서 해외 온라인 강좌 [Coursera](https://www.coursera.org/) 사이트에서 해당 강좌들을 수강했다.
+
+> 수강 기간: 2022.12.24 ~ 2022.12.31
+한 강좌당 완료하는데 약 18시간 ~ 22시간 필요
+언어, 자막: 영어
+
+
+## Coursera 수강 강좌
+
+아래는 Google에서 주관하는 강좌들이다.
+
+* [Foundations of Project Management](https://www.coursera.org/learn/project-management-foundations/)
+
+* [Foundations of User Experience (UX) Design](https://www.coursera.org/learn/foundations-user-experience-design)
+
+* [Foundations: Data, Data, Everywhere](https://www.coursera.org/learn/foundations-data)
+
+아래는 Meta에서 주관하는 강좌들이다.
+
+* [Introduction to Front-End Development](https://www.coursera.org/learn/introduction-to-front-end-development)
+
+* [Introduction to Back-End Development](https://www.coursera.org/learn/introduction-to-back-end-development)
+
+## 수료증
+
+### Foundations of Project Management
+
+* 학점 : 97.67%
+
+
+
+### Foundations of User Experience (UX) Design
+
+* 학점 : 100%
+
+
+
+### Foundations: Data, Data, Everywhere
+
+* 학점 : 92.25%
+
+
+
+### Introduction to Front-End Development
+
+* 학점 : 97.35%
+
+
+
+
+### Introduction to Back-End Development
+
+* 학점 : 97.35%
+
+
+
+
+### Review
+
+* 해당 강좌들을 수강하면서 과제 혹은 퀴즈가 많았지만, 주차별 강의에 나온 개념들에 대한 복습을 한번 더 할 수 있어 좋았다.
+
+* 비개발자 직무인 PM, UX Design 같은 경우는 개발자 직무와 다르게 중간마다 주관식/서술형으로 쓰는 과제가 있어서, 창의적인 사고와 유연성이 필요하다는 점을 느끼게 해줬다.
+
+* 개발자 직무인 Front-end, Back-end 같은 경우는 과제가 코딩으로 나왔지만, 이전 프로젝트 경험과 학교에서 배운 지식이 있기 때문에 처음 배운 사람들에 비해 수월하게 문제를 해결할 수 있었다.
+
+* 그리고 잊었거나 헷갈렸던 개념들을 다시 복습하면서 머릿속에 다시 정리되는 점이 좋았다.
\ No newline at end of file
diff --git a/src/content/posts/DB-Locking.md b/src/content/posts/DB-Locking.md
new file mode 100644
index 00000000..eda075fe
--- /dev/null
+++ b/src/content/posts/DB-Locking.md
@@ -0,0 +1,258 @@
+---
+title: "[DB] Locking"
+date: 2023-02-21
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+## 트랜잭션 스케줄 유형
+
+* `병행 수행`이란 트랜잭션들이 차례로 번갈아 가면서 수행되는 **인터리빙 방식**으로 진행된다.
+
+* 트랜잭션 스케줄은 트랜잭션에 포함되어 있는 **연산들을 수행하는 순서**다.
+
+* 트랜잭션 스케줄에는 세 가지 유형으로 구분할 수 있다.
+
+ * `직렬 스케줄` : 인터리빙 방식을 이용하지 않고 트랜잭션별로 **순차적**으로 실행하는 것이다.
+
+ * `비직렬 스케줄` : 인터리빙 방식을 이용하여 트랜잭션을 병행하여 수행시키는 것이다.
+
+ * `직렬 가능 스케줄` : 직렬 스케줄과 같은 결과를 생성하는 비직렬 스케줄이다.
+
+### 직렬 스케줄
+
+* `직렬 스케줄`(**Serial Schedule**)은 인터리빙 방식을 이용하지 않고 트랜잭션별로 연산들을 순차적으로 실행시키는 것이다.
+
+* 트랜잭션이 직렬 스케줄에 따라 수행되면, 모든 트랜잭션이 완료될 때까지 다른 트랜잭션의 방해를 받지 않고 **독립적**으로 수행된다.
+
+ 그래서 직렬 스케줄에 따라 트랜잭션이 수행되고 나면 **항상 모순이 없는** 정확한 결과를 얻는다.
+
+* 두 트랜잭션을 대상으로 하는 직렬 스케줄의 예를 살펴보면 다음과 같다.
+
+
+
+* [그림 1]은 트랜잭션 T1을 수행한 이후에 트랜잭션 T2를 수행한 예시다. (T1 -> T2)
+
+
+
+* [그림 2]은 트랜잭션 T2을 수행한 이후에 트랜잭션 T1를 수행한 예시다. (T2 -> T1)
+
+* 직렬 스케줄에 따라 여러 트랜잭션을 수행하면 정확한 결과를 얻을 수 있지만, **인터리빙 방식을 사용하지 않고** 각 트랜잭션이 **독립적**으로 수행하기 때문에 트랜잭션들이 동시에 수행되는 **병행 수행**이라고 할 수 없다.
+
+* 그래서 직렬 스케줄은 일반적으로 사용하지 않는다.
+
+### 비직렬 스케줄
+
+* `비직렬 스케줄`(**Non-Serial Schedule**)은 인터리빙 방식을 이용하여 트랜잭션을 병행해서 수행시키는 것이다.
+
+* 트랜잭션이 비직렬 스케줄에 따라 수행되면, 하나의 트랜잭션이 완료되기 전에 다른 트랜잭션의 연산이 실행될 수 있다.
+
+ 여러 트랜잭션을 병행 수행하게 되면 **갱신 분실**, **모순성**, **연쇄 복귀** 등의 문제가 발생할 수 있어 최종 수행 결과의 정확성을 보장할 수 없다.
+
+* 두 트랜잭션을 대상으로 하는 비직렬 스케줄의 예를 살펴보면 다음과 같다.
+
+
+
+* [그림 3]은 트랜잭션 T1,T2를 직렬 스케줄로 수행한 [그림 1]과 결과가 같으므로 모순이 없는 정확한 값이다.
+
+
+
+* [그림 4]은 트랜잭션 T1,T2를 직렬 스케줄로 수행한 [그림 1], [그림 2] 모두와 결과가 다르므로 정확하지 않는 값이다.
+
+### 직렬 가능 스케줄
+
+* `직렬 가능 스케줄`(**Serializable Schedule)** 은 직렬 스케줄에 따라 수행한 것과 같이 **정확한 결과**를 생성하는 **비직렬 스케줄**이다.
+
+* 직렬 가능 스케줄을 이용해 트랜잭션을 병행 수행해야 하지만 직렬 가능 스케줄인지 여부를 판단하는 일은 쉽지 않다.
+
+ 다수의 트랜잭션을 대상으로 비직렬 스케줄을 찾아내는 것도 어려울 뿐만 아니라, 하나씩 수행해보면 직렬 스케줄과 같은 결과가 나오는지 비교하는 것도 간단한 작업이 아니기 때문이다.
+
+* 그래서 DBMS에서는 **병행 제어 기법**을 사용한다.
+
+## 병행 제어 기법
+
+* `병행 제어 기법`은 여러 트랜잭션이 병행 수행하면서도 **정확한 결과**를 얻을 수 있는 **직렬 가능성**을 보장받기 위해 사용한다.
+
+* 기본 원리는 모든 트랜잭션이 따르면 직렬 가능성이 보장되는 나름의 규약을 정의하고, 트랜잭션들이 이 규약을 따르는 것이다.
+
+ 그러므로 스케줄 내의 모든 트랜잭션이 병행 제어 기법에서 정의한 규약을 따르면 **직렬 가능성**을 보장받을 수 있다.
+
+* 가장 많이 사용되는 병행 제어 기법인 **Locking** 기법을 중심으로 병행 제어 기법을 자세히 알아보자.
+
+## Locking 개념
+
+* `Lock`이란 **트랜잭션 처리의 순차성**을 보장하기 위한 방법이다.
+
+ **Locking 기법**은 병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하도록 lock과 unlock이라는 2개의 연산을 이용해 제어한다.
+
+ 기본 원리는 한 트랜잭션이 먼저 접근한 데이터에 대한 연산을 모두 마칠 때까지, 다른 트랜잭션이 접근하지 못하도록 상호 배제하여 직렬 가능성을 보장하는 것이다.
+
+ `lock` 연산은 트랜잭션이 사용할 데이터에 대한 **독점권**을 가지기 위해 사용한다.
+
+ `unlock` 연산은 트랜잭션이 데이터에 대한 **독점권을 반납**하기 위해 사용한다.
+
+> Locking 기법에서 모든 트랜잭션이 지켜야 하는 **기본 Locking 규약**을 알아보자.
+
+1. Locking 기법을 사용해 트랜잭션이 **DB에 있는 데이터에 접근하는 연산을 실행**하려면, 먼저 해당 데이터에 lock 연산을 실행하여 **독점권을 획득**해야 한다.
+
+2. 트랜잭션이 lock 연산을 통해 독점권을 획득한 데이터에 대한 **모든 연산을 수행하고 나면** unlock 연산을 실행해서 **독점권을 반납**해야 한다. 그래야 다른 트랜잭션이 해당 데이터에 접근할 수 있기 때문이다.
+
+3. 데이터에 **lock 연산을 실행한** 트랜잭션만 해당 데이터에 unlock 연산을 실행할 수 있다. 즉, 데이터에 대한 독점권을 부여받은 트랜잭션만 해당 데이터에 대한 독점권을 반납할 수 있다.
+
+## Lock 단위 설정
+
+* lock 연산은 크게 전체 DB부터 DB를 구성하는 속성에 이르기까지 다양한 크기의 데이터를 대상으로 실행할 수 있다. (ex. 릴레이션, 튜플)
+
+* **전체 DB**에 lock 연산을 실행하면 제어가 간단하다는 장점이 있지만 DB에 하나의 트랜잭션만 수행하므로 병행 수행이라 할 수 없다.
+
+ 반면, **가장 적은 단위**의 속성에 lock 연산을 실행하면 독점하는 범위가 좁아 많은 수의 트랜잭션을 병행 수행할 수 있다는 장점이 있지만, 제어가 복잡하다는 단점이 있다.
+
+ 즉, Locking 단위가 커질수록 병행성은 낮아지지만 제어는 쉽고,
+
+ Locking 단위가 작아질수록 제어는 어렵지만 병행성은 높아진다.
+
+ 그러므로 시스템에 따라 적절한 Locking 단위를 선택하는 것이 중요하다.
+
+## Lock 연산 종류
+
+* Shared Lock(공유 잠금) : 해당 데이터에 read 연산만(write 연산은 실행X) 실행할 수 있다. 그리고 해당 데이터에 대한 다른 트랜잭션도 shared lock 연산을 동시에 실행할 수 있다.(동시에 접근이 가능하다)
+
+* Exclusive Lock(배타 잠금) : 해당 데이터에 read 연산과 write 연산을 모두 실행할 수 있다. 하지만 lock이 해제될 때까지 해당 데이터에 다른 트랜잭션이 어떤 lock 연산도 실행할 수 없다(접근 불가능)
+
+## Blocking
+
+* `Blocking`이란 Lock의 경합(=서로 경쟁)이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰선 상태를 말한다.
+
+* Shared Lock과 Exclusive Lock 또는 Exclusive Lock과 Exclusive Lock끼리 Blocking이 발생할 수 있다.
+
+* 이를 해결하는 방법은 Transaction commit(종료) 또는 Rollback 하는 방법이다.
+
+* 해결방안
+
+ [1] SQL 문장에 가장 빠르게 실행되도록 리펙토링하는 것이 가장 기본이며 효과적인 방법이다. (속도 개선)
+
+ [2] 트랜젝션을 가능한 짧게 정의하면 경합을 줄일 수 있다. (허용시간 단축)
+
+ [3] 동일한 데이터를 동시에 변경하는 작업을 하지 않도록 설계한다.
+
+ [4] 대용량작업이 불가피할 경우, 작업단위를 쪼개거나 `lock_timeout`을 설정하여 해당 Lock의 최대 시간을 설정할 수 있다.
+
+## DeadLock
+
+* `DeadLock`(교착 상태)란 각 트랜잭션들이 lock를 획득하기 위해 상대가 독점하고 있는 데이터에 unlock 연산이 실행되기를 서로 기다리면서 수행을 중단하고 있는 상태를 말한다.
+
+* 교착 상태에 빠지면 트랜잭션들은 더 이상 수행하지 못하고 상대 트랜잭션이 먼저 unlock 연산을 실행해주기를 한없이 기다리게 된다.
+
+
+
+* 1번 트랜잭션에서는 2번 데이터의 Lock을 획득하고, 2번 트랜잭션에서는 1번 데이터의 Lock을 획득한 상태이다.
+
+* 이때, 동시에 상대방의 데이터를 접근하려면 unlock 연산이 실행될 때까지 기다려야 한다.
+
+## Pessimistic lock
+
+* 비관적 락(Pessimistic lock)은 Repeatable_Read 또는 Serializable 정도의 격리성 수준을 제공한다.
+
+ (DB 트랜잭션 격리 수준에 대해 모르겠다면, [트랜잭션 격리 수준](https://devfancy.github.io/DB-Transaction-Isolation-Level/)을 참고하시길 바랍니다)
+
+* 비관적 락이란 지원 요청에 따른 동시성 문제가 발생할 것이라고 예상하고 **lock**을 걸어버리는 방법이다.
+
+* 다시 말해서, 트랜잭션이 시작될 때 **Shared Lock 또는 Exclusive Lock을 걸고 시작**하는 방법이다.
+
+ Shared Lock을 걸면 read 연산밖에 못하기 때문에, write 연산을 하기 위해서는 Exclusive Lock을 얻어야 한다.
+
+ 하지만, 만약 Shared Lock이 다른 트랜잭션에 의해 걸려 있으면 해당 Lock을 얻지 못하므로 업데이트를 할 수 없다.
+
+ 데이터를 수정하기 위해서는 해당 트랜잭션을 제외한 모든 트랜잭션이 종료(Commit)되어야 한다.
+
+
+* 아래의 도식도를 보면서 비관적 락에 대해 제대로 이해해보자.
+
+
+
+1. Transaction_1(T1)에서 Table Id 2번을 읽는다. (Name = Lion)
+
+2. Transaction_2(T2)에서 Table Id 2번을 읽는다. (Name = Lion)
+
+3. Transaction_2(T2)에서 Table Id 2번의 Name `Fancy`로 변경을 요청한다 (NAME = Fancy)
+
+ 하지만, Transaction_1(T1)에서 이미 Shared Lock을 걸고 있기 때문에 **Blocking** 된다.
+
+4. Transaction_1(T1)에서 해당 트랜잭션을 종료(Commit)한다.
+
+5. Blocking되었던 Transaction_2(T2)의 Update 요청이 정상 처리된다.(Name = Fancy)
+
+* 이렇게 비관적 락은 **Transaction 과정을 통해 충돌을 예방**한다.
+
+### 장점
+
+* **충돌이 자주 발생하는 환경**에서 롤백의 횟수를 줄일 수 있으므로 성능에서 유리하다.
+
+* 데이터의 무결성을 보장하는 수준이 매우 높다.
+
+### 단점
+
+* 데이터 자체에 lock을 걸어버리기 때문에 **동시성이 떨어져 성능 손해**를 많이 보게 된다. 특히 읽기가 많이 이루어지는 DB의 경우 손해가 더 심해진다.
+
+* 서로 자원이 필요한 경우에, 락이 걸려있으면 **Deadlock**이 일어날 가능성이 있다.
+
+## Optimistic lock
+
+* 낙관적 락(Optimistic lock)은 **자원에 lock을 걸어서 선점하지 말고, 동시성 문제가 발생하면 그때 가서 처리**하는 방법이다.
+
+ T1가 해당 값을 첫 번째로 수정한 이후에 같은 조건으로 T2가 해당 값을 수정할 수 없게 하는 것이다.
+
+* 이 특징은 DB에서 동시성을 처리하는 것이 아닌 **Application Level**에서 처리하는 Lock이다.
+
+* 아래의 도식로를 보면서 낙관적 락에 대해 제대로 이해해보자.
+
+
+
+1. T1이 Table Id 1번을 읽는다. (Name = Brown, Version = 1)
+
+2. T2이 Table Id 1번을 읽는다. (Name = Brown, Version = 1)
+
+3. T2이 Table Id 1번, Version 1인 row 값을 갱신한다. (Name = Brown, Version = 2) **성공**
+
+4. T1이 Table Id 1번, Version 1인 row 값을 갱신한다. (Name = Brown, Version = 2) **실패**
+
+Id 1번은 이미 Version이 2로 업데이트되었기 때문에, A는 해당 row를 갱신하지 못한다.
+
+* 위 흐름을 통해 같은 row에 대해 각기 다른 2개의 수정 요청이 있었지만, **1개가 업데이트가 이미 되어서 Version이 변경되었기 때문에 그 뒤의 수정 요청은 반영되지 않는다**.
+
+* 이때 여러 작업이 묶인 트랜잭션으로 요청이 간 경우가 **실패**한 경우, **개발자가 직접 롤백 처리**를 해줘야 한다.
+
+* 이렇게 낙관적 락은 version 등의 구분 컬럼을 이용해서 충돌을 예방한다.
+
+### 장점
+
+* 충돌이 안난다는 가정하에, **동시 요청**에 대해서 처리 성능이 좋다.
+
+### 단점
+
+* 잦은 충돌이 일어나는 경우, **롤백 처리**에 대한 비용이 많이 들어 성능에서 손해볼 수도 있다.
+
+* 롤백 처리를 구현하는게 복잡할 수 있다.
+
+
+## 예상 질문
+
+* Locking 단위 설정에 대한 장점과 단점이 무엇인가요?
+
+* Lock 연산 종류 2가지에 대해 설명해 주세요.
+
+* Optimistic Lock/Pessimistic Lock에 대해 설명해 주세요.
+
+* Optimistic Lock/Pessimistic Lock의 장단점에 대해 설명해 주세요.
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
+
+* [[DB] Lock에 대해서 알아보자 - 기본편](https://sabarada.tistory.com/121)
+
+* [[DB] Lock이란?](https://chrisjune-13837.medium.com/db-lock-%EB%9D%BD%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-d908296d0279)
+
+* [[DB] 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)](https://sabarada.tistory.com/175)
+
+* [[DB] 낙관적(Optimistic) 락과 비관적(Pessimisitc)락](https://unluckyjung.github.io/db/2022/03/07/Optimistic-vs-Pessimistic-Lock/)
\ No newline at end of file
diff --git a/src/content/posts/DB-Normalization.md b/src/content/posts/DB-Normalization.md
new file mode 100644
index 00000000..ebddbe10
--- /dev/null
+++ b/src/content/posts/DB-Normalization.md
@@ -0,0 +1,310 @@
+---
+title: "[데이터베이스개론] 정규화 과정"
+date: 2023-11-13
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글은 `데이터베이스 개론` 교재와 [ERD와 정규화 과정](https://github.com/devSquad-study/2023-CS-Study/blob/main/DB/db_erd_normalization.md)를 공부하고 필자의 생각을 포함하여 정리한 내용으로 사실과 맞지 않는 부분이 있을 수 있습니다.
+
+* 이 글은 정규화를 이용해 데이터베이스를 설계하는 방법에 대해 소개한다.
+
+* `정규화`는 데이터베이스를 설계한 후 설계 결과물을 검증하기 위해 사용하기도 한다.
+
+* 두 설계 방법은 데이터 설계 결과물이 비슷한 수준을 유지하므로 상황에 따라 적절한 방법을 선택하면 된다.
+
+## 이상 현상의 개념
+
+* 데이터베이스를 잘못 설계하면 **불필요한 데이터 중복이 발생**하여 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 수행할 때 부작용이 발생하는데
+
+ 이러한 부작용을 `이상(anomaly)` 현상이라 부른다.
+
+* 이상 현상을 제거하면서 데이터베이스를 올바르게 설계해 나가는 과정이 `정규화`다.
+
+* 정규화의 필요성과 방법을 구체적으로 알아보기에 앞서 먼저 이상 현상을 종류별로 알아보자.
+
+### 이상 현상의 종류
+
+* 이상 현상에는 삽입 이상(insertion anomaly), 갱신 이상(update anomaly), 삭제 이상(deletion anomaly)이 있다.
+
+#### 삽입 이상
+
+* `삽입 이상`(insertion anomaly)은 **새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입**해야 하는 문제를 말한다.
+
+
+
+* [그림 9-2]의 이벤트참여 릴레이션은 고객들이 이벤트에 참여한 결과를 저장하고 있는 릴레이션이다.
+
+* 여기서 이벤트참여 릴레이션에 아이디가 `melon`이고, 이름이 `성원용`, 등급이 `gold`인 신규 고객에 대한 데이터를 삽입한다고 가정해보자.
+
+* 이 고객이 참여한 이벤트가 아직 없다면, 다시 말하면, 이벤트번호와 당첨여부가 존재하지 않는다면 해당 릴레이션에 신규 고객에 대한 데이터를 삽입할 수 없다.
+
+* 따라서 신규 고객(성원용)와 같이 이벤트참여 릴레이션에 삽입하려면 실제로 참여하지 않는 임시 이벤트번호를 삽입해야 하는데, 이때 발생하게 되는 것이 `삽입 이상`이다.
+
+
+
+#### 갱신 이상
+
+* `갱신 이상`(update anomaly)은 릴레이션의 **중복된 튜플(=행)들 중 일부만 수정하여 데이터가 불일치하게 되는 모순이 발생**하는 문제를 말한다.
+
+
+
+* [그림 9-2]의 이벤트참여 릴레이션에는 아이디가 `apple`인 고객에 대한 튜플(행)이 3개 존재하여, 고객아이디, 고객이름, 등급 속성의 값이 중복되어 있다.
+
+* 만약 아이디가 `apple`인 고객의 등급이 `gold`에서 `vip`로 변경하게 된다면, `apple` 고객에 대한 튜플 3개의 등급 속성 값이 모두 수정되어야 한다.
+
+* 그렇지 않고, 아래 [그림 9-4]와 같이 2개의 튜플만 등급이 수정되면 `apple` 고객이 서로 다른 등급을 가지는 모순이 생겨 `갱신 이상`이 발생하게 된다.
+
+
+
+#### 삭제 이상
+
+* `삭제 이상`(deletion anomaly)은 릴레이션에서 튜플(행)을 삭제하면 **꼭 필요한 데이터까지 함께 삭제하여 데이터가 손실**되는 연쇄 삭제 현상을 말한다.
+
+* 아이디어가 `orange`인 고객이 이벤트 참여를 취소하여 [그림 9-2]의 이벤트참여 릴레이션에서 관련된 튜플을 삭제해야 한다면, 아래 [그림 9-5]와 같이 하나의 튜플만 삭제하면 된다.
+
+* 그런데 이 튜플은 이벤트에 대한 정보(이벤트번호, 당첨여부) 뿐만 아니라 의도치 않게 해당 고객에 대한 정보인 고객아이디, 고객이름, 등급에 대한 정보도 같이 손실되는 `삭제 이상`이 발생하게 된다.
+
+
+
+## 정규화의 필요성
+
+* [그림 9-2]의 이벤트참여 릴레이션에서 여러 `이상 현상`이 발생하는 이유는 관련 없는 속성들이 하나의 릴레이션에 모아두고 있기 때문이다.
+
+* 이상 현상이 발생하지 않기 위해서는 **관련 있는 속성들로만 릴레이션을 구성** 해야 하는데 이를 위해 필요한 것이 `정규화`다.
+
+* `정규화`는 이상 현상이 발생하지 않도록, 릴레이션을 **관련있는 속성들로만 구성하기 위해 릴레이션을 `분해`** 하는 과정이다.
+
+* `정규화` 과정에서 고려해야 하는 속성들 간의 관련성을 `함수적 종속성`(FD, Functional Dependency)이라고 한다.
+
+### 함수 종속
+
+> 이후부터는 `함수적 종속성` 대신 `함수 종속성`이라는 용어를 사용하기로 한다.
+
+> `함수적 종속성`: 테이블의 특정 컬럼 A의 값을 알면 다른 `컬럼 B` 값을 알 수 있을 때, `컬럼 B`는 컬럼 A에 함수적 종속성이 있다고 한다.
+
+* 함수 종속 관계는 X -> Y를 표현하고 X를 `결정자`, Y를 `종속자`라고 한다.
+
+* 일반적으로 릴레이션에 함수적 종속성이 하나 존재하도록 정규화를 통해 릴레이션을 분해한다.
+
+* 아래 [그림 9-7]의 고객 릴레이션을 대상으로 속성 간의 함수 종속 관계를 판단해보자.
+
+
+
+* 고객 릴레이션에서 각 `고객아이디` 속성 값에 대응되는 `고객이름` 속성과 `등급` 속성의 값이 단 하나이므로,
+
+* `고객아이디`가 `고객이름`과 `등급`을 결정한다고 볼 수 있다.
+
+* 그러므로 고객 릴레이션에서 `고객아이디`는 **결정자**가 되고, `고객이름`과 `등급`은 **종속자**가 된다.
+
+* 함수 종속에는 2가지 종류가 있다.
+
+ * `완전 함수 종속`은 릴레이션에서 속성 집합 Y가 속성 집합 X **전체**에 함수적으로 종속되어 있다는 의미이다.
+
+ * `부분 함수 종속`은 속성 집합 Y가 속성 집합 X의 전체가 아닌 **일부분**에도 함수적으로 종속됨을 의미한다.
+
+
+
+* 예를 들어, [그림 9-10]의 이벤트참여 릴레이션에서 `고객이름`은 고객아이디에 완전 함수 종속되어 있지만, {고객아이디, 이벤트번호}에는 부분 함수 종속되어 있다. 그리고 `당첨여부`는 {고객아이디, 이벤트번호}에 완전 함수 종속되어 있다.
+
+## 기본 정규형과 정규화 과정
+
+### 정규화의 개념과 정규형의 종류
+
+* `정규화`(normalization)란 **함수적 종속성을 이용**하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서, 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어나가는 과정을 말한다.
+
+* `정규화`의 기본 목표는 **관련이 없는 함수 종속성을 별개의 릴레이션으로 표현**하는 것이다.
+
+* 릴레이션이 정규화된 정도는 `정규형`(NF, Nomal Form)으로 표현된다.
+
+* 정규형은 크게 `기본 정규형`과 `고급 정규형`으로 나뉜다.
+
+ * `기본 정규형`에는 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형이 있다.
+
+ * `고급 정규형`에는 제4정규형, 제5정규형이 있다.
+
+
+
+* 각 정규형마다 만족시켜야 하는 제약조건이 존재하며, 정규형의 차수가 높아질수록 요구되는 제약조건이 많이지고 엄격해진다.
+
+* 일반적으로 차수가 높은 정규형일수록 바람직한 릴레이션일 수 있다.
+
+* 하지만 모든 릴레이션이 제5정규형에 속해야 되는 것은 아니므로 릴레이션의 특성을 고려해서 적합한 정규형을 선택해야 한다.
+
+* 일반적으로 `기본 정규형`에 속하도록 릴레이션을 정규화하는 경우가 대부분이므로 여기서는 `기본 정규형`을 중심으로 정규화 과정을 알아본다.
+
+### 제1정규형(1NF)
+
+> `제1정규형` : 릴레이션에 속한 **모든 속성의 도메인이 원자값으로만 구성**되어 있으면 제 1 정규형에 속한다.
+
+* 릴레이션이 제1정규형에 속하려면 릴레이션에 속한 모든 속성이 **더는 분해되지 않는 원자 값**만 가져야 한다.
+
+* 즉, **다중 값을 가질 수 있는 속성은 분리**되어야 한다.
+
+
+
+* [그림 9-16]의 이벤트참여 릴레이션에서 이벤트번호 속성과 당첨여부 속성은 하나의 고객아이디에 해당하는 값이 여러 개다.
+
+* 제1정규형에 속하게 하려면 **튜플마다 `이벤트번호`와 `당첨여부` 속성 값을 하나씩만 포함되도록 분해**하여, 모든 속성이 원자값을 가지도록 해야 한다.
+
+* 제1정규형을 만족하도록 정규화를 수행한 결과는 아래 [그림 9-17]과 같다.
+
+
+
+* 제1정규형을 정리하면 아래와 같다.
+
+ * [1] 모든 속성은 원자 값을 가져야 한다.
+
+ * [2] 다중 값을 가질 수 있는 속성은 분리되어야 한다.
+
+* [그림 9-17]은 제1정규형에 속하지만, 불필요한 데이터 중복으로 인해 이상 현상이 발생하는 릴레이션이 있을 수 있다.
+
+* 이러한 문제를 해결하기 위해서는 부분 함수 종속이 제거되도록 이벤트참여 릴레이션을 분해해야 한다.
+
+* 릴레이션을 분리하여 부분 함수 종속을 제거하면, 분해된 릴레이션들은 제2정규형에 속하게 되고 이상 현상은 발생하지 않게 된다.
+
+### 제2정규형(2NF)
+
+> `제2정규형` : 릴레이션이 제1정규형에 속하고, **기본키가 아닌 모든 속성이 기본키에 완전 함수 종속**되면 제2정규형에 속한다.
+
+* `제2정규형`을 만족하게 하려면, 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 거쳐야 한다.
+
+
+
+* 이벤트참여 릴레이션에서 기본키인 {고객아이디, 이벤트번호}에 완전 함수 종속되지 않는 등급, 할인율 속성이 존재하므로
+
+* [그림 9-24]와 같이 2개의 릴레이션으로 분해하면, 분해된 `고객` 릴레이션과 `이벤트참여` 릴레이션은 모두 **제2정규형**에 속하게 된다.
+
+* 정규화 과정에서 릴레이션을 분해할 때 주의할 점은, 분해된 릴레이션들을 자연 조인하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다.
+
+* 즉, 릴레이션이 의미상 **동등한** 릴레이션들로 분해되어야 하고, 릴레이션을 분해했을 때 **정보 손실이 발생하지 않아야 한다.**
+
+* 제2정규형을 정리하면 아래와 같다.
+
+ * [1] 제 1정규형을 만족하고 모든 Non-Key 컬럼은 기본키(PK) 전체에 종속(완전 종속)되어야 한다.
+
+ * [2] 만약 Non-Key 컬럼이 기본키에 종속되어있지 않거나 부분 종속되어 있으면, 기본키에 완전 종속되도록 릴레이션을 분리되어야 한다.
+
+ * [3] 정규화 과정에서 수행되는 릴레이션의 분해는 `무손실 분해`여야 한다.
+
+> `무손실 분해`(nonloss decomposition): 정보의 손실 없이 릴레이션을 분해하는 것을 의미한다.
+
+### 제3정규형(3NF)
+
+* `제3정규형` : 릴레이션이 제2정규형에 속하고, **기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면**, 제3정규형에 속한다.
+
+* 제3정규형을 살펴보기에 앞서 이를 이해하기 위해 필요한 `이행적 함수 종속`(transitive FD)을 잠깐 살펴보자.
+
+* 릴레이션을 구성하는 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X -> Y 와 Y -> Z가 존재하면 논리적으로 X -> Z가 성립한다.
+
+* 이때 속성 집합 Z가 집합 X에 **이행적으로 함수 종속**되었다고 한다.
+
+* `제2정규형`을 만족하더라도 하나의 릴레이션에 **함수 종속 관계가 여러개 존재**하고, 논리적으로 이행적 함수 종속 관계가 유도되면 이상 현상이 발생할 수 있다.
+
+* `제3정규형`을 만족하기 위해서는 릴레이션에서 **이행적 함수 종속을 제거**해서, 모든 속성이 **기본키에 이행적 함수 종속이 되지 않도록 릴레이션을 분해**하는 정규화 과정을 거쳐야 한다.
+
+
+
+* 위 [그림 9-26]에서 보는 것처럼 고객아이디가 등급을 결정하고, 등급이 할인율을 결정하는 함수 종속 관계로 인해,
+
+* 고객아이디가 등급을 통해 할인율을 결정하는 이행적 함수 종속 관계도 존재한다.
+
+* 이러한 이행적 함수 종속이 나타나는 이유는 함수 종속 관계가 하나의 릴레이션에 여러 개 존재하기 때문이다.
+
+* 따라서 `고객 릴레이션`에 이상 현상이 발생하지 않도록 하려면 **이행적 함수 종속이 나타나지 않게 2개의 릴레이션으로 분해**해야 한다.
+
+* 제3정규형을 만족하기 위해서 [그림 9-26]의 분해된 고객 릴레이션은 고객아이디 -> 등급, 등급 -> 할인율의 함수 종속 관계를 유지할 수 있도록 아래 [그림 9-32]와 같이 2개의 릴레이션으로 분해하면 된다.
+
+
+
+* 아래 [그림 9-33]의 함수 종속 다이어그램에서 확인할 수 있듯이, 릴레이션을 분해하면 하나의 릴레이션에 하나의 관계만 존재하게 되어 이행적 함수 종속으로 인한 이상 현상이 발생하지 않게 된다.
+
+
+
+* 고객 릴레이션과 고객등급 릴레이션 모두 기본기가 직접 결정하므로 제3정규형에 속한다.
+
+### 보이스/코드 정규형(BCNF)
+
+> `보이스/코드 정규형`(BCNFm Boyce/Codd Normal Form): 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.
+
+* 하나의 릴레이션에 여러개의 후보키가 존재할 수도 있는데, 이 경우에는 제3정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있다.
+
+* 이를 해결하기 위해 **제3정규형보다 좀 더 엄격한 제약조건을 제시**한 것이 `보이스/코드 정규형`이다.
+
+* [그림 9-26]에서 {고객아이디, 이벤트번호} -> 당첨여부의 함수 종속 관계를 포함하고 있는 분해된 `이벤트참여 릴레이션`은 {고객아이디, 이벤트번호}가 **유일한 `후보키`이자 기본키이면서 함수 종속관계에서도 유일한 `결정자`** 다.
+
+* 그러므로 제3정규형에 속하는 `이벤트참여 릴레이션`은 보이스/코드 정규형에도 속한다.
+
+* [그림 9-32]에서 고객아이디 -> 등급의 함수 종속 관계를 포함하고 있는 분해된 `고객 릴레이션`도 마찬가지로 기본키인 고객아이디가 함수 종속 관계에서 유일한 결정자이므로 보이스/코드 정규형에 속한다.
+
+* 이제 제3정규형에 속하지만 보이스/코드 정규형에는 속하지 않는 릴레이션의 예를 통해, 후보키가 여러 개인 릴레이션에서 어떠한 이상 현상이 발생할 수 있는지 알아보자.
+
+
+
+* [그림 9-34]의 강좌신청 릴레이션은 고객이 인터넷강좌를 신청하면 해당 강좌의 담당강사에 대한 데이터를 저장한다.
+
+* 요구 사항은 다음과 같다고 가정해본다.
+
+ * 한 고객이 인터넷강좌를 여러 개 신청할 수 있지만 동일한 인터넷강좌를 여러 번 신청할 수는 없다.
+
+ * 그리고 강사 한 명이 인터넷강좌를 하나만 담당할 수 있고, 하나의 인터넷강좌는 여러 강사가 담당할 수 있다.
+
+* 그러므로 튜플을 구별할 수 있는 후보키는 {고객아이디, 인터넷강좌}, {고객아이디, 담당강사번호}가 있고 이 중에서 {고객아이디, 인터넷강좌}를 기본키로 선정했다.
+
+* [그림 9-34]의 강좌신청 릴레이션에서 기본키인 {고객아이디, 인터넷강좌}가 담당강사번호 속성을 함수적으로 결정하는 것은 당연하다.
+
+* 그리고 강사 한 명이 인터넷강좌를 하나만 담당하므로 담당강사번호가 인터넷강좌를 함수적으로 결정한다고 볼 수 있다.
+
+* 강좌신청 릴레이션의 함수 종속 다이어그램은 아래 [그림 9-35]와 같다.
+
+
+
+* 하지만 담당강사번호 속성이 **후보키가 아님에도 인터넷강좌 속성을 결정**하므로 강좌신청 릴레이션은 보이스/코드 정규형에는 속하지 않는다.
+
+> 후보키: 유일성과 최소성을 만족하는 속성 또는 속성들의 집합이다. `고객아이디` 속성은 단독으로 고객 튜플을 유일하게 구별할 수 있으므로 후보키가 될 수 있다.
+>
+> * 키에 대해 자세한 설명은 이전에 작성한 [[DB] 관계 데이터 모델의 개념 - Key의 종류](https://devfancy.github.io/DB-RDB-Concept-Key/#%ED%9B%84%EB%B3%B4%ED%82%A4)글을 참고하자.
+
+* 이상현상이 발생하지 않도록 하려면 모든 결정자가 후보키가 될 수 있도록 강좌신청 릴레이션을 아래 [그림 9-40]과 같이 2개의 릴레이션으로 분해해야 된다.
+
+
+
+* 고객담당강사 릴레이션은 함수 종속 관계가 성립하지 않는 고객아이디, 담당강사번호 속성으로 구성하고, {고객아이디, 담당강사번호}가 기본키의 역할을 담당한다.
+
+* 강좌담당 릴레이션은 담당강사 -> 인터넷강좌의 함수 종속 관계를 포함하고 있고 담당강사번호가 유일한 후보키이자 기본키다.
+
+* 두 개의 릴레이션 모두 후보키가 아닌 결정자가 존재하지 않아 보이스/코드 정규형에 속한다.
+
+
+
+* [그림 9-41]은 강좌신청 릴레이션을 분해한 후의 고객담당강사와 강좌담당 릴레이션의 함수 종속 다이어그램이다.
+
+## 제4정규형과 제 5정규형
+
+고급 정규형으로 분류되는 제4정규형과 제5정규형은 필요시 나중에 자료를 직접 찾아보고 정리하기로 하고 여기서는 간단하게 개념만 알고 넘어가자 .
+
+> `제4정규형`은 릴레이션이 보이스/코드 정규형을 만족하면서, 함수 종속이 아닌 다치 종속(MVD, Multi Valued Dependency)을 제거해야 만족할 수 있다.
+
+> `제5정규형`은 릴레이션이 제4정규형을 만족하면서 후보키를 통하지 않는 조인 종속(JD, Join Dependency)를 제거해야 만족할 수 있다.
+
+## 마치며..
+
+* 실제로 데이터베이스를 설계할 때 모든 릴레이션이 무조건 제5정규형에 속하도록 분해해야 하는 것은 아니라고 생각한다.
+
+* 오히려 제5정규형으 만족할때 까지 분해하면 비효율적이고 바람직하지 않는 경우가 많다. (성능이 100% 좋아지는 것은 아니다)
+
+ * 테이블을 나누게 되면 어떠한 쿼리는 조인을 해야 하는 경우도 발생해서 오히려 느려질 수도 있기 때문에 서비스에 따라 정규화 또는 비정규화 과정을 진행해야 한다고 생각한다.
+
+ * 실제로 최근에 했던 [굿프렌즈](https://github.com/woorifisa-projects/GoodFriends)의 경우 여러번의 조인을 발생하지 않고 한번만 조인을 하도록 설계했다.
+
+* 일반적으로는 제3정규형이나 보이스/코드 정규형에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 형산이 발생하는 문제를 해결하는 경우가 있다.
+
+* 굿프렌즈 프로젝트를 진행할 때 정규화 과정을 생각하면서 테이블을 설계했지만, 위의 정규화 과정을 모두 지킨 것은 아니라고 생각한다. 굿프렌즈 프로젝트에 있는 DB 설계 부분을 서비스 환경과 성능에 따라 개선할 수 있는 부분이 있다면 추후에 리팩터링하자.
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
+
+* [ERD와 정규화 과정](https://github.com/devSquad-study/2023-CS-Study/blob/main/DB/db_erd_normalization.md)
+
+* [면접을 위한 CS 전공지식 노트](https://product.kyobobook.co.kr/detail/S000001834833)
\ No newline at end of file
diff --git a/src/content/posts/DB-Partition.md b/src/content/posts/DB-Partition.md
new file mode 100644
index 00000000..2579a673
--- /dev/null
+++ b/src/content/posts/DB-Partition.md
@@ -0,0 +1,116 @@
+---
+title: "[DB] 파티셔닝(Partitioning)"
+date: 2023-06-14
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글은 MySQL 공식문서를 바탕으로 공부하고 정리한 내용입니다.
+
+## Motivation
+
+* 서비스, 사용자 요구사항의 고도화에 따라서 데이터 규모가 대용량으로 증가되면서, **기존에 사용하던 DB의 용량(storage)과 성능(performance)에 한계**가 생기게 된다.
+
+* 즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하게 되었고, 이런 이슈를 해결하기 위한 방법으로 테이블을 `partition`이라는 **몇 개의 단위로 나눠서 관리하는 `파티셔닝(Partitioning)` 기법**을 활용하면 된다.
+
+* `파티셔닝(Partitioning)` 기법을 통해 SW적으로 DB를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다.
+
+## 파티셔닝이란
+
+* `파티셔닝(Partitioning)`이란 하나의 테이블을 다수의 테이블로 분할하여 관리하는 것을 의미하며, 프로그래머 입장에서는 여전히 하나의 테이블로 동작하는 것처럼 사용할 수 있다.
+
+* 즉, **큰 테이블이나 인덱스를, 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 의미한다.**
+
+* 논리적으로는 하나의 테이블처럼, 물리적으로는 여러 개의 테이블로 구성된다.
+
+## 파티셔닝의 목적
+
+### 성능(performence)
+
+* 특정 DML과 Query의 성능을 향상시킨다.
+
+* 주로 대용량 data wirte 환경에 효율적이다.
+
+* 특히, full scan에서 데이터 access의 범위를 줄여 성능 향상을 가져온다.
+
+### 가용성(Availability)
+
+* 물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
+
+* 각 분할 영역(partition 별로)을 독립적으로 백업하고 복구할 수 있다.
+
+* table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 update 성능을 향상시킨다.
+
+### 관리 용이성(Manageability)
+
+* 큰 테이블을 제거하여 관리를 쉽게 해준다.
+
+## 파티셔닝의 장단점
+
+### 장점
+
+* 관리적 측면: partition 단위 백업, 추가, 삭제, 변경
+ * 전체 데이터를 손실할 가능성이 줄어들어 데이터 가용성이 향상된다.
+ * partition별로 백업 및 복구가 가능하다.
+ * partition 단위로 I/O 분산이 가능하며 update 성능을 향상시킨다.
+
+* 성능적 측면: partition 단위로 조회 및 DML 수행
+ * 데이터 전체 검색시 필요한 부분만 탐색해 성능이 증가된다.
+ * 즉, full scan에서 데이터 접근의 범위를 줄여 성능 향상을 가져온다.
+ * 필요한 데이터만 빠르게 조회할 수 있기 때문에 쿼리 자체가 가볍다.
+
+### 단점
+
+* table간 JOIN에 대한 비용이 증가한다.
+* table과 index를 별도로 파티셔닝할 수 없다. -> table과 index를 같이 파티셔닝해야 한다.
+
+## 파티셔닝 방식
+
+* 테이블을 파티셔닝하는 방법은 크게 2가지로 구분할 수 있다.
+
+1. 수평 분할 - 주로 사용
+2. 수직 분할
+
+
+
+### 수평 분할 방식
+
+* 수평분할(Horizontal Partitioning)은 행(row)을 기준으로 테이블을 분할하는 형테이다.
+
+### 수직 분할 방식
+
+* 특정 열에 대한 접근을 제한하거나 성능 향상이 필요할 때 열(column) 기준으로 분할하는 방식이다.
+
+## 파티셔닝 종류
+
+### RANGE 파티셔닝
+
+* 지정된 범위에 속하는 열 값을 기반으로 파티션에 행을 할당한다.
+
+* 예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
+
+### LIST 파티셔닝
+
+* 값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
+
+* 예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
+
+### HASH 파티셔닝
+
+* 해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
+
+* 예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
+
+### KEY 파티셔닝
+
+* key 파티션은 hash 파티션과 거의 동일하다.
+
+* key 파티션은 선정된 파티션 키 값에 대하여 내부적으로 [MD5()](https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_md5)을 이용하여 해시값을 계산하고, 그 값에 MOD를 적용하여 저장할 파티션을 결정한다.
+
+## Reference
+
+* [[DB] DB 파티셔닝(Partitioning)이란](https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html)
+
+* [[MySQL] Chapter 24 Partitioning](https://dev.mysql.com/doc/refman/8.0/en/partitioning.html)
+
+* [Why Horizontal Partitioning Is Important For Database Design](https://www.rkimball.com/why-horizontal-partitioning-is-important-for-database-design/)
\ No newline at end of file
diff --git a/src/content/posts/DB-RDB-Concept-Key.md b/src/content/posts/DB-RDB-Concept-Key.md
new file mode 100644
index 00000000..c53db223
--- /dev/null
+++ b/src/content/posts/DB-RDB-Concept-Key.md
@@ -0,0 +1,95 @@
+---
+title: "[데이터베이스개론] 관계 데이터 모델의 개념 - Key의 종류"
+date: 2023-02-15
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글의 정보들은 `데이터베이스 개론`과 `면접을 위한 CS 전공지식 노트` 교재를 공부하면서 정리한 내용을 토대로 작성하였습니다.
+
+## Key의 종류
+
+* `key`는 테이블 간의 관계를 조금 더 명확하게 하고, 관계 데이터 모델에서 중요한 제약조건을 정의한다.
+
+ 또한 튜플을 처리하는 데 중요한 역할을 하므로 키의 개념을 정확히 이해할 필요가 있다.
+
+* 관계 데이터 모델에서는 키를 다음과 같이 `슈퍼키`, `후보키`, `기본키`, `대체키`, `외래키`의 다섯 가지로 분류할 수 있다.
+
+## 슈퍼키
+
+* `슈퍼키`는 **유일성의 특성을 만족**하는 속성 또는 속성들의 집합이다. `유일성`은 키가 갖추어야 하는 기본 특성으로, 키 값이 같은 튜플은 존재할 수 없다.
+
+
+
+* 예를 들어 [그림 5-2]의 고객 릴레이션에서 `고객아이디` 속성은 모든 고객 튜플마다 값이 다르고 이를 통해 다른 튜플과 유일하게 구별할 수 있으므로 **슈퍼키**가 될 수 있다.
+
+* 그러나 다른 속성(나이, 등급, 직업, 적립금)은 값이 같은 고객이 있을 수 있으므로 유일성을 만족시키지 못해 슈퍼키가 될 수 없다.
+
+* `고객 아이디` 속성만으로도 모든 튜플을 구별할 수 있기 때문에 **고객 아이디를 포함하는 속성 집합은 모두 슈퍼키가 될 수 있다**.
+
+## 후보키
+
+* `후보키`는 **유일성과 최소성을 만족**하는 속성 또는 속성들의 집합이다. `최소성`은 꼭 필요한 최소한의 속성들로만 키를 구성하는 특성이다. 그러므로 하나의 속성으로 구성된 키는 당연히 최소성을 만족한다.
+
+* 슈퍼키 중에서 최소성을 만족하는 것이 후보키가 된다. [그림 5-2]의 `고객아이디` 속성은 단독으로 고객 튜플을 유일하게 구별할 수 있으므로 후보키가 될 수 있다.
+
+* 후보키를 만족하기 위해서는 새로운 튜플이 삽입되거나 기존 튜플의 속성 값이 바뀌어도 유지되어야 한다.
+
+## 기본키
+
+* 여러 후보키 중에서 기본적으로 사용할 키를 반드시 선택해야 하는데 이것이 `기본키`다.
+
+* 후보키가 1개일 경우에는 해당 후보키가 기본키로 선택하고, 후보키가 여러개일 경우에는 데이터베이스 사용 환경을 고려해서 적합한 것을 기본키로 선택하면 된다.
+
+
+
+* 선택한 기본키는 [그림 5-6]과 같이 속성 이름에 밑줄을 그어 표헌한다.
+
+* **기본키를 선택할 때 고려하면 도움이 되는 기준** 몇 가지를 정리했다.
+
+1. 널 값을 가질 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
+
+2. 값이 자주 변경될 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
+
+3. 단순한 후보키를 기본키로 선택한다.
+
+* `기본키 선정 과정`은 대학에서 **학생회장을 선발하는 과정**과 유사하다. 대학에 다니는 학생들(**슈퍼키**) 중에서 학생회장이 될 만한 자격을 갖춘 후보 학생(**후보키**)을 추천한 다음, 지지를 가장 많이 받은 한 명의 학생(**기본키**)을 학생회장으로 임명하는 과정으로 이해하면 된다.
+
+## 대체키
+
+* `대채키`는 기본키로 선택되지 못한 후보키들이다.
+
+
+
+* [그림 5-8]은 하나의 릴레이션에서 볼 수 있는 슈퍼키, 후보키, 기본키, 대체키의 관계를 그림으로 표현한 것이다.
+
+* 이 외에도 다른 릴레이션과 관계에서 고려할 수 있는 외래키가 있다.
+
+## 외래키
+
+* `외래키`는 어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키다.
+
+* 다시 말해 **다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합**이 외래키다.
+
+```markdown
+외래키가 다른 테이블의 대체키를 참조하는 것도 가능하다.
+기본키로 선택받지 못했지만 유일성과 최소성을 만족하는 대체키를 참조하더라도 **관련 있는 튜플을 구분할 수 있기 때문**이다.
+```
+
+* 외래키의 개념과 필요성을 파악하기 위해 인터넷 쇼핑몰을 위한 데이터베이스에서 고객 릴레이션과 주문 릴레이션의 관계를 생각해보자.
+
+
+
+* [그림 5-9]에서 고객 릴레이션은 속성이 6개이고, `고객 아이디` 속성이 기본키다. 주문 릴레이션은 속성이 6개이고, `주문번호` 속성이 기본키다.
+
+* 여기서 주문 릴레이션의 주문고객 속성이 **고객 릴레이션의 기본키인 `고객 아이디` 속성을 참조**하면 `주문고객` 속성을 **외래키**라고 한다.
+
+
+
+* [그림 5-10]와 같이 외래키는 **반드시 다른 릴레이션의 기본키를 참조**해야 하며 외래키의 도메인은 참조되는 기본키와 같게 정의되어야 한다.
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
+
+* [면접을 위한 CS 전공지식 노트](https://product.kyobobook.co.kr/detail/S000001834833)
diff --git a/src/content/posts/DB-RDB-Concept.md b/src/content/posts/DB-RDB-Concept.md
new file mode 100644
index 00000000..2050ee98
--- /dev/null
+++ b/src/content/posts/DB-RDB-Concept.md
@@ -0,0 +1,147 @@
+---
+title: "[데이터베이스개론] 관계 데이터 모델의 개념"
+date: 2023-02-15
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글의 정보들은 `데이터베이스 개론`과 `면접을 위한 CS 전공지식 노트` 교재를 공부하면서 정리한 내용을 토대로 작성하였습니다.
+
+## 데이터베이스의 기본
+
+* 데이터베이스는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음이다.
+
+* 해당 데이터베이스를 제어, 관리하는 통합 시스템을 `DBMS`라고 하며, 데이터베이스 안에 있는 데이터들을 특정 DBMS 마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회 등을 수행할 수 있다.
+
+* 또한 데이터베이스는 실시간 접근과 동시 공유가 가능하다.
+
+### 엔티티
+
+* 엔티티(entity)는 사람, 장소, 물건, 사건, 개념 등 여러 개의 속성을 지닌 명사를 의미한다.
+
+* 예를 들어 회원이라는 엔티티가 있다고 하면, 회원은 이름, 아이디, 주소, 전화번호의 속성을 갖는다.
+
+* 물론 이보다 더 많은 속성이 있을 수 있지만 서비스의 요구 사항에 맞춰 속성이 정해진다.
+
+### 릴레이션
+
+* 릴레이션은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이다.
+
+* 엔티티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리한다.
+
+## 관계 데이터 모델의 기본 용어
+
+* 일반적으로 관계 데이터 모델에서는 하나의 개체에 관한 데이터를 **릴레이션(relation)** 하나에 담아 데이터베이스를 저장한다.
+
+* [그림 5-1]은 인터넷 쇼핑몰을 위한 데이터베이스에서 고객 개체를 표현한 고객 릴레이션의 예다. 해당 예시를 통해 릴레이션과 관련된 용어를 하나씩 알아보자.
+
+![]()
+
+### 속성
+
+* **릴레이션의 열**을 속성(or attribute)라고 부른다. [그림 5-1]의 고객 릴레이션에는 **고객아이디, 고객이름, 나이, 등급, 직업, 적립금**이라는 6개의 속성이 존재한다.
+
+* 릴레이션은 파일 관리시스템의 **파일**, 속성은 해당 파일의 **필드**에 대응하는 개념이다.
+
+### 튜플
+
+* **릴레이션의 행**을 튜플(or tuple)이라고 부른다. [그림 5-1]에서 고객 4명에 대한 데이터를 저장하고 있는 고객 릴레이션에는 4개의 튜플 또는 4개의 고객 개체 인스턴스가 존재한다.
+
+* 튜플은 파일 관리 시스템 관점에서 해당 파일의 **레코드**에 대응하는 개념이다.
+
+### 도메인
+
+* **속성 하나가 가질 수 있는 모든 값의 집합**을 해당 속성의 도메인(domain)이라 한다.
+
+* [그림 5-1]의 고객 릴레이션에서 등급 속성의 값으로 vip, gold, silver, bronze 중 하나만 허용된다면, 네 가지 값을 모아 놓은 것이 **등급** 속성의 도메인이 된다.
+
+* 매번 모든 값을 일일이 나열하여 도메인을 정의하기가 어렵기 때문에, 일반적으로 속성의 특성을 고려한 **데이터 타입**으로 정의한다.
+
+* CHAR(20), INT 같이 특정 데이터 타입으로 선언된 변수는 해당 데이터 타입의 값만 저장할 수 있는 것과 같은 원리다.
+
+* **데이터 타입**을 도메인, **변수**를 속성으로 생각하면 이해하기 쉽다.
+
+### 널값
+
+* 릴레이션에 있는 특정 튜플의 속성 값을 모르거나, 적합한 값이 없는 경우에는 널(null)이라는 특별한 값을 사용할 수 있다.
+
+* 널 값은 특정 속성에 해당하는 값이 없음을 나타내므로 **숫자 0 혹은 공백 문자와는 다르다**.
+
+* 널 값은 데이터베이스 관리 시스템마다 내부적으로 표시하는 기호가 다르다.
+
+### 차수
+
+* 하나의 릴레이션에서 **속성의 전체 개수**를 릴레이션의 차수(degree)라고 한다.
+
+* 예를 들어 [그림 5-1]의 고객 릴레이션은 차수는 6이다.
+
+* 모든 릴레이션은 **최소 1 이상의 차수를 유지**해야 한다.
+
+* 릴레이션의 차수는 일반적으로 **자주 변하지 않는다는 정적인 특징**이 있다.
+
+### 카디널리티
+
+* 하나의 릴레이션에서 **튜플의 전체 개수**를 카디널리티(cardinality)라고 한다.
+
+* 예를 들어 [그림 5-1]의 고객 릴레이션의 카디널리티는 4이다.
+
+* 튜플이 없는 릴레이션이 존재할 수도 있다.
+
+* 새로운 튜플이 계속 삽입되거나 기존 튜플이 삭제될 수 있으므로 릴레이션의 카디널리티는 일반적으로 **자주 변한다는 동적인 특징**이 있다.
+
+## 릴레이션과 데이터베이스의 구성
+
+* 관계 데이터 모델에서 릴레이션은 [그림 5-2]와 같이 `릴레이션 스키마`와 `릴레이션 인스턴스`로 구성되어 있다.
+
+
+
+### 릴레이션 스키마
+
+* 릴레이션 스키마는 **릴레이션의 이름과 릴레이션에 포함된 모든 속성의 이름으로 정의**하는 릴레이션의 논리적 구조다.
+
+* 일반적으로 다음과 같은 형태로 쉽게 표현한다.
+
+> 릴레이션 이름(속성이름1, 속성이름2, ..., 속성이름 n)
+
+* [그림 5-2]의 고객 릴레이션에서 릴레이션 스키마는 `고객(고객아이디, 고객이름, 나이, 등급, 직업, 적립금)` 이다.
+
+* 릴레이션 스키마는 `릴레이션 내포`라고도 부른다.
+
+### 릴레이션 인스턴스
+
+* 릴레이션 인스턴스는 **어느 한 시점에 릴레이션에 존재하는 튜플들의 집합**이다.
+
+* [그림 5-2]의 고객 릴레이션에서 `4`개의 튜플로 구성된 릴레이션 인스턴스를 확인할 수 있다.
+
+* 릴레이션 인스턴스는 간단히 `릴레이션`이라 부르기도 하고 `릴레이션 외연`이라고도 부른다.
+
+### 데이터베이스 스키마와 데이터베이스 인스턴스
+
+* 일반적으로 데이터베이스는 릴레이션이 여러 개로 구성된다.
+
+* [그림 5-3]와 같이 인터넷 쇼핑몰 데이터베이스는 여러 릴레이션으로 구성되어 있다.
+
+
+
+* `데이터베이스 스키마`는 데이터베이스를 구성하는 릴레이션들의 스키마를 모아놓은 것이다.
+
+* `데이터베이스 인스턴스`는 어느 한 시점에서 데이터베이스에 저장된 데이터 내용의 전체 집합을 의미한다.
+
+### 릴레이션의 특성
+
+* **관계 데이터 모델**의 릴레이션에는 4가지 중요한 특성이 있다.
+
+* 기본적으로 이 4가지 특성을 만족해야 테이블이 릴레이션으로 인정받을 수 있다.
+
+1. 튜플의 유일성 : 하나의 릴레이션에는 동일한 튜플이 존재할 수 없다.
+
+2. 튜플의 무순서 : 하나의 릴레이션에서 튜플 사이의 순서는 무의미하다.
+
+3. 속성의 무순서 : 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.
+
+4. 속성의 원자성 : 속성 값으로 원자 값만 사용할 수 있다. (`원자 값`이란 더는 분해할 수 없는 하나의 값을 의미한다)
+
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
diff --git a/src/content/posts/DB-Rdb-Nosql.md b/src/content/posts/DB-Rdb-Nosql.md
new file mode 100644
index 00000000..43c48d1c
--- /dev/null
+++ b/src/content/posts/DB-Rdb-Nosql.md
@@ -0,0 +1,212 @@
+---
+title: "[DB] RDB와 NoSQL"
+date: 2023-02-12
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글의 정보들은 `데이터베이스 개론`과 `면접을 위한 CS 전공지식 노트` 교재를 공부하면서 정리한 내용을 토대로 작성하였습니다.
+
+## RDB
+
+* `RDB`는 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.
+
+* 관계 데이터베이스 모델의 주요 이점은 직관적인 데이터 표현 방법을 제공하고 관련 데이터 포인트에 쉽게 접근할 수 있다는 점이다.
+
+* 관계 데이터베이스를 사용하면 데이터를 관리하고 저장할 때 다음과 같은 **여러 가지 장점**이 있다.
+
+* `RDB`의 장점
+
+ * [1] 정형화된 데이터를 저장하기 때문에 데이터의 형태와 크기를 **미리 정하고 테이블 단위로 구분**하여 데이터를 저장할 수 있다.
+
+ * [2] 트랜잭션을 통해 **ACID** (원자성, 일관성, 격리성, 지속성)를 보증하여 안정적인 데이터 관리가 가능하다.
+
+ * [3] 조인을 포함해 **복잡한 조건을 포함하는 데이터 검색이 가능**하다. (**복잡한 질의 처리 가능**)
+
+ * [4] 데이터베이스 정규화 : 관계 데이터베이스는 **데이터 중복성을 줄이고 데이터 무결성을 개선하는 `정규화`라는 설계 기법을 사용**한다.
+
+## RDBMS
+
+* `RDBMS`란 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스를 가리키며 `SQL`이라는 언어를 써서 조작한다.
+
+* RDBMS 종류에는 `MySQL`, `PostgreSQL`, `Oracle`, `Microsoft SQL Server`, `MariaDB` 등이 있다.
+
+
+
+* 현재 기준(2023.02.13) 가장 인기있는 10가지 `DBMS`는 다음과 같다.
+
+
+
+* 관계 데이터베이스의 경우 표준 SQL은 지키기는 하지만, 각각의 제품에 특화시킨 `SQL`을 사용한다.
+
+ * 예를 들어 Oracle의 경우 PL/SQL 이라고 하며 SQL Server에서는 T-SQL, MySQL은 SQL을 사용한다.
+
+### MySQL
+
+* `MySQL` 은 대부분의 OS(운영체제)와 호환되며 현재 2위로 많이 사용하는 데이터베이스 관리 시스템이며 메타, 트위터 등 많은 기업에서 MySQL를 사용하고 있다.
+
+ * 참고) - [DB-Engines Ranking](https://db-engines.com/en/ranking)
+
+* C, C++로 만들어졌으며 MyISAM 인덱스 압축 기술, B-tree 기반의 인덱스, Thread 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스를 제공한다.
+
+* **대용량 데이터베이스**를 위해 설계되어 있고 롤백, 커밋, 이중 암호 지원 보안등의 기능을 제공하며 많은 서비스에서 사용한다.
+
+* MySQL의 스토리지 엔진 아키텍쳐는 다음과 같다.
+
+
+
+* 데이터베이스의 심장과도 같은 역할을 하는 곳이 바로 `스토리지 엔진`인데, **모듈식 아키텍쳐**로 쉽게 스토리지 엔진을 바꿀 수 있으며, 데이터 웨어하우징, 트랜잭션 처리, 고가용성 처리에 강점을 두고 있다.
+
+* 스토리지 엔진 위에는 `커넥터 API` 및 `서비스 계층`을 통해 MySQL 데이터베이스와 쉽게 상호 작용할 수 있다.
+
+* 또한, MySQL은 **쿼리 캐시를 지원**해서 입력된 쿼리 문에 대한 전체 결과 집합을 저장하기 때문에 사용자가 작성한 쿼리가 캐시에 있는 쿼리와 동일하면 서버는 단순히 구문 분석, 최적화 및 실행을 건너뛰고 캐시의 출력만 표시한다.
+
+* 하지만 MySQL에는 단점들이 있다.
+
+ * 복잡한 쿼리를 사용할 때에는 성능 저하를 일으킨다.
+
+ * 트랜잭션 지원이 완벽하지 않다.
+
+ * 사용자정의 함수의 사용이 쉽지 않고 유연하지 않는다.
+
+### PostgreSQL
+
+* `PostgreSQL` 역시 개발자들이 선호하는 데이터베이스 기술로 널리 인정받고 있다.(세계 4위)
+
+
+
+* PostgreSQL 은 수년간 압도적인 성장 속도를 보여주며 3위와의 격차를 좁혀나가고 있다.
+
+* PostgreSQL의 특장점은 다음과 같다.
+
+ * [1] 라이선스에 대한 비용 문제가 전혀 없다. - BSD 라이선스이며, 라이선스의 가장 큰 특징은 소스를 변경하고 그 소스를 숨긴 채 재배포 해도 법적으로 문제가 없다는 점이다.
+
+ * [2] **오래된 오픈소스의 안정성** - 매우 가볍게 돌아가는 데이터베이스지만, 대용량 데이터의 처리에도 큰 문제점이 발견되지 않았고, 표준SQL 잘 따르고있다.
+
+ * [3] 여전히 발전중인 데이터베이스 - PostgreSQL은 생각보다 빠른 속도로 업데이트를 지속하고 있다.
+
+ * [4] **장점이자 단점인 독창적인 자료형 및 문법** - 장애 시 참고자료로 국내자료에서 쉽게 찾아볼 수 없다. ostgreSQL의 최근 버젼들이 오류메시지를 한글화해서 보여주면서, 한글 오류를 해외 레퍼런스에서 검색하는데 있어 많은 어려움을 겪기도 했다.
+
+
+### Oracle
+
+* 미국의 오라클 회사에서 제작한 **세계 점유율 1위** 데이터베이스 관리 시스템이며 현재 **유닉스 체제에서 가장 많이 사용**되는 DBMS이다.
+
+* 오라클의 장점은 다음과 같다.
+
+ * 관리 시스템 : 멀티플 데이터베이스 튜닝이 가능하고 다수의 사용자가 동시에 접근이 가능하다.
+
+ * 변화 관리 : 변경 plan을 작성하고 실제 구현하기 전에 변경 사항의 효과를 볼 수 있다. 또한 생산 시스템을 방해하지 않는다.
+
+ * 경고 : 오류가 발생하면 설정되어 있는 계정 및 이메일로 연락이 온다. 경고는 예정된 가종 정지 시간 동안 차단될 수 있다.
+
+ * **분산 처리**: DBMS 실행 컴퓨터, 서버 역할 컴퓨터, DB 응용 프로그램 실행 컴퓨터 각각 다르게 분산처리가 가능하다.
+
+ * **용량과 처리** : 다른 데이터베이스보다 고성능의 트랜잭션을 처리한다. 그리고 비용을 최소화하기 위해 테이블과 인덱스를 분석한다.
+
+* 오라클의 단점은 다음과 같다.
+
+ * 비용적인 부담이 있다.
+
+ * 기능이 많기 때문에 초보자가 사용하기 어려움이 있다.
+
+ * 높은 지원의 하드웨어 사양이 필요하다.
+
+* 대체적으로 돈이 적거나 중소기업들은 MySQL을 선호하고, 충분한 예산과 복잡한 비즈니스 요구를 수행하는 큰 프로젝트를 주로 수행하는 대기업은 Oracle을 선호한다.
+
+## NoSQL
+
+* NoSQL(Not only SQL)이라는 슬로건에서 생겨난 데이터베이스이다.
+
+> 왜 NoSQL이 생겼을까?
+
+* 웹이 기하급수적으로 성장하면서, 이미지, 동영상 같은 멀티미디어 데이터뿐 아니라, SNS를 통해 작성되는 자유로운 형태의 텍스트와 로그 기록같은 **비정형 데이터**가 빠른 속도로 대량 생산되고 있다.
+
+* 이런 환경에서 관계 데이터베이스의 장점을 유지하면 **엄청나게 많은 비용이 든다**.
+
+* 단일 컴퓨터 환경에서 주로 사용되는 관계 데이터베이스는 여러 컴퓨터가 연결되어 하나의 시스템을 구성하는 클러스터 환경에서 효율적으로 동작하도록 설계되지 않았다는 문제점도 지니고 있다.
+
+* 이러한 웹에서 **대량의 비정형 데이터의 저장과 처리를 위해** 관계 데이터베이스를 대신할 새로운 대안으로 제시한 것이 `NoSQL`이다.
+
+* 실제로 **소셜 네트워크 서비스를 제공하는 기업**들을 중심으로 NoSQL 관련 기술이 발전해왔다.
+
+## NoSQL 특징
+
+* NoSQL은 **빠른 속도로 생성되는 대량의 비정형 데이터를 저장하고 처리하기 위해** ACID를 위한 트랜잭션 기능을 제공하지 않는 대신, **저렴한 비용으로 여러 대의 컴퓨터에 데이터를 분산,저장,처리하는 것이 가능**한 데이터베이스다.
+
+* 더 융통성 있는 데이터 모델을 사용하고 스키마 없이 동작하기 때문에 **데이터 구조를 미리 정의할 필요가 없고**, 수시로 그 구조를 바꿀 수 있어서 비정형 데이터를 저장하기에 적합하여 대부분 **오픈 소스**로 제공된다.
+
+* 이처럼 NoSQL은 엄청난 속도로 대량 생산되는 빅데이터를 처리하기 위해, 관계 데이터 모델을 고집하지 않고 미리 정의된 스키마를 사용하지 않는 대신 **클러스터 환경에 맞는 데이터베이스를 만들기 위해 노력해온 결과물**이라 할 수 있다.
+
+* NoSQL을 관계 데이터베이스의 **경쟁자로 볼 필요는 없다**. 관계 데이터베이스와 NoSQL의 **사용 목적이 다르기 때문에** NoSQL이 관계 데이터베이스를 완전히 대체하기는 어렵다.
+
+* `관계 데이터베이스`는 트랜잭션을 통해 일관성을 유지하고 외래키로 테이블 간의 관계를 표현함으로써 조인과 같은 복잡한 질의를 처리할 수 있지만 빠른 속도로 증가하는 대량의 비정형 데이터를 저장하기에는 **확장성 측면에서 비효율적이다**.
+
+* `NoSQL`은 트랜잭션 기능을 제공하지 않고 정해진 스키마도 없기 때문에 자유롭게 구조를 바꾸며 대량의 비정형 데이터를 빠르게 저장하고 처리할 수 있다. 하지만 **데이터 마이닝과 같은 별도의 분석 기술을 적용**해 숨겨진 의미를 찾아내야 한다.
+
+* NoSQL 종류에는 대표적으로 `MongoDB`, `Redis` 등이 있다.
+
+* 
+
+### MongoDB
+
+* `MongoDB`는 JSON을 통해 데이터에 접근할 수 있고, Binary JSON 형태(BSON)로 데이터가 저장되며 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 **키-값 데이터 모델에서 확장된 도규먼트 기반의 데이터베이스**이다.
+
+* 확장성이 뛰어나며 빅데이터를 저장할 때 성능이 좋고 고가용성과 샤딩, 레플리카셋을 지원한다.
+
+* 또한 스키마를 정해 놓지 않고 데이터를 삽입할 수 있기 때문에 다양한 도메인의 데이터베이스를 기반으로 분석하거나 로깅 등을 구현할 때 강점을 보인다.
+
+* 그리고 MongoDB는 도규먼트를 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값인 `ObjectID`가 생성된다.
+
+ * 이는 기본키로 유닉스 시간 기반의 타임스탬프(4바이트), 랜덤 값(5바이트), 카운터(3바이트)로 이루어져 있다.
+
+### Redis
+
+* `Redis`는 인메모리 데이터베이스자 키-값 데이터 모델 기반의 데이터베이스이다.
+
+* 기본적인 데이터 타입은 문자열(string)이며 최대 512MB까지 저장할 수 있다. 이외에도 Set, Hash 등을 지원한다.
+
+* Pub/Sub 기능을 통해 채팅 시스템, 다른 데이터베이스 앞단에 두어 사용하는 캐싱 계층, 단순한 키-값이 필요한 세션 정보 관리, 정렬된 Set 자료 구조를 이용한 실시간 순위표 서비스에 사용한다.
+
+## RDBMS vs NoSQL
+
+* 관계 데이터베이스와 NoSQL 중에 무엇을 선택해야 할지 고민한다면 자신이 데이터베이스를 사용하는 업무 환경과 역량에 가장 적합한 것을 고르면 된다고 조언하고 싶다.
+
+* 즉, **저장될 데이터의 형태와 처리목적에 더 적합**한 것을 선택하면 된다.
+
+* `RDBMS`는 기업의 인사, 회계 자료와 같이 **일관성이 중요하고 조인과 같이 복잡한 질의 처리가 필요**한 정형화된 데이터를 관리하는 용도일 때 더 적합하다.
+
+* `NoSQL`은 **SNS**를 통해 양산되는 이미지와 텍스트 데이터, **CCTV**를 통해 촬영되는 영상들, 센싱 데이터와 같이 빠른 속도로 엄청난 양이 생성되지만 수정보다는 **삽입 연산 위주의 데이터를 저장하고 관리하는 용도**일 때 더 적합하다.
+
+* 다음은 관계 데이터베이스와 NoSQL을 몇 가지 측면에서 간단히 비교한 것이다.
+
+|구분|RDB|NoSQL|
+|----|----|----|
+|처리 데이터|정형 데이터|정형 데이터, 비정형 데이터|
+|대용량 데이터|대용량 처리 시 성능 저하|대용량 데이터 처리 지원|
+|스키마|미리 정해진 스키마가 존재|스키마가 없거나 변경이 자유로움|
+|트랜잭션|트랜잭션을 통해 일관성 유지를 보장함|트랜잭션을 지원하지 않아 일관성 유지를 보장하기 어려움|
+|검색 기능|조인 등의 복잡한 검색 기능 제공|단순한 데이터 검색 기능 제공|
+|확장성|클러스터 환경에 적합하지 않음|클러스터 환경에 적합함|
+|라이선스|고가의 라이선스 비용|오픈소스|
+|대표적 사례|MySQL, PostgreSQL, Oracle, Microsoft SQL Server, MariaDB|MongoDB, Redis|
+
+
+## 예상 질문
+
+* RDB의 특징은 무엇인가요?
+
+* NoSQL이 생겨난 이유와 특징에 대해 설명해 주세요.
+
+* RDB, NoSQL 비교해서 설명해 주세요.
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
+
+* [면접을 위한 CS 전공지식 노트](https://product.kyobobook.co.kr/detail/S000001834833)
+
+* [PostgreSQL을 선택한 이유](https://codecamp.tistory.com/2)
+
+* [Oracle과 MySQL의 차이점](https://velog.io/@alicesykim95/Oracle%EA%B3%BC-MySQL%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90)
+
diff --git a/src/content/posts/DB-Transaction-Isolation-Level.md b/src/content/posts/DB-Transaction-Isolation-Level.md
new file mode 100644
index 00000000..f192041d
--- /dev/null
+++ b/src/content/posts/DB-Transaction-Isolation-Level.md
@@ -0,0 +1,233 @@
+---
+title: "[DB] 트랜잭션 격리 수준"
+date: 2023-02-20
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+## Prologue
+
+* [이전 트랜잭션](https://devFancy.github.io/DB-Transaction/)의 ACID 특성 중 한 가지인 **격리성**에 대해 조금 더 깊게 공부하기 위해 해당 포스트를 작성하게 되었다.
+
+## 격리성
+
+* 트랜잭션의 특성 중 한 가지인 `격리성`(Isolation)은 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성된 중간 연산 결과에 **다른 트랜잭션들이 접근할 수 없음**을 의미한다.
+
+* 격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다.
+
+* 격리 수준은 아래와 같이 4개가 있다.
+
+
+
+* 위로 갈수록 동시성이 강해지지만 격리성은 약해지고, 아래로 갈수록 동시성은 약해지지만 격리성은 강해진다.
+
+* 또한 각 단계마다 나타나는 현상이 있다.
+
+ * `READ_UNCOMMITTED` - 팬텀 리드, 반복 가능하지 않는 조회, 더티 리드가 발생할 수 있다.
+
+ * `READ_COMMITTED` - 팬텀 리드, 반복 가능하지 않는 조회가 발생한다.
+
+ * `REPEATABLE_READ` - 팬텀 리드가 발생한다.
+
+## 격리 수준에 따라 발생하는 현상
+
+* 격리 수준에 따라 발생하는 현상은 더티 리드, 반복 가능하지 않는 조회, 팬텀 리드가 있다.
+
+### 더티 리드
+
+* 더티 리드(Dirty Read)는 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 **다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은'행의 데이터를 읽을 경우** 발생한다.
+
+* 예를 들어 사용자 A의 계좌(A 트랜잭션)가 \$100을 \$0으로 변경한 내용이 **아직 커밋되지 않은** 상태라도 그 이후에 사용자 B가 조회했을 때 결과가 \$0으로 나온 경우를 말한다.
+
+* 만약 **수정한** 트랜잭션 A가 그 변경 사항을 **롤백**하면, 그 데이터를 읽은 다른 트랜잭션 B가 **더티 데이터**를 가지고 있다고 말한다.
+
+### 반복 가능하지 않은 조회
+
+* 반복 가능하지 않은 조회(Non-Repeatable Read)는 한 트랜잭션 내의 **같은 행**에 두 번 이상 조회가 발생했는데, 그 **값이 다른 경우**를 가리킨다.
+
+* 예를 들어 팬시의 계좌가 1번인 잔고 안에 \$100가 들어 있다.
+
+ 처음에 계좌 1번의 데이터를 읽으면, \$100를 읽게 된다.
+
+ 하지만 이 때 팬시가 계좌가 1번인 잔고에서 \$10을 다른 계좌로 송금했다.
+
+ 그러면 두 번째로 계좌 1번의 데이터를 읽을 때에는 \$90를 읽게 된다.
+
+* 이처럼 한 트랜잭션 내에서 **같은 Key**를 가진 Row를 두 번 읽었는데 그 사이에 **값이 변경되거나 삭제**되어 결과가 다르게 나타나는 현상을 말한다.
+
+### 팬텀 리드
+
+* 팬텀 리드(Phantom Read)는 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 **해당 조회 결과가 다른 경우**를 말한다.
+
+* 다른 트랜잭션 의한 변경 사항으로 인해 현재 사용중인 트랜잭션의 Where 절의 **조건**에 맞는 **새로운 행**이 생길 수 있는 경우에 관한 것이다.
+
+* 예를 들어, 팬시의 잔고가 \$100 미만인 계좌가 2개인 DB에서
+
+ \$100 미만인 계좌를 찾는 트랜잭션이 있고, 그 트랜잭션안에서 Select 쿼리를 2번 수행한다고 가정하자.
+
+ 처음에 데이터를 읽으면 **2개**의 계좌를 찾게 된다.
+
+ 하지만 이 때 다른 트랜잭션에서 **\$0인 계좌**를 새로 만들고 난 이후에
+
+ 두 번째 데이터를 읽을 때에는 **3개**의 계좌를 찾게 된다.
+
+* 이처럼 Where 절의 조건에 맞는 새로운 행이 생길 수 있는 경우를 말한다.
+
+## 격리 수준
+
+
+
+* 위의 표에서 알 수 있듯이 엄격해질수록 이상 현상을 허용하지 않는다.
+
+* 격리 수준은 세 가지 이상 현상을 정의한 뒤 어떤 현상을 허용/허용하지 않는지에 따라 격리 수준이 나뉜다.
+
+* 개발자는 이 격리 수준을 통해 전체 **처리량**(Throughput)과 **데이터 일관성** 사이에서 **trade** 할 수 있다.
+
+### 격리 수준의 필요성
+
+* DB는 데이터 무결성을 보장하는 것이 중요하다. `데이터 무결성`은 데이터의 정확성과 일관성을 유지하고 보증하는 것을 말한다.
+
+ 그리고 그 무결성을 보장하기 위한 특징이 **ACID**(Atomicity, Consistency, Isolation, Durability)이다.
+
+ 데이터베이스는 ACID 특징과 같이 트랜잭션이 독립적인 수행을 하도록 한다. 그래서 등장한 개념이 **Locking**이다.
+
+* `Locking`은 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하게 막는 역할이다.
+
+ 하지만 **무조건적인 Locking**으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하면 **DB의 성능**은 현저히 떨어지게 될 것이다.
+
+ 그렇다고 해서 성능을 높이기 위해 **Locking 범위**를 줄인다면, 잘못된 값이 처리될 수 있다.
+
+ 그래서 최대한 효율적인 **Locking 방법**이 필요하다.
+
+* 이와 관련된 Locking 방법이 **격리 수준**(Isolation Level)이다.
+
+### READ_UNCOMMITTED
+
+* 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 **노출**되는 문제가 있지만 가장 빠르다.
+
+* 이는 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나, 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 **어림잡아 집계**하는 데는 사용하면 좋다.
+
+* 발생할 수 있는 문제
+
+ * Phantom Read
+
+ * Non-Repeatable Read
+
+ * Dirty Read
+
+### READ_COMMITTED
+
+* 가장 많이 사용하는 격리 수준이며, PostgreSQL, SQL Server, 오라클에서 기본값으로 설정되어 있다.
+
+* READ_UNCOMMITTED 와 달리 다른 트랜잭션이 커밋 되지 않은 정보는 읽을 수 없다.
+
+ 즉, **커밋 완료된 데이터**만 조회를 허용한다.
+
+* 하지만, 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 **수정**할 수 있다.
+
+ 예를 들어 트랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수 있다.
+
+* 발생할 수 있는 문제
+
+ * Phantom Read
+
+ * Non-Repeatable Read
+
+### REPEATABLE_READ
+
+> "REPEATABLE READ: This is the default isolation level for InnoDB." - MySQL 공식문서 -
+
+* **`MySQL의 InnoDB엔진`의 기본 격리수준**으로, 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 **새로운 행을 추가**하는 것은 막지 않는다.
+
+ 따라서 이후에 **추가된 행**이 발견될 수 있다.
+
+* 발생할 수 있는 문제
+
+ * Phantom Read
+
+#### REPEATABLE READ와 스냅샷
+
+> 2025.07.23 업데이트
+
+앞선 설명만 보면 한 가지 의문이 생길 수 있다.
+
+"REPEATABLE READ도 커밋된 데이터를 읽는다고 했는데, 왜 다른 트랜잭션이 커밋한 최신 데이터를 보지 못하는 걸까?"
+
+앞선 설명만 보면 한 가지 의문이 생길 수 있습니다. "REPEATABLE READ도 커밋된 데이터를 읽는다고 했는데, 왜 다른 트랜잭션이 커밋한 최신 데이터를 보지 못하는 걸까?"
+
+결론부터 말하면 **`REPEATABLE READ`는 트랜잭션 내 첫 `SELECT` 시점의 '스냅샷(Snapshot)'을 만들어, 트랜잭션이 끝날 때까지 그 스냅샷의 데이터만 일관되게 보여주기 때문**이다. 이는 MySQL의 **MVCC(Multi-Version Concurrency Control)** 와 관련된 핵심 동작 방식이다.
+
+다른 트랜잭션이 데이터를 변경하고 커밋해도, 현재 트랜잭션은 **'반복 가능한 읽기'를 보장하기 위해 의도적으로 최신 변경 사항을 무시**하고 자신만의 스냅샷을 참조한다.
+
+아래 그림은 동시 결제 요청 시 스냅샷으로 인해 문제가 발생하는 과정을 보여준다.
+
+> REPEATABLE READ의 스냅샷 동작 원리
+
+
+
+시나리오 분석: 아래 타임라인을 통해 두 트랜잭션이 어떻게 상호작용하는지 자세히 살펴보자.
+
+* T1: 트랜잭션 A(5,000원 결제)와 B(3,000원 결제)가 거의 동시에 시작된다. 트랜잭션 B는 잔액 `10,000원`을 조회하고, 이 시점에 **B를 위한 데이터 스냅샷(Snapshot)이 생성된다.**
+
+* T2 ~ T3: 트랜잭션 A가 먼저 DB Lock을 획득하여 결제를 처리한다. 트랜잭션 B는 동일한 데이터에 접근하려다 Lock을 얻지 못하고 **대기(Blocked) 상태**가 된다.
+
+* T4: 트랜잭션 A가 처리를 마치고 `5,000원`이 차감된 잔액을 **커밋(Commit)**한다. DB의 실제 잔액은 `5,000원`이 되고 Lock은 해제된다. 대기하던 트랜잭션 B가 드디어 Lock을 획득하고 깨어난다.
+
+* T5: 로직을 재개한 트랜잭션 B가 비즈니스 로직을 위해 잔액을 참조한다. 이때 B는 DB의 최신 값(5,000원)을 보는 것이 아니라, **T1에서 생성한 자신만의 스냅샷**을 일관되게 참조한다. 따라서 B에게 잔액은 여전히 `10,000원`으로 보인다. 이것이 바로 `REPEATABLE READ`의 핵심 동작이다.
+
+* T6 ~ T7: 트랜잭션 B는 10,000원을 기준으로 3,000원 결제를 처리한 후, `UPDATE ... WHERE balance = 10000` 쿼리를 실행한다. 하지만 T4 시점에 A가 커밋한 DB의 실제 잔액은 5,000원이므로 `WHERE` 조건이 불일치하여 **최종 업데이트는 실패**한다.
+
+이처럼 `REPEATABLE READ`는 **'트랜잭션 내의 일관성'** 을 위해 **'데이터 정합성'** 을 일부 희생하는 전략을 사용한다. 이 특징을 이해해야 동시성 이슈가 발생했을 때 정확한 원인을 파악하고 `READ COMMITTED`와 같은 다른 격리 수준을 대안으로 고려할 수 있다.
+
+### SERIALIZABLE
+
+* 말 그대로 트랜잭션을 순차적으로 진행시키는 것을 말한다.(직렬화)
+
+ 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
+
+ 이 수준은 **매우 엄격한 수준**으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 **기다려야** 한다.
+
+ 그렇기 때문에 **교착 상태**가 일어날 확률도 많고 **가장 성능이 떨어지는** 격리수준이다.
+
+> 교착 상태(Dead Lock)란 두 트랜잭션이 각각 Lock을 설정한 다음 **서로의 Lock에 접근**하여 값을 얻어오려고 할 때 이미 각각의 **트랜잭션**에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 **무한정 기다려야 하는 상태**를 말한다.
+
+* 발생할 수 있는 문제 X
+
+### 어떤 격리 수준을 선택해야 할까?
+
+지금까지의 내용을 보면 `REPEATABLE READ`의 스냅샷 동작 방식이 문제를 일으켰으니, 무조건 `READ COMMITTED`를 써야 할 것처럼 보일 수 있다. **하지만 항상 그런 것은 아니다.**
+
+**`REPEATABLE READ`가 유리한 경우도 있다.**
+예를 들어, 사용자가 쇼핑몰에서 1,000원짜리 상품을 보고 결제를 진행한다고 상상해 보자. 만약 격리 수준이 `READ COMMITTED`라면, 사용자가 결제하는 그 짧은 순간에 운영자가 상품 가격을 1,500원으로 변경하고 커밋할 수 있다. 이 경우 사용자는 1,000원을 예상했지만 실제로는 1,500원이 결제되는 혼란스러운 상황을 겪게 된다.
+
+반면, `REPEATABLE READ` 환경에서는 사용자의 결제 트랜잭션이 시작될 때 상품 가격(1,000원)이 스냅샷으로 저장된다. 중간에 가격이 1,500원으로 변경되더라도 사용자의 트랜잭션 내에서는 일관되게 1,000원으로 처리되어 예측 가능한 경험을 제공한다.
+
+결국 정답은 없다.
+격리 수준의 선택은 '데이터의 정합성'과 **'트랜잭션 내의 일관성(논리적 정합성)'** 사이의 트레이드오프이다.
+
+- `READ COMMITTED`: 다른 트랜잭션의 변경 사항을 빠르게 반영해야 하는 금융 정보 조회 등 **데이터 정합성(최신 데이터 반영)**이 중요할 때 유리하다. (ex: 계좌 잔액)
+- `REPEATABLE READ`: 하나의 비즈니스 로직이 진행되는 동안 데이터의 일관성을 유지하는 것이 더 중요할 때 유리하다. (ex: 결제 시점의 상품 가격, 재고 수량 등)
+
+따라서 개발자는 RDBMS(Oracle, MySQL 등)별 기본 격리 수준을 인지하고, 서비스의 비즈니스 정책과 요구사항을 면밀히 분석하여 각 트랜잭션에 가장 적합한 격리 수준을 적용해야 한다.
+
+## 예상 질문
+
+* 트랜잭션 격리 수준이 필요한 이유는 무엇일까요?
+
+* 트랜잭션 격리 수준에 대해 설명해 주세요.
+
+* 트랜잭션 격리 수준에 따라 발생하는 현상에 대해 설명해 주세요.
+
+## Reference
+
+* 면접을 위한 CS 전공지식 노트
+
+* [[DB] 트랜잭션과 격리성](https://sabarada.tistory.com/117)
+
+* [트랜잭션 고립화 레벨](https://goodgid.github.io/Transaction-Isolation-Level/)
+
+* [트랜잭션 격리 수준](https://gyoogle.dev/blog/computer-science/data-base/Transaction%20Isolation%20Level.html)
+
+* [트랜잭션 - Isolation level(격리 수준)과 이상 현상](https://github.com/devfancy/2023-CS-Study/blob/main/DB/db_transaction_isolation_level.md)
+
+* [[네이버페이] 실무에서 만나는 DB isolation level](https://medium.com/naverfinancial/%EC%8B%A4%EB%AC%B4%EC%97%90%EC%84%9C-%EB%A7%8C%EB%82%98%EB%8A%94-db-isolation-level-e94a904bbf9d)
diff --git a/src/content/posts/DB-Transaction.md b/src/content/posts/DB-Transaction.md
new file mode 100644
index 00000000..2313a856
--- /dev/null
+++ b/src/content/posts/DB-Transaction.md
@@ -0,0 +1,121 @@
+---
+title: "[데이터베이스개론] 트랜잭션"
+date: 2023-02-20
+categories: ["CS"]
+tags: ["데이터베이스"]
+---
+
+> 이 글은 컴퓨터학부 수업인 `데이터베이스` 와 `데이터베이스 개론`을 공부하고 정리한 내용입니다.
+
+## 트랜잭션
+
+데이터베이스는 다수의 사용자가 동시에 사용하더라도 항상 **모순이 없는 정확한 데이터**를 유지해야 한다.
+
+데이터베이스 관리 시스템은 데이터베이스가 항상 정확하고 일관된 상태를 유지할 수 있도록 다양한 기능을 제공하는데, 그 중심에는 `트랜잭션`이 있다.
+
+`트랜잭션`은 작업 하나를 수행하는 데 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이스에서 **논리적인 작업의 단위**가 된다. 그리고 데이터베이스에 장애가 발생했을 때 **데이터를 복구하는 작업의 단위**도 된다.
+
+예를 들어, 인터넷뱅킹을 통해 계좌이체 작업을 완벽하게 수행하기 위해 2개의 데이터베이스 연산을 처리해야 한다면, 계좌이체 트랜잭션은 2개의 연산으로 구성할 수 있다.
+
+이체하기 전의 팬시의 잔액은 20,000원이고 케빈의 잔액은 0원인 경우을 다음과 같이 정리했다.
+
+[**이체하기 전**의 DB 상태]
+
+```text
+팬시 잔액 : 20,000원
+케빈 잔액 : 0원
+```
+
+이때 팬시가 브루스에게 10,000원을 이체한 경우 계좌이체 트랜잭션은 다음과 같이 2개의 연산으로 구성할 수 있다.
+
+(팬시의 계좌번호는 100, 케빈의 계좌번호는 200으로 가정한다)
+
+[1] 팬시 계좌에서 10,000원 인출
+
+```sql
+UPDATE 계좌
+SET 잔액 = 잔액 - 10,000
+WHERE 계좌번호 = 100;
+```
+
+[2] 케빈 계좌에 10,000원 입금
+
+```sql
+UPDATE 계좌
+SET 잔액 = 잔액 + 10,000
+WHERE 계좌번호 = 200;
+```
+
+[**이체한 이후**의 DB 상태]
+
+```text
+팬시 잔액 : 10,000원
+케빈 잔액 : 10,000원
+```
+
+여기서 중요한 점은 2개의 UPDATE 문이 **모두 완전하게 처리되어야 트랜잭션이 성공적으로 수행**한다는 것이다. 만약 둘 중 하나라도 처리 과정에서 오류가 발생한다면, 모든 명령문의 실행을 취소하고 트랜잭션 작업 전의 데이터베이스 상태로 되돌아가야 한다.
+
+트랜잭션은 데이터베이스에 장애가 발생했을 때 복구 작업을 수행하거나, 다수의 사용자가 동시에 사용할 수 있도록 제어 작업을 하는데 중요한 단위로 사용된다.
+
+그러므로 데이터베이스의 **무결성**과 **일관성**을 보장하려면 작업을 수행하는 데 필요한 연산들을 하나의 트랜잭션으로 제대로 정의하고 관리해야 한다.
+
+## 트랜잭션 특성
+
+트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성이 보장되려면 네 가지 특성을 모두 만족해야 한다. 트랜잭션의 네 가지 특성을 각 특성에 해당하는 영어 단어 첫 자를 따로 **ACID** 특성이라고 한다.
+
+> [1] `원자성`(Atomicity) : 트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 **All-Or-Nothing** 방식을 의미한다.
+
+만약 트랜잭션을 수행하다가 장애가 발생하여 작업을 완료하지 못했다면, 지금까지 실행한 연산 처리를 모두 취소하고 데이터베이스를 트랜잭션 작업 전의 상태로 되돌려 트랜잭션의 원자성을 보장해야 한다.
+
+그러므로 트랜잭션의 원자성을 보장하려면 이처럼 장애가 발생했을 때 데이터베이스의 원래 상태로 복구하는 **회복 기능**이 필요하다.
+
+`커밋`(Commit) : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어로 트랜잭션 단위로 수행되며 **변경된 내용이 모두 영구적으로 저장**되는 것을 말한다. "커밋이 수행되었다."라는 것은 "**하나의 트랜잭션이 성공적으로 수행되었다.**"를 말한다.
+
+`롤벡`(Rollback) : 에러나 여러 이슈 때문에 트랜잭션 전으로 돌려야 할 때 사용하는 것을 말한다.
+
+> [2] `일관성`(Consistency) : 트랜잭션이 **성공적으로 수행된 이후**에도 데이터베이스가 **일관된 상태를 유지**해야 함을 의미한다.
+
+> [3] `격리성`(Isolation) : 고립성이라고도 하는데 현재 수행 중인 트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 **다른 트랜잭션들이 접근할 수 없음**을 의미한다.
+
+**각 트랜잭션이 독립적으로 수행**될 수 있도록 다른 트랜잭션의 중간 연산 결과에 서로 접근하지 못하게 한다.
+
+> [4] `지속성`(Durability) : 영속성이라고도 하는데 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영된 **수행 결과는 어떠한 경우에도 손실되지 않고 영구적**이어야 함을 의미한다.
+
+즉, 시스템에 장애가 발생하더라도 트랜잭션 작업 결과는 없어지지 않고 데이터베이스에 그대로 남아 있어야 한다는 의미이다.
+
+그러므로 트랜잭션의 지속성을 보장하려면 시스템에 장애가 발생했을 때 데이터베이스를 원래 상태로 복구하는 **회복 기능**이 필요하다.
+
+원자성과 지속성의 공통점은 장애가 발생했을 때 데이터베이스를 원래 상태로 복구하는 **회복 기능**이 필요하다.
+
+## 트랜잭션의 상태
+
+트랜잭션은 아래의 그림처럼 5가지 상태 중 하나에 속하게 된다.
+
+
+
+1. `활동` 상태(**Active**) : 트랜잭션이 수행되기 시작하여 현재 수행 중인 상태를 말한다.
+
+2. `부분 완료` 상태(**Partially committed**) : 트랜잭션의 마지막 연산이 실행된 직후의 상태를 말한다. 모든 연산의 처리가 끝났지만 트랜잭션이 수행된 최종 결과를 DB에 아직 반영하지 않은 상태이다.
+
+3. `완료` 상태(**Committed**) : 트랜잭션이 성공적으로 완료돼서 `commit` 연산을 실행한 상태를 말한다. 트랜잭션이 수행한 최종 결과를 DB에 반영하고 종료된다.
+
+4. `실패` 상태(**Failed**) : H/W 혹은 S/W의 문제, 트랜잭션의 내부의 오류 등 여러 이유로 인해 장애가 발생하여 트랜잭션의 수행이 중단된 상태를 말한다. 더는 정상적으로 수행할 수 없을 때 실패 상태가 된다.
+
+5. `철회` 상태(**Aborted**) : 트랜잭션을 수행하는 데 실패하여 `rollback` 연산을 실행한 상태를 말한다. 철회 상태가 되면 지금까지 실행한 트랜잭션의 연산을 모두 취소하고 트랜잭션이 수행되기 전의 DB 상태로 되돌리면서 트랜잭션이 종료된다.
+
+---
+
+## 예상 질문
+
+* 트랜잭션이란 무엇인가요?
+
+* 트랜잭션의 특성 4가지에 대해 설명해 주세요.
+
+* 트랜잭션의 상태 5가지에 대해 설명해 주세요.
+
+
+## Reference
+
+* [데이터베이스 개론](https://product.kyobobook.co.kr/detail/S000001743852)
+
+* 컴퓨터학부 데이터베이스 강의자료
\ No newline at end of file
diff --git a/src/content/posts/DDD-Serenade-7th-Review.md b/src/content/posts/DDD-Serenade-7th-Review.md
new file mode 100644
index 00000000..10277167
--- /dev/null
+++ b/src/content/posts/DDD-Serenade-7th-Review.md
@@ -0,0 +1,305 @@
+---
+title: "DDD 세레나데 7기, 5주간의 여정을 돌아보며"
+date: 2025-03-15
+categories: ["서버"]
+tags: ["후기"]
+---
+
+> 이 글은 넥스트스텝의 [DDD 세레나데](https://edu.nextstep.camp/c/GwN2MSqv) 7기 교육을 5주간 참여하며 배운 경험과 느낀 점을 정리한 후기입니다.
+
+## Prologue
+
+> 아래는 DDD 세레나데 7기 교육을 무사히 끝마친 후 받은 수료증입니다.
+
+
+
+DDD 세레나데 7기에 참여하면서 도메인 주도 설계(DDD)의 기본 개념부터 실전 적용까지 다양한 내용을 배울 수 있었습니다.
+
+미션을 수행하며 리뷰어 피드백을 반영하는 과정이 큰 도움이 되었습니다.
+
+1주차에 대한 리뷰는 이미 작성한 글인 [DDD 세레나데 7기 1주차 (feat. 이벤트 스토밍)](https://devfancy.github.io/DDD-Week1-Review-And-EventStorming/) 를 참고하시면 되므로, 이번 글에서는 2주차부터 정리하고자 합니다.
+
+
+---
+
+## 2주차 - 전략적 설계
+
+2주차에서는 DDD의 핵심 개념인 전략적 설계(Strategic Design) 에 대해 배우며, 특히 `유비쿼터스 언어`(Ubiquitous Language)와 `바운디드 컨텍스트`(Bounded Context) 개념을 깊이 있게 다루었습니다.
+
+2주차에 진행한 미션에 대한 결과는 아래와 같습니다.
+
+* [1단계 - 용어 사전 만들기](https://github.com/next-step/ddd-strategic-design/pull/494)
+
+* [2단계 - 모델링하기](https://github.com/next-step/ddd-strategic-design/pull/507)
+
+* [3단계 - 기능 우선 패키지 구성하기](https://github.com/next-step/ddd-strategic-design/pull/509)
+
+이번 미션은 페어 프로그래밍(두 명이 함께 작업하는 방식)으로 진행되었지만, 일정 조율이 어려워 각자 미션을 수행하는 방식으로 합의하여 진행했습니다.
+
+### 용어 사전 만들기
+
+이번 미션을 수행하면서 용어 사전과 모델링을 작성한 경험이 있었지만, 예상보다 더 구체적으로 작성해야 한다는 점이 기억에 남습니다.
+
+특히, 용어 사전은 단순한 리스트가 아니라 한글명, 영문명, 그리고 구체적인 설명이 포함되어야 하며, 개발자뿐만 아니라 비개발자도 이해할 수 있어야 한다는 점이 중요했습니다.
+
+이에 따라 용어 사전을 아래와 같은 방식으로 정리했고, 리뷰어님께 해당 정의가 적절한지 피드백을 요청했습니다. 다행히도 제가 생각했던 방향과 동일하다는 답변을 받을 수 있었습니다.
+
+> `용어 사전` 이란 프로젝트(또는 서비스)에 참여하는 도메인 전문가, 개발자, 그리고 기획자·디자이너·데이터 분석가 등 **다양한 직군 간의 의사소통을 명확하게 하기 위한 도구**라고 생각한다.
+>
+> 아래는 이전에 작성한 `용어 사전` 중 일부를 가져왔습니다.
+
+
+
+### 모델링하기
+
+모델링에 대해서는 처음에는 도메인 내 객체의 속성(상태)을 구성하고, 객체 간의 관계를 표현하는 과정이라고 생각했습니다.
+
+그러나 미션을 진행하면서 다른 참여자들의 PR을 확인해본 결과, 단순히 객체의 속성을 정의하는 것만이 아니라, 속성(상태), 행위(기능), 정책(제약사항)으로 카테고리를 나누어 작성하는 방식이 더 적절하다는 점을 알게 되었습니다.
+
+리뷰어님께서도 모델링은 어떻게 표현하느냐에 따라 다를 수 있으며, 대상에 따라 깊이와 디테일이 달라져야 한다는 피드백을 주셨습니다.
+* 기획자, 상위직책자 분들에게 디테일 보다는 정확한 흐름과 팩트가 필요하다.
+* 협업 부서, 동료 개발자에게는 보다 디테일한 내용이 추가되어야 한다.
+
+이번 2단계에서 작성한 모델링은 협업 부서 및 동료 개발자에게 제공할 목적이었기 때문에, **속성(상태), 행위(기능), 정책(제약사항)으로 구분**하여 더 구체적으로 작성했습니다.
+
+요구사항을 기반으로 모델링을 도출하다 보면 자연스럽게 중복되는 부분이 생깁니다. 하지만 이는 도메인에 대한 이해를 더욱 명확하게 정리하는 과정으로 볼 수 있습니다.
+
+> 아래는 이전에 작성한 `모델링하기` 중 일부를 가져왔습니다.
+
+
+
+### 2주차 복습하기
+
+> 2주차에서 배운 개념(용어)들을 필자의 개인적인 생각과 함께 정리했습니다.
+
+* `도메인`이란 우리가 해결해야할 영역 → 보통은 비즈니스 도메인이라 부릅니다.
+ * 예시. 커머스
+* `하위 도메인`이란 도메인을 세부 도메인으로 나누는 것을 의미합니다.
+ * 예시. 전시, 카탈로그, 상품, 주문, 결제, 정산
+ * 이런 하위 도메인은 **자연스럽게 도출**되는 개념이다. → 그만큼 하위 도메인은 제어할 수 없는 대상이 될 수 있습니다.
+ * 특정 하위 도메인의 **비즈니스 가치가 크다면**, 추가적으로 더 세부적인 하위 도메인을 정의할 수 있습니다.
+
+* `하위 도메인`과 `바운디드 컨텍스트`의 차이점은 무엇인가요?
+ * 하위 도메인은 자연스럽게 나뉘며, 바운디드 컨텍스트는 인위적으로 나뉩니다.(->의도적으로 구분하는 경계)
+ * 하위 도메인은 **관심사**이며, 바운디드 컨텍스트는 **그 관심사를 구분짓는 경계**로 간주됩니다.
+
+* 언제 `바운디드 컨텍스트`를 분할해야 하나요?
+ * 서비스가 커짐에 따라 복잡성이 높아질 때입니다.
+ * 또는 모두가 동일하게 이해하고 개발하기 편하도록 경계가 필요할 때입니다.
+
+* 요구 사항과 `도메인 모델링`의 차이점은 무엇인가요?
+ * 요구사항과 모델링은 만드는 사람(=주체)에 따라 달라진다고 생각됩니다.
+ * 요구사항은 클라이언트가 우리에게 문제를 해결해달라는 의미이고,
+ * 도메인 모델링은 그러한 문제를 해결하기 위한 아이디에이션(=아이디어 도출)입니다.
+ * 이러한 접근 방법을 표현하기 위하여 다이어그램, 글, 그림 등 다양한 도구를 활용합니다.
+
+* `도메인 엔티티`와 영속성 엔티티의 차이점은 무엇인가요?
+ * 도메인 엔티티는 식별자를 갖는 무언가입니다. -> 비즈니스적으로 중요한 개념
+ * 영속성 엔티티는 테이블 관점에서 도출됩니다. -> 데이터베이스 저장을 위해 도출된 개념
+ * 이 두 개(Persistence, 도메인 주도 설계)는 높은 확률로 동일할 수도 있고, 다를 수도 있습니다.
+
+* 어떤 엔티티가 애그리거트에서 루트 엔티티가 될 수 있나요?
+ * **외부에 노출되어 있는지 여부**에 따라 결정됩니다.
+ * 즉, 외부에 노출되어도 되는 엔티티인 경우 루트 엔티티가 될 수 있습니다.
+
+* 애그리거트와 리포지토리는 어떤 관련이 있나요?
+ * 애그리거트는 관련 객체들을 하나로 묶은 군집을 의미합니다.
+ * 이는 특정 객체의 타입이 아니라, 관련 객체들을 논리적으로 묶는 구조를 의미합니다.
+ * `레포지토리`는 **애그리거트 단위로 도메인 객체를 저장하고 조회하는 기능을 정의**합니다.
+ * 애그리거트(루트) 단위로 존재하며 테이블 단위로 존재하지 않습니다.
+ * JPARepository, CrudRepository 등의 인터페이스를 활용하여 레포지토리를 구현할 수 있습니다.
+ * 다만, 이는 JPA 관점에서의 레포지토리이지, DDD에서의 레포지토리 개념과 동일하지 않을 수도 있습니다.
+
+
+## 3주차 - 전술적 설계
+
+3주차에서는 전술적 설계(Tactical Design) 를 기반으로 기존 코드를 **도메인 중심으로 리팩터링**하는 과정이 진행되었습니다.
+이전 주차가 개념 학습과 문서화 중심이었다면, 이번 주차부터는 본격적으로 실제 코드에 DDD 개념을 적용하는 과정이 핵심이었습니다.
+
+이번 미션에서는 상품, 메뉴, 매장 식사 주문과 관련된 도메인을 리팩터링하며, 도메인 중심으로 설계를 변경하고 비즈니스 로직을 보다 명확하게 분리하는 작업을 수행했습니다.
+
+3주차에 진행한 미션에 대한 결과는 아래와 같습니다.
+
+* [1단계 - 리팩터링(상품)](https://github.com/next-step/ddd-tactical-design/pull/357)
+
+* [2단계-1 - 리팩터링(메뉴)](https://github.com/next-step/ddd-tactical-design/pull/366)
+
+* [2단계-2 - 리팩터링(메뉴)](https://github.com/next-step/ddd-tactical-design/pull/373)
+
+* [3단계 - 리팩터링(매장 식사 주문)](https://github.com/next-step/ddd-tactical-design/pull/376)
+
+이전 2주차까지는 도메인 개념을 정리하고 모델링하는 과정이 중심이었다면,
+3주차부터는 실제 코드에서 도메인 중심으로 설계를 변경하고, 불필요한 의존성을 줄이며, 유지보수하기 좋은 구조로 개선하는 과정을 진행했습니다.
+
+리팩터링을 진행하면서 필자는 무의식적으로 DBA(Database Administrator) 관점에서 문제를 해결하려는 습관이 있다는 점을 깨달았습니다.
+즉, 데이터베이스 모델을 먼저 고민하고, 데이터를 중심으로 구조를 잡으려는 방식이었습니다.
+
+그러나 도메인 주도 설계에서는 이러한 접근 방식보다는 **비즈니스 요구사항을 먼저 고려하고, 도메인 개념을 중심으로 코드 구조를 잡아야 한다는 것**이 더 중요했습니다.
+
+이러한 피드백을 기반으로 리팩터링 방향을 다음과 같이 정리했습니다.
+* 비즈니스 요구사항을 기반으로 도메인 객체를 설계
+* 데이터 중심이 아닌 도메인 중심의 접근 방식 적용
+* 비즈니스 로직은 실행 흐름과 도메인 행위 중심으로 설계
+
+결국, 코드에서 "데이터가 아니라 비즈니스 개념을 중심으로 사고하는 것"이 중요하다는 점을 다시 한번 깨닫게 되었습니다.
+
+> 양방향 의존성 문제 해결
+
+리팩터링 과정에서 가장 고민했던 부분 중 하나는 상품과 메뉴 간의 양방향 의존성 문제였습니다.
+
+기존 코드에서는 `상품`과 `메뉴`가 서로 직접 참조하는 구조를 가지고 있었습니다.
+즉, `상품`이 변경될 경우 `메뉴`도 영향을 받고, 반대로 `메뉴`에서도 `상품`을 직접 조회해야 하는 경우가 많았습니다.
+
+이러한 양방향 의존성은 코드의 복잡성을 높이고, 유지보수를 어렵게 만들 수 있는 문제였습니다.
+
+이 문제를 해결하기 위해 **도메인 이벤트(Domain Event) 패턴**을 적용했습니다.
+* 상품은 본인의 역할만 수행하도록 하고,
+* 메뉴는 상품에서 발생한 이벤트를 수신하여 후속 작업을 수행하도록 변경했습니다.
+
+도메인 이벤트를 적용함으로써 상품과 메뉴 간의 강한 결합도를 줄이고, 각 도메인이 독립적으로 역할을 수행할 수 있도록 분리했습니다.
+
+> DDD는 정답이 아니라, 하나의 방법론일 뿐
+
+이번 리팩터링을 진행하며, DDD가 무조건 정답은 아니라는 점을 다시 한번 깨닫게 되었습니다.
+
+많은 사람들이 DDD를 적용하는 것을 목표로 삼지만, 중요한 것은 "DDD 자체"가 아니라 비즈니스 요구사항을 효과적으로 해결할 수 있는 설계를 만드는 것이라는 점입니다.
+
+"어떤 방법을 사용하든, 유지보수하기 쉬운 코드가 최종 목표"
+
+결국, **비즈니스 상황을 가장 잘 이해하는 사람이 유지보수성을 고려한 최적의 설계를 해야 한다는 점**이 핵심이라고 생각합니다
+
+> "본인이 겪고 있는 현재의 비즈니스 상황에 대해 충분히 잘 알고 있고, 본인의 결정이 유지보수성이 높다고 확신한다면 그 길로 가는 것이 맞다."
+>
+> "만약 확신이 없다면, DDD와 같은 방법론을 활용하는 것도 좋은 접근법이다."
+
+DDD를 적용하는 것은 목적이 아니라 수단이며, 실무에서는 상황에 따라 유연하게 접근하는 것이 중요하다는 점을 다시 한번 느꼈습니다.
+
+## 4주차 - 도메인 주도 아키텍처
+
+4주차에서는 도메인 주도 설계를 실무에서 활용할 수 있도록, DTO, 의존 역전 원칙(DIP), 안티코러션 레이어(Anti-Corruption Layer) 등의 기술적인 내용을 다루었습니다.
+
+이번 주차는 미션 없이 개념을 학습하는 형태로 진행되었습니다.
+
+> 4주차에 배운 점들 중 기억에 남는 부분을 정리해봤습니다.
+
+* 인터페이스는 어느 시점에 생성하는 것이 적절한가?
+ * 반드시 필요한 것은 아니며, 변경 가능성과 통제 가능성을 고려하여 결정해야 한다.
+ * 자주 변경될수록, 통제 불가능할수록 인터페이스를 만드는 것이 유용하다.
+
+* DTO 가 등장하게 된 이유는?
+ * 애플리케이션에서 화면이 없었다면, DTO라는 개념도 존재하지 않았을 것이다.
+ * 즉, DTO는 `외부 요구 사항`에 의해 등장하게 되었다.
+
+* 순수한 도메인 모델(Pure Domain Model)
+ * 클라이언트와 도메인 모델을 분리하여 내부 요구사항과 외부 요구사항을 명확히 구분
+ * 애플리케이션의 내부 요구 사항은 **주로 비즈니스와 관련된 도메인**
+ * 애플리케이션의 외부 요구사항은 클라이언트가 서버 개발자에게 요청하는 부분이거나 클라이언트와 같은 외부에서 발생하는 요구사항을 수용하는 부분이다.
+ * 반드시 DTO를 만드는 것은 실용적이지 않다.
+ * DTO는 보통 애플리케이션 레이어에서 관리하는 것이 가장 적절하다.
+
+* 도메인 주도 설계는 사실 아키텍처가 아니다. => 도메인 주도 설계 != 아키텍처
+ * 최근에 나오고 있는 다양한 도메인 주도 설계는 `클린 아키텍처`라고 설명한다.
+ * 헥사고날 아키텍처 또는 클린 아키텍처가 도메인 주도 설계 구현하는데 있어서 도움을 준다.
+ * 2003년 에릭 에반스 도메인 주도 설계를 레이어드 아키텍처라고 소개한다.
+ * 2008년은 헥사고날 아키텍처라 부르고, 최근에 나오고 있는 책들은 클린 아키텍처라고 한다.
+ * 이러한 아키텍처들은 **도메인을 보호하는데 용이한 아키텍처**라고 말하고 싶었던 것이다.
+ * 꼭 아키텍처가 있어야 도메인 주도 설계를 한다는 것이 아니고, 헥사고날 아키텍처, 클린 아키텍처를 적용해야 하는 것도 아니다.
+ * 이러한 아키텍처들은 도메인 주도 설계에 도움을 줄 뿐, 꼭 이 방법으로 안해도 된다.
+
+
+## 5주차 - 도메인 이벤트와 CQRS
+
+마지막 5주차에서는 도메인 이벤트(Domain Event), 이벤트 소싱(Event Sourcing), CQRS 개념을 학습했습니다.
+강의 진행자인 제이슨님께서 Spring에서 이벤트를 처리하는 방식을 실시간 라이브 코딩을 통해 시연해 주셨습니다.
+
+해당 주차도 이전 4주차와 마찬가지로 실습이 따로 진행되지는 않았지만, 개인적으로 궁금한 주제인 '이벤트기반 아키텍처 구축하기'가 궁금해서 관련 내용을 나중에 따로 찾아보려고 합니다.
+
+> 해당 주차와 관련된 링크를 추가로 첨부했습니다.
+
+* [Transaction Synchronization and Spring Application Events](https://dzone.com/articles/transaction-synchronization-and-spring-application)
+
+* [회원시스템 이벤트기반 아키텍처 구축하기](https://techblog.woowahan.com/7835)
+
+* [회원시스템 이벤트기반 아키텍처 구축하기](https://youtu.be/b65zIH7sDug) (동영상)
+
+* [Exploring CQRS and Event Sourcing](https://www.microsoft.com/en-us/download/details.aspx?id=34774)
+
+* [린 스타트업을 실천하는 생각정리법 : 린 캔버스](https://brunch.co.kr/@sherpa/18)
+
+## Review
+
+> DDD 세레나데 7기를 돌아보며
+
+해당 강의를 진행해주신 제이슨님의 말씀에 따르면 도메인 주도 설계에서 중요하면서도 어려운 개념 세개가 있다고 합니다.
+
+* 바운디드 컨텍스트(Bounded Context)
+* 애그리게이트(Aggregate)
+* 도메인 서비스(Domain Service)
+
+이 세 가지 개념을 제대로 이해하고 실무에 적용할 수 있다면, 이번 강의를 충분히 잘 소화했다고 볼 수 있지 않을까 생각합니다.
+
+
+> 강의를 수강하면서 느낀 점
+
+회사를 다니면서 매주 강의와 미션을 수행하는 것이 생각보다 쉽지 않았습니다.
+특히, 야근이 잦은 환경에서는 시간을 쪼개어 학습해야 하는 상황이 많았고, 필자 역시 그런 과정을 거치며 강의를 수강했습니다.
+
+1~2주차 미션은 상대적으로 부담이 적었고, 체감상 8시간 이내면 수행이 가능했습니다.
+그러나 3주차 이후 미션부터는 최소 8시간 이상 소요될 정도로 기술적인 고민뿐만 아니라, 비즈니스 로직을 어떻게 풀어갈지에 대한 고민이 필요했습니다.
+
+현재까지 전체 미션의 90% 이상을 완료했지만, 마지막 단계인 "매장 식사 주문" 리팩터링 미션은 강의 기간 내에 마무리하지 못했습니다.
+이 부분은 3월 내로 수행하여 늦더라도 제출할 예정입니다.
+(비싼 강의비만큼, 리뷰어님의 피드백을 받아야 아깝지 않다고 생각합니다. 😂)
+
+(추가 - 2025.03.24)
+마지막 단계인 "매장 식사 주문"을 하면서 애그리거트 루트에 대한 개념과 도메인간 의존성 관리에 대해 깊이 고민하면서 미션을 수행하는 과정을 거쳤습니다.
+
+
+> 강의비가 비싼만큼 그만한 가치가 있었을까?
+
+강의비는 약 100만원으로 비싼 편이었습니다.
+하지만 그만큼 얻어가는 것이 많았고, **본인이 얼마나 적극적으로 참여했느냐에 따라 강의의 가치가 달라진다**고 생각합니다.
+
+필자가 생각하는 강의비가 아깝지 않다고 느끼는 기준은 다음과 같습니다.
+
+* 강의에서 나온 개념(용어 및 기술적 이해도)을 최소 80% 이상 이해해야 한다. 만약 그 이하라면 반복해서 듣고, 모르는 부분은 직접 찾아보며 정리해야 한다.
+
+* 매주 미션을 단순히 제출하는 것이 아니라, 리뷰어님의 피드백을 적극적으로 반영하고 개선해야 한다. 특히, 본인이 고민했던 흔적을 남기고, 리뷰어와 소통하는 과정에서 더 깊은 학습이 이루어진다.
+
+* 강의 외에도 강사가 추천하는 영상, 블로그를 최소한 한 번씩은 읽고 학습해야 한다. 단순히 읽는 것에서 끝나는 것이 아니라, 해당 내용을 미션에 적용하면서 본인의 것으로 만들어야 한다.
+
+
+> 마무리하며
+
+이번 DDD 세레나데 7기 강의를 통해 단순히 도메인 주도 설계의 개념을 학습하는 것이 아니라, 실제 비즈니스 로직을 설계하고 리팩터링하는 경험을 할 수 있었습니다.
+
+특히, **비즈니스 요구사항을 코드로 어떻게 풀어낼지, 어떻게 유지보수하기 좋은 설계를 할지 고민하는 과정**이 인상 깊었습니다.
+
+강의 기간 동안 배운 내용을 앞으로도 실무에서 꾸준히 적용해보고, 부족한 부분은 보완해 나가야겠다고 다짐하게 되었습니다.
+
+DDD는 단순히 이론으로 끝나는 것이 아니라, 실무에서 적용해가며 계속 다듬어야 하는 과정이라는 점을 다시 한번 느낀 강의였습니다.
+
+
+> DDD를 실무에 적용하는 방식에 대한 고민
+
+DDD 개념을 실무에서 어떻게 자연스럽게 녹여낼 수 있을지에 대한 고민도 생겼습니다.
+단순히 "DDD를 도입해보자!" 라고 하는 것이 아니라,
+* "우리 용어 사전과 모델링을 작성해볼까요?"
+* "도메인이 파편화되어 있으니, 이번에 이벤트 스토밍을 적용해볼까요?"
+
+이처럼 DDD 개념을 구체적인 작업으로 제안하는 방식이 더 효과적이라는 생각이 들었습니다.
+특히, DDD에 익숙하지 않은 팀원들도 자연스럽게 접근하고 이해할 수 있도록 적절히 활용하는 것이 중요하다고 느꼈습니다.
+
+
+> 리뷰어로 참여할 기회가 온다면?
+
+다음 `DDD 세레나데 8기`가 열리고, 만약 리뷰어로 참여할 기회가 생긴다면,
+참여자의 입장이 아닌 **리뷰어의 시각**에서 배우는 점도 많을 것이라고 생각합니다.
+
+강의를 듣고 미션을 수행하는 과정도 의미 있었지만, **다른 사람의 코드와 설계를 리뷰하고 피드백하는 과정에서도 깊은 인사이트를 얻을 수 있을 것** 같습니다.
+리뷰어로 참여하게 된다면, 실제 적용 사례를 다양한 시각에서 분석하며 더 깊이 있는 사고를 할 수 있는 기회가 될 것 같아 기대됩니다.
+
+
+## Reference
+
+* [[넥스트스텝] DDD 세레나데 7기](https://edu.nextstep.camp/c/GwN2MSqv)
diff --git a/src/content/posts/DDD-Start-Review.md b/src/content/posts/DDD-Start-Review.md
new file mode 100644
index 00000000..7bea0970
--- /dev/null
+++ b/src/content/posts/DDD-Start-Review.md
@@ -0,0 +1,95 @@
+---
+title: "'도메인 주도 개발 시작하기' 책 후기"
+date: 2025-10-10
+categories: ["에세이"]
+tags: ["책"]
+---
+
+> 이 글은 [도메인 주도 개발 시작하기](https://product.kyobobook.co.kr/detail/S000001810495) 책을 읽고 느낀 필자의 주관적인 생각입니다.
+
+## Prologue
+
+올해 1월 넥스트스텝에서 주관한 [DDD 세레나데 7기](https://edu.nextstep.camp/c/GwN2MSqv) 강의를 들으면서 관련 후기 및 내용을 정리한 적이 있다.
+
+> '도메인 주도 개발 시작하기' 책 읽고 정리한 내용 관련 링크: [Github](https://github.com/devFancy/WIL/blob/main/ddd/도메인_주도_개발_시작하기.md)
+
+> 관련 포스팅
+
+* [DDD 세레나데 7기, 5주간의 여정을 돌아보며](https://devfancy.github.io/DDD-Serenade-7th-Review/)
+
+* [DDD 세레나데 7기 1주차 (feat. 이벤트 스토밍)](https://devfancy.github.io/DDD-Week1-Review-And-EventStorming/)
+
+해당 강의를 들으며 DDD 관련 책을 읽어야겠다고 다짐했지만, 이런저런 일에 밀려 미루다 9월이 되어서야 드디어 이 책을 펼치게 되었다.
+
+강의가 실무 기반의 내용 위주였다면, 이 책은 DDD의 핵심 개념을 다루는 이론적인 내용에 더 가까웠다.
+
+
+---
+
+## Review
+
+
+
+* 전반적으로 이해도는 90%, 만족도는 75% 정도였다.
+
+* 결론부터 말하자면, 이 책은 도메인 주도 설계의 핵심 개념을 배우기에 좋은 것 같다.
+
+ 무엇보다 저자인 최범균님이 개발 경험이 많지 않은 주니어 개발자도 이해하기 쉽게 개념을 풀어 설명해주신 점이 좋았다.
+
+ 하지만 역시나, 이런 개념들은 직접 실무에 적용해봐야만 더 명확하고 깊게 이해할 수 있을 거란 생각이 들었다.
+
+ 단순히 책을 읽는 것만으로 개념을 온전히 '내 것'으로 만들기는 어려워 보였다.
+
+
+* 나 역시 'DDD 세레나데' 강의를 통해 DDD가 무엇인지 맛보기는 했지만, 음식으로 비유하자면 메인 디쉬가 나오기 전의 애피타이저만 맛본 느낌이었다.
+
+ 도메인과 비즈니스가 복잡한 큰 조직에서 DDD를 적용하는 것은 어떤 느낌일지 아직은 막연하게 느껴진다.
+
+ 다행히 나는 강의에서 실무와 유사한 간단한 프로젝트를 경험해봤기에, 책에서 설명하는 개념들이 어떤 맥락에서 필요한지 이해할 수 있었다.
+
+ 만약 강의 경험 없이 이 책만 읽었다면, 이해도는 90%가 아닌 60% 이하로 뚝 떨어지지 않았을까 싶다.
+
+* 그리고 이 책은 Java, Spring Boot, JPA 기술을 사용하는 개발자라면 이해가 더 수월할 것 같다.
+
+ 예시 코드가 대부분 해당 기술로 되어있기도 했고, 4장과 5장의 경우 JPA에 기반한 내용이었다.
+
+
+* 이 책에서 중요하다고 생각했던 장은 3장, 7장, 9장인 것 같다.
+
+ **애그리거트, 도메인 서비스, 바운디드 컨텍스트**가 도메인 주도 설계의 핵심 개념이라고 생각하기 때문이다.
+
+ 1장과 2장은 도메인 주도 설계가 무엇인지에 대한 기초 개념의 느낌이었고,
+
+ 3장부터가 본격적인 내용인 느낌이다.
+
+
+* 한 가지 아쉬웠던 점은 내용이 **기술적인 부분**에 치우쳐 있다는 것이었다.
+
+ DDD에는 크게 '전략적 설계'와 '전술적 설계'가 있는데, 이 책은 코드 레벨의 '전술적 설계'에 더 무게를 두고 있다.
+
+ 강의에서는 DDD가 단순히 개발자를 위한 기술이 아니라, 기획자나 도메인 전문가 등 다양한 직군이 함께 소통하며 만들어가는 '전략적 설계'의 중요성을 강조했다.
+
+ 하지만 이 책은 기술적인 내용이 주를 이루다 보니, 협업의 관점을 강조했던 강의와는 다른 결로 느껴졌다. 아마 이 지점에서 아쉬움이 남았던 것 같다.
+
+ 만약 내가 이 책으로만 DDD를 처음 접했다면, DDD를 그저 '전술적 설계' 기법 중 하나로 오해했을지도 모르겠다.
+
+ DDD를 단순히 기술적인 내용으로만 이해하지 않았으면 좋겠다는 생각이 들었다.
+
+
+* 이번에 다시 한번 느낀 점은, 어떤 기술이든 책 한 권만으로는 온전히 이해하기 어렵다는 것이다.
+
+ 최소 두세 권은 읽어봐야 그 기술이 말하고자 하는 바를 다각도로 파악하고 시야를 넓힐 수 있는 것 같다.
+
+
+* 누군가 이 책을 읽을지 말지 고민한다면
+
+ '도메인 주도 설계'라는 개념에 관심이 있거나, **복잡한 도메인을 어떻게 코드로 풀어낼지 고민하는 개발자**에게 이 책을 추천하고 싶다.
+
+ 물론 이 책 한 권이 모든 고민을 해결해주진 않는다.
+
+ 중요한 것은 책에 나오는 바운디드 컨텍스트, 도메인 서비스, 애그리거트 같은 개념들을 실무나 개인 프로젝트에 직접 적용해보며 자신만의 경험을 쌓고 장단점을 체득하는 과정일 것이다.
+
+
+## Reference
+
+* [도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지](https://product.kyobobook.co.kr/detail/S000001810495)
diff --git a/src/content/posts/DDD-Week1-Review-And-EventStorming.md b/src/content/posts/DDD-Week1-Review-And-EventStorming.md
new file mode 100644
index 00000000..12e9cc51
--- /dev/null
+++ b/src/content/posts/DDD-Week1-Review-And-EventStorming.md
@@ -0,0 +1,319 @@
+---
+title: "DDD 세레나데 7기 1주차 (feat. 이벤트 스토밍)"
+date: 2025-02-02
+categories: ["서버"]
+tags: ["후기"]
+---
+
+> 이번 글은 [DDD 세레나데 7기](https://edu.nextstep.camp/c/GwN2MSqv)의 1주차에 대한 필자의 자극히 개인적인 후기입니다. 혹시 문제가 되는 부분이 있다면, 언제든 말씀해 주시면 감사하겠습니다. ☺️
+
+## Prologue
+
+2023년, 2024년에 상반기까지는 `코드` 에 집중해서 그런지, 2024년 하반기부터는 `코드` 보다는 `설계` 쪽에 관심이 생겼다.
+
+그래서 '설계를 어떻게 하면 잘할 수 있을까?'에 대해 스스로 고민을 하면서 처음에는 `멀티 모듈`에 대해 먼저 공부를 하게 되었다.
+
+`멀티 모듈`과 관련된 영상을 보면서 현업 개발자분들이 왜 사용하고 어떤 이점이 있는지를 알게 되면서 이와 관련된 글을 블로그에 작성한 바 있다.
+
+(멀티 모듈과 관련해서 이전에 작성한 글 - [Kotlin, SpringBoot 기반으로 멀티 모듈 설계와 적용하기](https://devfancy.github.io/SpringBoot-Multi-Module/))
+
+> 멀티 모듈에 대해 도움이 되었던 대표적인 영상과 자료는 아래와 같습니다. 이 외에도 다양한 영상과 자료를 참고했으나 이 글에서는 중요한 부분이 아니므로 생략했습니다.
+
+* [[우아한 기술블로그] 멀티모듈 설계 이야기 with Spring, Gradle](https://techblog.woowahan.com/2637/)
+
+* [[Github] spring-boot-kotlin-template](https://github.com/team-dodn/spring-boot-kotlin-template)
+
+* [[Youtube] SpringBoot + Kotlin 멀티 모듈 구성 - 단일모듈에서 멀티모듈로 변경해보기 #1](https://www.youtube.com/watch?v=PdofVTuM-tE&list=PL8RgHPKtjlBh-LU_yUxFfIq_flizPm_vZ&ab_channel=제미니의개발실무)
+
+* [[Youtube] 실전! 멀티 모듈 프로젝트 구조와 설계 - 인프콘 2022](https://www.youtube.com/watch?v=ipDzLJK-7Kc&ab_channel=인프런inflearn)
+
+멀티 모듈에 대해 이론적으로나마 어떤 내용인지는 이제 알게 되었다. 그런 다음에 'IT 회사는 현재 시점으로 지난 3년간 어떤 설계에 관심을 가지고 있을까?'에 대한 궁금증이 생겼다.
+
+그 결과 흔히 알고 있는 여러 IT 회사에서 `도메인 주도 설계`(Domain Driven Design)을 현업에서 사용하는 것을 찾게 되었다. (이후 아래부터는 도메인 주도 설계를 `DDD`라는 단어로 표현하겠다)
+
+> DDD 관련 영상과 자료들은 아래와 같습니다. (`최신순` 으로 내림차순 정렬)
+>
+> 이 외에도 다양한 영상과 자료가 있습니다.
+
+* [[올리브영 테크 블로그] 10년 된 레거시를 현대화하다 - Part.2: 매장 도메인의 구현 여정](https://oliveyoung.tech/2025-01-24/store-service-journey-2/)
+
+* [[올리브영 테크 블로그] 10년 된 레거시를 현대화하다 - Part.1: 도메인 분리의 첫걸음](https://oliveyoung.tech/2025-01-24/store-service-journey-1/)
+
+* [[우아콘 2024 영상] DDD 그거 그렇게 하는 거 아닌데](https://www.youtube.com/watch?v=sLG5n_pXWK0&ab_channel=우아한테크)
+
+* [[컬리 테크 블로그] DDD와 MSA 기반으로 좋은 서비스 개발하기](https://helloworld.kurly.com/blog/ddd-msa-service-development/)
+
+* [[kakao tech] 추천팀의 DDD 도입기](https://tech.kakao.com/posts/555)
+
+* [[YouTube] ㄷㄷㄷ: Domain Driven Design과 적용 사례공유 / if(kakao)2022](https://www.youtube.com/watch?v=4QHvTeeTsj0&ab_channel=kakaotech)
+
+
+---
+
+## DDD 세레나데 7기 신청
+
+이전에 `DDD` 라는 단어를 많이 들어봤지만 이론/실무적으로 사용해 본적이 없어서 한번 경험해보고 싶다는 생각이 들었다.
+
+그런데 정말 우연하게도 `DDD` 관련 강의가 넥스트스텝에서 존재한다는 걸 지인을 통해 알게되었고, 해당 강의가 나왔을 때 신청하게 되었다.
+
+알고보니, 이전에 필자 봤던 우아콘 2023, 2024 영상에서 나온 재성님이 해당 강의를 진행해서 그런지 더 신뢰가 갔다.
+
+(해당 강의비가 99만원이라는 사실을 알고 난 뒤, 고민을 많이 했지만 미래의 '나' 자신에게 투자한다는 생각으로 결제를 하게 되었다. 내돈내산 🥲)
+
+어느 강의보다 비쌌기 때문에, 무조건 열심히 들어야 겠다는 다짐을 하게 되었고 해당 강의가 끝난 이후에도 'DDD 세레나데 7기 강의'에 대한 후기글을 남기려고 한다.
+
+이번 글은 1주차에 있었던 부분들에 대해 간단히 배웠던 점을 정리하고자 한다.
+
+
+## 1주차
+
+1주차 때는 해당 강의에 대한 과정을 어떻게 진행하는지, 그리고 강의를 듣는 수강생이 어떻게 임해야 하는지에 대해 강의를 진행하는 재성님이 이해하기 쉽게 자세히 알려주셨다.
+
+또한, DDD 관련 기술적 지식을 알려주기도 하지만 참여자가 해당 강의를 듣고 실무에 적용하도록 하기 위해 주차별로 미션이 주어진다는 점이다.
+
+해당 미션에 대한 진행 방법과 미션을 진행하는 과정 속에 `온라인 코드 리뷰`가 있고, `리뷰어` 분들은 대부분 해당 강의를 이전에 수강했던 분들이셨다.
+
+뿐만 아니라, 해당 강의에 도움이 되는 영상과 자료들도 되게 감사했다. 해당 강의를 꼼꼼히 준비하신 게 들을 수록 느껴졌다.
+
+(해당 강의가 끝나고 이후 미션들에 대해 완료한 결과, 아래 PR에 정리했다.)
+
+* [[PR] 1단계 - 문자열 덧셈 계산기](https://github.com/next-step/ddd-legacy/pull/764)
+
+* [[PR] 2단계 - 요구사항 정리](https://github.com/next-step/ddd-legacy/pull/790)
+
+* [[PR] 3단계 - 테스트를 통한 코드 보호](https://github.com/next-step/ddd-legacy/pull/835)
+
+
+### 0단계: JUnit 5 학습
+
+해당 강의에 대한 과정을 전반적으로 알려준 뒤, 마지막 시간에는 `Junit 5`에 대해 재성님이 직접 Java 언어로 어떻게 작성하는지 알려주었고 해당 코드 부분을 따라가면서 학습했다.
+
+해당 부분에 대한 깃허브 PR은 아래와 같다.
+
+* [Step0: 0단계 JUnit5 학습 및 관련 테스트코드 작성](https://github.com/next-step/ddd-legacy/pull/725)
+
+아래부터는 필자가 단계별로 미션을 진행했던 후기이다.
+
+
+### 1단계: 문자열 덧셈 계산기
+
+1단계는 "문자열 덧셈 계산기"로 해당 주제에 맞게 코드를 작성하고 PR를 보내서 리뷰어분으로부터 코드 리뷰를 받게 된다. (해당 리뷰어의 PR 승인을 받게되면 미션을 완료했다는 결과이다)
+
+* 1단계에 대한 미션 요구 사항은 [1단계 요구사항](https://github.com/devFancy/ddd-legacy/blob/devfancy/docs/1단계_요구사항.md) 에서 확인할 수 있다.
+
+1주차이고 해당 주제가 간단해서 그런지, 초반에는 세세한 부분 보다는 구현에 집중해서 PR를 제출했다. 하지만 리뷰어분의 피드백은 내 생각과 달랐다.
+
+아무리 쉬운 미션이라도 꼼꼼하게 작성하는 걸 원하셨고, 강의를 진행하시는 재성님 역시 '매주 전달받은 미션을 진지하고 꼼꼼하게 진행해주셨으면 한다'와 비슷한 메시지를 전달 받은 후에는 제대로 임하게 되었다.
+
+그래서 리뷰어분의 피드백이 논리적으로 맞다면 받아들이고, 해당 코드(or 문서) 부분을 수정하고 다시 리뷰를 보낸다. 그리고 다시 리뷰를 받으면서 리뷰어분이 만족할 때 까지 이 과정을 반복했다.
+
+이 과정에서 단일 책임 원칙, 배열 대신 컬렉션 활용, 일급 컬렉션, Java 16 이후의 새로운 기능들에 대해 알게 되었다.
+
+그 결과, 해당 1단계 미션을 성공적으로 끝냈다.
+
+
+### 2단계: 요구 사항 정리
+
+2단계는 해당 강의에서 수행하는 최종 미션 주제인 `키친 포스`에 대해 요구 사항을 작성하는 미션이다.
+
+* 2단계에 대한 미션 요구 사항은 [2단계 요구사항](https://github.com/devFancy/ddd-legacy/blob/devfancy/docs/2단계_요구사항.md) 에서 확인할 수 있다.
+
+이번 2단계 미션에서 필자가 고민했던 부분은 '요구 사항을 어떻게 정리해야 하면 좋을까?' 였다.
+
+초반에는 비즈니스 로직 순서대로 작성해보았지만, 필자가 아닌 제 3자가 보기에 이해하는 부분과 깔끔하게 정돈되지 못한다고 판단했다.
+
+그래서 `도메인별 API` 기준으로 재구성해서 요구 사항을 작성했고, 이 부분에 대해 PR를 작성하면서 리뷰어분의 의견을 듣고 싶어서 해당 내용을 작성했다.
+
+리뷰어님의 의견을 간단하게 정리하면 아래와 같다.
+
+* **개발 실무진들 간 도메인 지식을 공유하는 목적**이라면 `도메인별 API` 기준으로 요구 사항을 작성한다. 도메인 단위로 요구 사항을 명확하고 체계적으로 표현할 수 있기 때문이다.
+
+* 그게 아니라 **다른 직무(기획자나, 디자이너 또는 상위 직책자)를 위한 문서**라면 `유저 시나리오`를 기준으로 요구 사항을 작성한다. 유저의 액션과 그에 따른 흐름을 한 눈에 파악할 수 있기 때문이다.
+
+해당 리뷰어님의 의견을 듣고, 필자가 생각했던 부분과 거의 일치해서 신기하기도 했고, 해당 의견을 자세히 알려주셔서 정말 감사했다.
+
+이 외에도 다양한 피드백을 PR에 남겨주셨는데, 필자가 생각한 그 이상으로 도움받은게 많아서 정말 감사했다. (해당 리뷰어님이 이후의 단계들도 이어서 피드백 해주시면 좋겠지만, 강의 특성상 단계별 리뷰어분이 랜덤으로 바뀌어서 아쉬웠다 😭)
+
+
+### 3단계: 테스트를 통한 코드 보호
+
+> 추가한 날짜: 2025.03.15(토)
+
+3단계는 해당 강의에서 제공한 [ddd-legacy](https://github.com/devFancy/ddd-legacy/tree/devfancy) 프로덕션 코드와 2단계에서 필자가 작성한 `요구 사항`을 토대로 테스트 코드를 작성하는 미션이다.
+
+* 3단계에 대한 미션 요구 사항은 [3단계 요구사항](https://github.com/devFancy/ddd-legacy/blob/devfancy/docs/3단계_요구사항.md) 에서 확인할 수 있다.
+
+3단계에서는 Fixtures 클래스를 만들어서 활용했고, 매 테스트 실행 후 DB를 정리하기 위해 `tearDown()` 메서드를 적용했다.
+
+그리고 테스트 코드를 이전에 인프런 강의인 'Practical Testing' 에서 학습했는데, 해당 강의에서 배운 내용을 기반으로 적용하고자 했다.
+
+> 아래는 해당 강의에서 배운 내용을 개인 블로그에 정리한 글이다.
+
+* [Practical Testing: 테스트 코드 작성 방법](https://devfancy.github.io/Practical-Testing/)
+
+* [Practical Testing: 테스트 코드 작성 방법 - Mock, 더 나은 테스트를 위한 구체적 조언](https://devfancy.github.io/Practical-Testing2/)
+
+미션을 수행하는 도중에 궁금한 점들을 PR에 작성했고, 리뷰어님의 의견을 듣고자 했다. (리뷰어님이 나의 궁금한 점들을 최대한 구체적 + 경험에 비추어 답변해주셔서 정말 감사했다)
+
+리뷰어님의 피드백과 해당 강의에서 배운 결과, 테스트 컨테이너와 DB를 정리하는 `tearDown()` 메서드를 사용하는 것 보다 **테스트 시간이 짧은 인메모리로 `Mocking` 하고 `Fake` 객체를 사용하는 방법**을 택했다.
+
+테스트 컨테이너를 사용하면 매번 DB를 생성/종료하거나 데이터를 정리해야 하므로 실행 시간이 상대적으로 길어진다.
+반면 Mock/Fake는 DB 의존성이 없기 때문에 테스트가 가볍고 빠르며, 변경 사항을 자주 적용해야 하는 TDD 상황이나 대량의 테스트 케이스를 돌릴 때 빠른 피드백을 얻기에 훨씬 유리하다고 느꼈다.
+
+* 실제 DB 연결 없이 테스트 구동이 빨라진다. (네트워크 비용, DB 초기화 시간 소모 X)
+
+* 개발 환경에서 쉽게 세팅 가능하다.
+
+단, 단순한 비즈니스 로직이 아닐 경우에는 주의할 점도 있다.
+
+* 실제 DB와 달리, 인메모리에서 발생하지 않는 문제(복잡한 쿼리 최적화, 락 문제 등)가 숨겨질 수 있다.
+
+* 즉, "핵심 비즈니스 로직"은 Fake/Mock으로 빠르게 커버하되, "**DB 트랜잭션이나 복잡한 쿼리 로직 테스트**"처럼 프로덕션과 유사한 환경의 시뮬레이션이 필요한 경우에는 Testcontainers 등 실 DB 테스트도 추가로 진행할 수 있다.
+
+결국 테스트코드가 많아질수록 **테스트 실행 시간을 단축해야 하므로 인메모리를 적극 활용**해야 한다는 점을 배웠고,
+**비즈니스에 중요한 부분**을 중심으로 테스트코드를 작성하는 것이 유지보수 관리에 드는 시간과 비용을 절감하는 데 효과적이라는 것을 이번 미션을 통해 다시 한번 깨달았다.
+
+
+### 1주차 복습하기
+
+> 1주차 미션에서 나온 용어들에 대해 한 줄로 정리하면 아래와 같다.
+
+* `도메인` - **소프트웨어로 해결하고자 하는 문제 영역** 입니다.
+
+ * 예를 들어, 예를 들어, 핸드폰을 이용하여 사용자 간에 거래를 할 때 필요한 도메인은 `송금`입니다.
+
+ * 송금 도메인을 제대로 이해하려면, 송금과 관련된 금융, 계좌, 수수료 등의 지식이 필요합니다.
+
+* `모델` - 목적을 위해 현실 세계에 존재하는 것을 **가공하고 편집**하여 우리에게 정보를 제공하는 것입니다.
+ * 예를 들어, 금융 송금 시스템에서는 실제 은행 계좌, 송금 금액, 수수료, 거래 일자 등의 정보를 단순화하여 송금 요청, 송금 내역 등의 모델로 표현할 수 있습니다.
+
+* `도메인 모델` - 도메인의 핵심 개념과 비즈니스 규칙, 행동(메서드)까지 모두 반영한 **목적을 가진 의사소통 수단**입니다. 이는 회의, 기획, 디자인, 개발 등 여러 단계에서 공유되어, 시스템의 핵심 개념을 풍부하게 표현하고 비즈니스 로직을 구현하는 데 사용됩니다.
+ * 예를 들어, 금융 송금 도메인에서는 '송금', '계좌', '거래', '수수료' 등의 개념을 객체와 연관관계로 표현하여, 송금 내역 생성, 수수료 계산, 계좌 잔액 검증 등의 비즈니스 로직을 포함하는 도메인 모델을 구축할 수 있습니다.
+
+* `도메인 주도 설계` - 비즈니스 관점에서 도메인을 중심으로 설계해 나가는 접근 방식입니다. 도메인 모델을 활용하여 복잡한 비즈니스 규칙과 요구사항을 코드에 명확하게 반영하고, 개발팀과 비즈니스 전문가 간의 효과적인 의사소통을 도모합니다.
+
+
+---
+
+
+## 이벤트 스토밍 워크숍
+
+2월 1일 토요일에는 처음 오프라인 모임을 진행하게 되었다.
+
+선릉역에 있는 우아한 테크코스에서 오후 2시부터 6시까지 약 4시간 동안 진행했는데, 여기는 글또 10기 백엔드/인프라 반상회때도 온 적이 있어서 친숙한 공간이기도 했다.
+
+
+
+해당 오프라인 모임을 진행하기 전에 재성님이 슬랙에 해당 주제와 비슷한 영상을 추천해 주셔서 필자는 미리 보고 왔다.
+
+* [[우아콘 2023] 이벤트 스토밍 인 액션: 이벤트 스토밍 소개와 적용 방법](https://www.youtube.com/watch?v=gihxS6eE1DM&ab_channel=우아한테크)
+
+* [KCD 2020 [Track 2] 도메인 지식 탐구를 위한 이벤트 스토밍 Event Storming](https://www.youtube.com/watch?v=hUcpv5fdCIk&ab_channel=OpenUP-오픈업)
+
+
+
+필자는 `이벤트 스토밍`을 위의 영상을 이전에도 봤고 실제로 3번 정도 적용한 경험이 있어서 그런지, 4시간이면 충분히 할 수 있겠다라는 생각이 들었다.
+
+(이번 오프라임에서의 이벤트 스토밍의 목표는 영상에 있던 모든 걸 적용하지 않고, 4시간동안 1-2단계만 진행하는 것으로 했다)
+
+초반에는 `도메인 이벤트` (주황색)으로 최종 미션 주제인 '키친 포스'에 대해 작성했고, 이후에는 시간순으로 정렬하는 부분과 도메인 기준으로 나누면서 정해진 시간안에 끝마칠 수 있어서 뿌듯했다.
+
+이벤트 스토밍을 작성할 때 중간마다 드라이버와 내비게이터를 수시로 바꾸면서 진행하게 되었는데, 이때 두 가지의 역할에 대해 제대로 알게되었다.
+
+> 1단계 - `도메인 이벤트`를 기준으로 생각나는 대로 작성해서 포스트잇 붙이기
+
+(아래는 이벤트 스토밍의 1단계를 적용한 결과이다)
+
+
+
+> 2단계 - 타임라인 적용(왼쪽 -> 오른쪽, 위 -> 아래) + 핫 스폿, 액터, 시스템 적용하기
+
+(아래는 이벤트 스토밍의 2단계를 적용한 결과이다)
+
+
+
+이벤트 스토밍 영상을 만들어주신 재성님을 직접 볼 수 있어서 영광이였고, 해당 오프라인에 참가할 수 있어서 감사했다. 기회가 된다면 회사에 적용하고 싶고 만약 그렇게 된다면, `퍼실리테이터` 역할을 맡고 싶다.
+
+(`퍼실리테이터` 역할 뿐만 아니라 이벤트 스토밍에 관심이 있거나 알고 싶으면 위의 영상을 참고해 주시면 감사하겠습니다)
+
+
+### 이벤트 스토밍에서 배운 점
+
+이전에는 이벤트 스토밍을 주로 기획 초기 단계에서 진행하는 경우가 많았다. 하지만 "[우아콘 2023] 이벤트 스토밍 인 액션" 영상(31분)에서 언급된 것처럼, **일정 수준의 기획이 나온 후에 진행하는 것이 더 효과적**이라는 점을 새롭게 알게 되었다.
+
+오프라인 모임에서도 재성님이 같은 맥락의 말씀을 해주셨다. "기획이 어느 정도 구체화되고, 개발이 일정 부분 진행된 이후에 이벤트 스토밍을 하면 더욱 유용하다"는 것이다. 기획 초기에는 도메인 용어, 유저 시나리오 등이 자주 변경될 가능성이 크기 때문에, 기획이 어느 정도 안정된 후 진행하는 것이 좋다는 점이 인상적이었다.
+
+또 하나 인상 깊었던 점은, 이벤트 스토밍은 **결과를 만들어내는 자리가 아니라, 그 과정을 공유하는 자리**라는 것이다.
+이벤트 스토밍 자체를 최종 문서처럼 관리하기보다는, 워크숍 이후 변경 사항을 추적할 수 있도록 정책과 문서를 체계적으로 정리하는 것이 중요하다고 한다.
+
+예를 들어, GitHub의 [WIKI](https://docs.github.com/ko/communities/documenting-your-project-with-wikis/about-wikis) 같은 공간에 도메인 지식을 기록하면 효과적일 것이다.
+
+또한, 변경할 사항이 많아진다면 최대한 빠르게 이벤트 스토밍을 다시 진행하는 것이 좋다. 한 번 이벤트 스토밍을 경험한 후에는 도메인에 대한 이해가 깊어지기 때문에, 다음 워크숍에서는 더 빠르고 효과적으로 진행할 수 있다.
+
+무엇보다도, 이벤트 스토밍의 궁극적인 목표는 **참여한 모든 구성원이 동일한 도메인 지식을 공유하고, 같은 이해를 가지는 것**이라는 점을 다시금 깨닫게 되었다.
+
+
+### 이벤트 스토밍 워크숍 복습하기
+
+> 이벤트 스토밍 워크숍에서 배웠던 용어들에 대해 한 줄로 정리하면 아래와 같다.
+
+* `이벤트 스토밍 워크숍` 이란?
+ * 프로젝트에 같이 참가한 팀원들이 서로가 공통된 이해를 가지기 위해 도메인 지식을 탐구하는 과정입니다.
+
+* 내가 `퍼실리테이터`라면 어떤 마음가짐을 가져야 할까요?
+ * 참가자들이 자유롭게 아이디어를 내고 논의할 수 있도록 돕고, 개입은 최소화하되 필요할 때 적절한 방향을 제시하는 조력자 역할의 마음가짐을 가진다.
+
+* 내가 `드라이버`라면 무엇을 염두에 두어야 할까요?
+ * 도메인 이벤트를 논리적인 흐름에 맞게 배치하고, 팀원들과의 피드백을 주고받으며 조정합니다.
+
+* 내가 `내비게이터라면` 드라이버를 돕기 위해 어떻게 안내해야 할까요?
+ * 도메인 이벤트의 맥락과 연관성을 고려하여 드라이버가 올바른 결정을 내릴 수 있도록 논리적으로 설명하고 안내해 줍니다.
+
+
+---
+
+
+## Review
+
+이번 글에서는 넥스트스텝의 "DDD 세레나데 7기"를 수강하게 된 배경과 1주차 미션에 대한 후기를 정리했다.
+
+평소 DDD에 관심이 많았고, 그 철학에 공감하는 부분이 많았던 만큼, 미션을 수행하면서 흥미로웠다. 특히, 코드뿐만 아니라 설계와 도메인에 대한 깊은 고민을 할 수 있도록 유도하는 과정이 인상적이었고, 앞으로 남은 미션들도 기대된다.
+
+이번 1주차는 설 연휴와 겹쳐서 미션을 수행할 시간이 많지 않았다. 그럼에도 가족이나 지인과 시간을 보내는 틈틈이 노트북을 열어 미션을 진행했고, 주말에도 카페에서 이어서 작업했던 기억이 남는다.
+(연휴 기간에도 빠르게 피드백을 남겨주신 리뷰어님께도 감사한 마음이다)
+
+또한, 오프라인 모임에서 진행한 이벤트 스토밍을 통해, 단순히 기획 초기 단계에서만 활용하는 것이 아니라, 일정 수준의 기획이 진행된 후에 더욱 효과적이라는 점을 새롭게 배울 수 있었다. 뿐만 아니라, 이벤트 스토밍의 목적이 결과물을 만들어내는 것이 아니라,
+참여자들이 도메인 지식을 공유하고 같은 이해를 가지는 과정 자체에 있다는 점도 깊이 와닿았다.
+
+
+## Reference
+
+> (추가) Domain-Driven Design Europe 2025
+>
+> 아래는 유럽에서 DDD 컨퍼런스 관련 부분이다. 이벤트 스토밍 가격만 `€1,000`, 환율로 계산하면 현재 기준(2025.02.05)으로 약 150만원(총 9.5시간)으로 비싼 워크샵이다.
+
+* [Domain-Driven Design Europe 2025](https://2025.dddeurope.com/)
+
+ * [EventStorming Workshop (By Stijn Vannieuwenhuyse)](https://ddd.academy/event-storming/)
+
+ * [Strategic Domain-Driven Design (By Chris Simon)](https://ddd.academy/strategic-ddd/)
+
+> DDD 관련 참고 자료
+
+* [[올리브영 테크 블로그] 10년 된 레거시를 현대화하다 - Part.2: 매장 도메인의 구현 여정](https://oliveyoung.tech/2025-01-24/store-service-journey-2/)
+
+* [[올리브영 테크 블로그] 10년 된 레거시를 현대화하다 - Part.1: 도메인 분리의 첫걸음](https://oliveyoung.tech/2025-01-24/store-service-journey-1/)
+
+* [[우아콘 2024 영상] DDD 그거 그렇게 하는 거 아닌데](https://www.youtube.com/watch?v=sLG5n_pXWK0&ab_channel=우아한테크)
+
+* [[컬리 테크 블로그] DDD와 MSA 기반으로 좋은 서비스 개발하기](https://helloworld.kurly.com/blog/ddd-msa-service-development/)
+
+* [[kakao tech] 추천팀의 DDD 도입기](https://tech.kakao.com/posts/555)
+
+* [[YouTube] ㄷㄷㄷ: Domain Driven Design과 적용 사례공유 / if(kakao)2022](https://www.youtube.com/watch?v=4QHvTeeTsj0&ab_channel=kakaotech)
+
+> 이벤트 스토밍 관련 참고 자료
+
+* [[우아콘 2023] 이벤트 스토밍 인 액션: 이벤트 스토밍 소개와 적용 방법](https://www.youtube.com/watch?v=gihxS6eE1DM&ab_channel=우아한테크)
+
+* [KCD 2020 [Track 2] 도메인 지식 탐구를 위한 이벤트 스토밍 Event Storming](https://www.youtube.com/watch?v=hUcpv5fdCIk&ab_channel=OpenUP-오픈업)
diff --git a/src/content/posts/DataStructure-DFS-BFS.md b/src/content/posts/DataStructure-DFS-BFS.md
new file mode 100644
index 00000000..da8d8093
--- /dev/null
+++ b/src/content/posts/DataStructure-DFS-BFS.md
@@ -0,0 +1,193 @@
+---
+title: "기본적인 그래프 기법 : DFS, BFS"
+date: 2023-03-23
+categories: ["CS"]
+tags: ["자료구조"]
+use_math: true
+---
+
+## 기본 그래프 작업
+
+* 그래프 순회는 다음과 같은 규칙을 가진다.
+
+ * 주어진 G=(V, E)을 가지고 V(G)의 정점 v는 v에서 도달할 수 있는 모든 정점을 방문할 수 있다.
+
+* 기본적인 그래프 기법은 DFS, BFS가 있다.
+
+* `DFS`는 `Depth First Search`의 약자로 **깊이 우선 탐색**을 말하며, Preorder 트리 순회와 비슷하다. (Preorder : VLR)
+
+ * 그리고 DFS는 스택 또는 재귀를 사용한다.
+
+* `BFS`는 `Breath First Search`의 약자로 **너비 우선 탐색**을 말하며, 층마다 트리를 순회하는 것과 비슷하다.
+
+ * 그리고 BFS는 큐를 사용한다.
+
+
+## DFS
+
+* 루트 노드에서 시작해서 다음 분기로 넘어가기 전에, 해당 분기를 모두 탐색하는 방법이다. 해당 분기를 탐색한 후에는 다시 원점으로 돌아가 다른 분기를 탐색한다.
+
+* 자기 자신을 호출하는 순환 알고리즘으로 **스택** 또는 **재귀**의 형태를 가진다.
+
+* 이 알고리즘을 구현할 때 그래프 탐색의 경우 **어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다**는 것이다. (검사하지 않으면 무한루프에 빠질 수 있다)
+
+* **미로**를 탐색할 때, **해당 분기에서 갈 수 있을 때까지 가다가 더이상 갈 수 없게 되면, 이전 길로 되돌아가면서 다른 방향으로 다시 탐색을 진행하는 방법**과 유사하다.
+
+* BFS보다 더 간단하지만, 검색 속도 자체는 BFS보다 느리다.
+
+* `인접 리스트`일 때 DFS 하나당 각 정점에 연결되어 있는 간선의 개수(e)만큼 탐색을 하게 되므로 예측이 불가능하다.
+
+* 하지만 DFS가 끝난 경우를 생각했을 때, 모든 정점을 한번씩 방문하고(n), 모든 간선을 한번씩 모두 검사했으므로 **O(n+e)** 의 시간이 걸린다.
+
+* `인접 행렬`일 때 DFS 하나당 loop를 돌게 되므로 O(n)의 시간 복잡도를 가진다. 그리고 N개의 정점을 모두 방문해야 하므로 n*O(n)으로 **$O(n^{2})$** 의 시간이 걸린다.
+
+* 결론적으로, 인접 리스트의 경우 시간 복잡도가 **$O(n+e)$** 이고, 인접 행렬의 경우 시간 복잡도가 **$O(n^{2})$** 이다.
+
+### DFS 장/단점
+
+> 장점
+
+* 구현이 너비 우선 탐색(BFS)보다 간단하다.
+
+* **현재 경로상의 노드들만 기억하면 되므로, 저장 공간의 수요가 비교적 적다.**
+
+* **목표 노드가 깊은 단계에 있는 경우 해를 빠르게 찾을 수 있다.**
+
+> 단점
+
+* 단순 검색 속도는 너비 우선 탐색(DFS)보다 느리다.
+
+* 해가 없는 경우에 빠질 가능성이 있다.
+
+ (사전이 임의의 깊이를 지정한 후 탐색하도록 하고, 목표 노드를 발견하지 못할 경우 다음 경로를 탐색하도록 한다)
+
+* 깊이 우선 탐색은 해를 구하면 탐색이 종료되므로, 구한 해가 최단 경로가 된다는 보장이 없다.
+
+ (목표에 이르는 경로가 다수인 경우 구한 해가 최적이 아닐 수 있음)
+
+## BFS
+
+* 루트 노드에서 시작하여 둘째 층을 왼쪽에서 오른쪽으로 훓어나가고, 그 다음 층 역시 왼쪽에서 오른쪽으로 훑어나가는 식으로 검색을 한다.
+
+* BFS는 재귀적으로 동작하지 않는다. BFS는 방문한 노드들을 차례로 저장한 후 꺼내는 **선입선출**(FIFO) 방식으로 탐색하여 **큐**를 사용한다.
+
+* 이 알고리즘 역시 DFS와 마찬가지로 **어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다**는 것이다. (검사하지 않으면 무한루프에 빠질 수 있다)
+
+* 시작 정점에서 가장 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다.
+
+* DFS와 마찬가지로, 인접 리스트의 경우 시간 복잡도가 **$O(n+e)$** 이고, 인접 행렬의 경우 시간 복잡도가 **$O(n^{2})$** 이다.
+
+
+### BFS 장/단점
+
+> 장점
+
+* 너비를 우선으로 탐색하기 때문에 **답이 되는 경로가 여러 개인 경우에도 최단경로임을 보장**한다.
+
+* 최단 경로가 존재하면 깊이가 무한정 깊어진다고 해도 최단 경로를 찾을 수 있다.
+
+* **노드 수가 적고 깊이가 얕은 해가 존재**할 때 DFS보다 유리하다.
+
+> 단점
+
+* 재귀호출을 사용하는 DFS와 달리 큐를 이용해 다음에 탐색할 노드들을 저장하기 때문에 **노드의 수가 많을 수록 필요없는 노드들까지 저장해야 하므로 더 큰 저장공간이 필요**하다.
+
+* 노드의 수가 늘어나면 탐색해야 하는 노드가 많아지기 때문에 **비효율적**이다.
+
+## DFS, BFS 구현
+
+* [Class3++ 1260. DFS와 BFS](https://devfancy.github.io/solved-class3-backjoon-1260/) 문제를 DFS와 BFS를 이용하여 풀었다.
+
+### 정답 코드
+
+```java
+import java.io.*;
+import java.util.*;
+
+public class Main {
+ static int [][] check; //간선 연결상태
+ static boolean [] checked; //확인 여부
+ static int n; //정점 개수
+ static int m; //간선 개수
+ static int start; // 시작정점
+
+ public static void main(String[] args) throws IOException {
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+
+ StringTokenizer st = new StringTokenizer(br.readLine());
+ n = Integer.parseInt(st.nextToken());
+ m = Integer.parseInt(st.nextToken());
+ start = Integer.parseInt(st.nextToken());
+
+ check = new int[1001][1001]; // 좌표를 그대로 받아들이기 위해 +1 해서 선언
+ checked = new boolean[1001]; // 초기값 : false
+
+ //간선 연결상태 저장
+ for(int i = 0; i < m; i++) {
+ StringTokenizer str = new StringTokenizer(br.readLine());
+
+ int x = Integer.parseInt(str.nextToken());
+ int y = Integer.parseInt(str.nextToken());
+
+ check[x][y] = check[y][x] = 1;
+ }
+
+ //dfs 호출
+ dfs(start);
+
+ checked = new boolean[1001]; // 확인상태 초기화
+ System.out.println(); // 줄바꿈
+
+ //bfs 호출
+ bfs(start);
+ }
+
+ //시작점을 변수로 받아 확인, 출력 후 다음 연결점을 찾아 시작점을 변경하여 재호출
+ public static void dfs(int start) {
+ checked[start] = true;
+ System.out.print(start + " ");
+
+ for(int j = 1; j <= n; j++) {
+ if(check[start][j] == 1 && checked[j] == false) {
+ dfs(j);
+ }
+ }
+ }
+
+ public static void bfs(int start) {
+ Queue
+
+
+## Encryption and Decryption
+
+* `Encryption` is the process of turning a plaintext human message into `cyphertext`.
+
+ * 알아볼 수 있는 문장 → 알아볼 수 없는 문장
+
+* `Decryption` is the process of turning the `cyphertext` back into readable plain text
+
+ * 알아볼 수 없는 문장 → 알아볼 수 있는 문장
+
+
+## Symmetric Encryption
+
+* Suppose Alice → Bob (message)
+
+ * `Caesar cypher` : They encrypt the text by shifting each letter a set number of places in the alphabet. (글자들을 정해진 칸 만큼 각각의 글자들을 옮기는 것)
+
+- **Symmetric encryption :** a type of encryption where only one key (a secret key) is used to both encrypt and decrypt electronic information
+- kor) 어떤 메세지를 encrypt 과 decrypt 하는 오로지 하나의 key가 같을 때 쓰는 encryption 유형
+- 이런 유형은 실생활에서 사용하지 않는다.
+ - spot 하고 break 하기 너무 쉽다.
+ - 어떤 key를 사용해야할지 동의을 위한 의사소통이 필요하다. (They have to communicate to agree what key to use for scheme)
+
+
+## Symmetric Encryption
+
+
+
+
+## Asymmetric Encryption
+
+* `ASymmetric Encryption` (**Public key Cryptography**) : a cryptography system that uses pairs of keys. (서로 다른 키)
+
+ * The key used to decrypt a message is different to the key used to encrypt message.
+
+ * You create two mathematically linked keys when you want to receive encrypted message.
+
+ * `Public key` : You can share it with the world, and anyone can use it to encrypt message for you. (누구나 공유할 수 있는 키)
+
+ * `Private key` : It is know only to you. (오직 혼자만 아는 키)
+
+
+## Asymmetric Encryption
+
+
+
+
+* Elliptic Curve Digital Signature Algorithm (`ESCADA`)
+
+ * 당신은 랜덤하게 발생되어 선택된 private key를 가지고 그것으로부터 mathematically 발생된 public key를 가집니다.
+
+ * Private key: Pick a random number between 0 and $2^{256}$ - 1 (78 digits).
+
+ * Public key: Do some ESCADA maths on the private key.
+
+ * 정리) 랜덤한 숫자를 추출해서 private key를 만든 후 수학적인 함수를 적용해서 public key를 만든다.
+
+
+## Hashes
+
+* `Hash function` : A mathematical function that converts an input value into another compressed(압축된) value
+
+ * The input to the function is called preimage or message.
+
+ * The output of the function is called fingerprint, digest, or hash
+
+ * Hash functions are **deterministic** because the output is determined by the input.
+
+ * **Basic hash function** (not used in blockchain)
+
+ * input를 받으면 첫글자를 출력하는 것
+
+ * 예) Hash(‘What time is it?’) ⇒ ‘W’
+
+ * **Cryptographic hash function** (used in blockchains)
+
+ * 예) MD5, SHA-256
+
+
+## Cryptographic Hash Functions
+
+* Cryptographic hash Functions는 특별하고 유용하게 만드는 몇가지 특징들이 있습니다.
+
+* 이상적인 Cryptographic Hash Functions 위한 5가지 특징들
+
+ * [1] It is deterministic so the same message always results in the same hash.
+
+ * [2] It is quick to compute the hash value for any given message (you can easily go ‘forwards’). ⇒ 계산이 빨라야한다 = 답을 간단하게 출력해야 한다.
+
+ * [3] It is not feasible to generate a message from its hash value except by trying all possible messages (you can’t go ‘backwards’).
+
+ * 가능한 메세지를 시도하는 것을 제외한다면, 주어진 hash value로부터 원래의 메세지를 찾는 것이 불가능하다. ex) ‘W’ (hash value) → ‘What time is it?’(Digital message)
+
+ * [4] A small change to a message should change the hash value so extensively that the new hash value appears uncorrelated with the old hash value (a small change makes a big difference). ⇒ 조금의 변화라도 해쉬 값에 큰 차이를 가진다.
+
+ * [5] It is not feasible to find two different messages with the same hash value (it is hard to create a hash clash). ⇒ 같은 해쉬값을 가진 두가지 다른 메세지를 찾는것이 불가능하다.
+
+
+### Cryptographic Hash Functions - Properties
+
+* Cryptographic functions are sometimes called **trapdoor** function (Properties 2 and 3).
+
+ * message → hash (O) But, hash → message(X)
+
+* Message 가 조금만 달라도 전혀다른 hash 값이 나온다. 즉, **유추가 불가능하다.**
+
+
+### What is Good Cryptographic Hash Functions ?
+
+* Is the **hash function ‘Use the first character’** be good cryptographic hash functions ?
+
+ * [1] Yes, it is deterministic
+
+ * [2] Yes, it is quick to compute the output.
+
+ * [3] Yes, by knowing only ‘W’ it is not feasible to guess the original sentence.
+
+ * ex) ‘W’ → ‘What time is it?’ (X)
+
+ * [4] No, a small change in the message doesn’t necessarily change the output. 'What time is at¿ also hashes down to 'W'.'
+
+ * [5] No, we can easily create loads of inputs that will all hash down to the same output. Anything starting with 'W' will work.
+
+ * => **4,5 번에 의해 좋은 cryptographic hash function 될 수 없다.**
+
+
+## Digital Signatures
+
+* `Digital signature` : a specific type of electronic signature that requires the signer to authenticate their identity using a certified digital ID
+
+ * It is created by taking the message you want to sign and applying a mathematical formula with your private key.
+
+ * Message + Private key → Digital signature
+
+ * Anyone who knows your public key can mathematically verify that this signature was indeed created by the holder of the private key.
+
+ * Message + Digital signature + Public key → Valid / Invaild
+
+
+### Digital Signatures - 그림
+
+* Here, you encrypt data with private key and decrypt it with a public key.
+
+
+
+
+### Wet-ink-on-paper signature
+
+* There is no way of knowing if a document has been tampered after your signature is made. ⇒ 서명한 이후 조작되더라도 알 방법이 없다.
+
+* Your signature can easily be copied and re-used with other documents without your knowledge. ⇒ 서명이 쉽게 copy 되고, 다른 문서와 함께 재사용할 수 있다.
+
+### Digital Signatures
+
+* Any tampering with the message will result in the signature being invalidated. ⇒ 문서(메세지) 조작이 불가능하다
+
+* It is only valid for that exact piece of data, and so it cannot be copied and pasted underneath another piece of data. ⇒ 한번 사용하는 것으로 복사/붙여넣기 할 수 없다.
+
+* Digital signatures are used in blockchain transactions.
+
+ * They prove **account ownership**.
+
+ * **No central organization** (제 3자 개입 X)
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
+
+* [Bitcoin, Blockchain, and Cryptoassets](https://www.amazon.com/Bitcoin-Blockchain-Cryptoassets-Comprehensive-Introduction/dp/0262539160)
+
+ * A Comprehensive Introduction, Fabian Schär and Aleksander Berentsen, 2020, MIT Press
diff --git a/src/content/posts/EF-08-Cryptocurrencies.md b/src/content/posts/EF-08-Cryptocurrencies.md
new file mode 100644
index 00000000..b8a2a398
--- /dev/null
+++ b/src/content/posts/EF-08-Cryptocurrencies.md
@@ -0,0 +1,473 @@
+---
+title: "08. Cryptocurrencies"
+date: 2022-06-02
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+## Bitcoin
+
+* `Bitcoin` : a decentralized digital currency that can be sent from user to user on the peer-to-peer bitcoin network without intermediaries (만들어내고 유통화하고 관리하는 것이 중앙화 되지 않고 모든 사람이 참여가능한 decentralized digital currency 입니다)
+
+
+
+
+* `Node` : machines running the apps
+
+ * `Miner` : a specialist node which bundles together valid transactions into blocks and distribute those blocks to nodes across the network (block을 만드는 역할의 노드들)
+
+
+
+
+## Problems
+
+### [1] Accounts Need Permission
+
+* [1] Problem : Accounts Need Permission → 기관 승인 없이 계좌 생성 블가능하다.
+
+* [1] Solution : **Use Public Keys as Account Numbers**
+
+* Public key를 이용해서 address를 만든다.
+
+* Private key + Disital signature를 통해 Public key를 생성하고, 그것을 가공해서 address를 만든다.
+
+### [2] Single Central Bookkeeper
+
+* [2] Problem : Single Central Bookkeeper → 장부들이 어떻게 안전하게 관리될까 ?
+
+* `Central bookkeeper` : the coordinator(은행 역할) who maintains the list of transactions and balances, and validates and orders the transactions
+
+* [2] Solution : **Replicate the Books** (장부를 복제해서 배포하기)
+
+* 누구든지 허가없이, 위계질서 없이 bookkeeper가 될 수 있고, 모든 bookkeeper들은 모든 정보가 있는 장부를 확보한다. 그리고 만약 조직을 강요받는다면, 그런 bookkeeper가 보유하고 있는 장부를 무시하거나 제외하면 된다.
+
+
+
+
+### [3] Transaction Ordering
+
+* [3] Problem : Transaction Ordering → 거래주문이 많아 통일이 어려움
+
+ * transaction이 너무 많아서 node들이 실시간으로 그 transaction들을 ordering 하는 것이 불가능하기 때문에 통일된 형태의 block을 가질 시간이 없다.
+
+
+
+* [3] Solution : **Blocks**
+
+* 장부에 들어가는 속도는 컨트롤이 가능하다.
+
+* 따라서 많은 transaction 들을 block으로 묶어서 장부에 넣는다.
+
+* Block이 transaction 보다 훨씬 덜 자주 만들어진다.
+
+
+
+* Bookkeeper들이 여유있게 검증할 수 있다. (the ordering of blocks of transactions)
+
+* Blocks의 숫자가 훨씬 더 적고, 하나의 transaction보다 네트워크에 있는 노드들이 block에 대해서 합의에 이를 가능성이 훨씬 더 높다.
+
+* **Bookkeeper의 수행기능 2가지**
+
+ * 보류중인 transaction 승인 및 알림(전파)
+
+ * blocks of transactions 검증, 저장 및 알림(전파)
+
+### [4] Who Can Create Blocks, and How Often?
+
+* [4] Problem : Who Can Create Blocks, and How Often? → 누가 얼마나 자주 blocks 만드는가 ?
+
+* [4] Solution : **Proof-of-Work (작업 증명) → ‘나 고생했어요’ 라고 증명하는 것**
+
+* `Proof-of-Work` : 한 노드가 다른 노드들한테 ‘내가 특정한 형태의 computational effort를 굉장히 많이 했다' 라는 것을 보여주는 형태
+
+#### The rule of Bitcoin’s proof-of-work game
+
+* nonce 값을 바꾸면서 Tx(transaction)를 긁어모은다. → hash function에 돌린다.
+
+* 만약 hash 값이 target number 보다 작으면 Tx 긁어모은 block이 정식 block으로 인정받게 된다.
+
+* 한마디로 표현하면, `노가다` 혹은 `삽질` 이다.
+
+* 이러한 과정들을 `Mining`이라고 한다.
+
+* `Mining` : hash 값 < target number ⇒ 진짜 Bitcoin block 으로 넣는 과정이다. (Bitcoin’s public ledger)
+
+!
+
+* `One-CPU-One-Vote`
+
+ * Your chance of winning a block is proportional to how much hashing power you control.
+
+ * (해석) target number 보다 작은 hash 값을 찾기 위해 누가 더 많이 CPU 를 쓰는가에 달려있다.
+
+### [5] Incentivising Block-Creators
+
+* [5] Problem : Incentivising Block-Creators → Hashing 하는 것도 많은 돈이 필요함
+
+* [5] Solution : **Transaction Fees** (송금 수수료 - block을 만든 사람에게 주는 인센티브)
+
+* 거래가 되는 금액의 일부로 block 을 만든 사람에게 보상해준다.
+
+* 보상금액은 “시장 원리"에 의해 결정된다.
+
+* Fees → 예시)
+
+
+
+* Total Transaction Fees(USD) 관련 그림
+
+
+
+### [6] How to Bootstrap?
+
+* [6] Problem : How to Bootstrap? → 거래가 없을 때 시스템을 어떻게 유지해야할까 ? (거래량이 적어질때 시스템을 유지하는 방법)
+
+* [6] Solution : **Block Rewards** -> Transaction fee 외에 추가적인 보상시스템
+
+* Block-creator는 정해진 한도내에서 최대한 bitcoin을 원하는 address로 나 또는 타인에게 보낼 수 있는 transaction을 생성할 수 있다.
+
+* **Coinbase transaction 개념**
+
+ * block을 만든 사람에게 추가적으로 본인 스스로 transaction을 만들 수 있다.
+
+ * 블록체인에서 가장 먼저 발생한 transaction
+
+ * 기존에 없는 bitcoin을 새롭게 만들어내는 transaction
+
+
+
+
+### [7] More Hashing, Faster Blocks, More Monetary Supply
+
+* [7] Problem : More Hashing, Faster Blocks, More Monetary Supply → 적당한 속도로 block이 만들어질 수 있도록 조건이 필요함
+
+* [7] Solution : **Difficulty** -> “게임의 난이도 조절”
+
+* block이 예상 목표보다 빠르게 생성한다면 네트워크 속도를 느리게 한다.
+
+* 또한, 난이도 수준을 어렵게 하기 위해서 target number를 더 낮게 설정한다.
+
+
+
+
+### [8] Block Ordering
+
+* [8] Problem : Block Ordering → 정렬을 어떻게 하는가?
+
+* [8] Solution : **Block Chain**
+
+* 각각의 block은 성공적으로 인정받는 이전 block의 hash 값을 넣게(포함시키게)만든다.
+
+
+
+* **Block Chain 조작이 어려운 이유**: 각각의 block이 이전 block의 hash값을 참조하고 있고, 그 block의 hash값을 거래정보가 바뀌면 완전히 바뀌기 때문에, 하나만 건드려도 전체가 영향을 받고 있기 때문에 Block Chain은 조작이 어렵습니다.
+
+
+### [9] Block Clashes/Consensus
+
+* [9] Problem : Block Clashes/Consensus → 비슷한 타이밍의 서로다른 miner(=block-creator)들이 나타난 경우
+
+* [9] Solution : **Longest Chain Rule** - block간의 충돌이 발생했을 때의 해결 방안
+
+* 다수의 체인이 존재할 때, 가장 긴 체인의 blocks을 만들어서 “true version”으로 (인정받는)선택받는다.
+
+* 버려지는 block은 `orphan`이라 부른다.
+
+
+
+### [10] Double Spend
+
+* [10] Problem: Double Spend
+
+* Double Spend → 실물 화폐에서는 불가능하지만, 디지털 화폐에서는 가능할 수 있다.
+
+#### Double Spend 과정
+
+* (1) 같은 비트코인에 두개의 transaction를 생성시킨다. (하나는 online retailer, 다른 하나는 당신계좌)
+
+* (2) retailer에게 지불한다는 거래만 알린다.
+
+* (3) 지불한다는 거래가 포함된 block이 만들어지면, retailer는 block을 확인하고 물건을 보내준다.
+
+* (4) 당신이 물건이 받고서, 추가적으로 retailer에게 지불한다는 것을 제외하는 더 긴 체인의 block을 만든다. 그리고 당신에게 지불하는 것으로 대체한다.
+
+* (5) 가장 긴 체인이 공식 블록으로 인정받게 된다.
+
+* (6) 기존에 retailer에게 지불한다는 block은 인정받지 않게 되고, 가장 긴 체인만 인정받게 되는 결과를 낳는다.
+
+* Double Spend 과정 -> 그림
+
+
+
+
+* [10] Solution: **Wait about Six Blocks** → 1시간 기다리고 물건을 보내라
+
+* 최소 6개 block을 만들때까지 1시간정도 기다린 후에 물건을 보낸다.
+
+
+
+* `51% Attack` 개념, **현실적으로 불가능한 이유**
+
+ * If someone wants to replace blocks, they have to create blocks quickly and overtake the rest of the (presumably honest) network.
+
+ * If more than 50% of the total hash power of the network is used to re-write blocks, then it will be able to do so.
+
+ * 이것이 현실적으로 불가능한 이유: 돈이 많이 들고, 조작적으로 해서 비트코인을 많이 갖고싶어서일텐데, 비트코인 가치가 떨어지게 바라진 않는다. 51% Attack이 가능하게 되면, 비트코인 가치가 아무 쓸모가 없게 되기 때문
+
+
+## Which Coins?
+
+* 비트코인 특징: Bitcoin is digial + physical cash + 과거기록이 추적가능하다.
+
+* Bitcoin transaction
+
+ * Mining fee: Miner에게 지불하는 비용. miner가 당신의 거래를 block에 등록해주는 대가로 지불하는 값
+
+* Lump of money → 거래가 이루어지는 방식(input, output)
+
+ * The lumps of money in your account are called `UTXOs` (쌓여있는 돈)
+
+ * 상황 - (1.5 BTC를 친구에게 보내는 경우)
+
+ * 2 BTC를 보낸다면 0.5 BTC를 되돌려받는다.
+
+ * Input : 2BTC
+
+ * Output: 1.5BTC(친구), 0.5BTC(나)
+
+
+
+
+### Peer-to-Peer 방식
+
+* 중앙서버 없이 요청하고, 중개없자가 있지만 불특정 다수이다.
+
+* Peer-to-peer 모델은 각각의 peer가 서로 업데이트를 공유하는 gassip network(주변 네트워크)와 같다.
+
+ * 노드들이 새로운 정보가 발생할 때마다 업데이트를 해야해서 덜 효율적임
+
+ * 만약 몇몇의 노드가 일시적으로 연결성을 잃어도, 개개인이 스스로 검증하기 때문에, 각각의 peer는 독립적이고, 위계없이 계속적으로 운영할 수 있음
+
+
+### Miscreants
+
+* 개인의 사익을 갖고있는(악의를 갖고있는) bookkeeper의 영향이 매우 제한되어 있음 → 다수의 노드들이 스스로 검증하기 때문에 나쁜 짓을 할 확률이 적다.
+
+* Malicious miners can:
+
+ * block을 포함하고 제외하는 것이 가능하다.
+
+ * 긴 체인(’longer chain’)을 만들어서 Double Spend를 만들 수 있다.
+
+* Malicious miners can’t:
+
+ * Bitcoin을 훔칠 수 없다. Private key를 알고 있지 않은 한 조작이 불가능하다.
+
+ * Bitcoin을 마음대로 만들 수 없다.
+
+### Bitcoin in Practice
+
+* 비트코인이 탈 중앙화가 되기 힘든 이유
+
+ * Bookkeeping nodes are mostly running the same software, and thus controlled by a very small number of people.
+
+ * (**중요**) Only a few entities can mine profitably(수익창출), usually using special purpose *mining farms* clustered in the area of cheap electricity.
+
+ * The ownership of BTC shows a concentration in a small number of hands.
+
+ * Upgrades to the Bitcoin network and protocols are centralised.
+
+
+### Account Balance
+
+* `Full node wallet`
+
+ * 전체 비트코인 블록체인 정보를 저장 및 업데이트를 한다.
+
+ * 특히 모바일 폰에서 현실적으로 쓰기 어렵다.
+
+* `Lightweight wallet`
+
+ * 전체 블록체인에 접속하여 가장 최신버전만 획득, 다운받을 수 있다. (필요한 정보만 다운받을 수 있음)
+
+ * 핸드폰으로도 계좌잔고를 볼 수 있다.
+
+* `Hardware wallets` : private keys are stored in chips on small handheld devices.
+
+ * Purpose : 오직 제한된 방식의 요구에 반응하여 Private key를 안전하게 보관할 수 있게 설계되어 있다.
+
+ * The user interface software is run on an online machine.
+
+ * Private key를 내부(안)에서 처리한다. (노출시키지 않는다)
+
+ * Since the private key is stored on hardware not connected to the internet, it is harder for a hacker to gain access to the private keys.
+
+ * Hardware wallets - 그림
+
+
+
+
+* Cold Storage and Hot Wallets
+
+ * Cold Storage: 인터넷에 연결하지 않는 컴퓨터나 종이와 같은 오프라인 미디어에 Private key를 보관한다.
+
+ * Hot wallet: 중간의 간섭없이 거래에 서명하고 알릴 수 있는 지갑이다.
+
+
+## Ethereum
+
+* `Ethereum` : a decentralized, open-source blockchain with smart contract functionality (기능적으로 smart contract가 있는 탈중앙화된 오픈소스 블록체인입니다)
+
+ * Ethereum: trustless validation, distributed storage and **processing of data and logic**
+
+
+
+* `Smart Contract` : a self-executing contract with the terms of the agreement between buyer and seller being directly written into lines of code
+
+ * 코드를 통해서 자동으로 실행되는 contract
+
+### How Is Ethereum Similar to Bitcoin ?
+
+* Public and permissionless → 누구나 접근가능하고, 허가가 필요없는 네트워크
+
+* **Proof-of-work (PoW) mining**
+
+ * 공통점 : Mining participants create valid blocks by spending electricity to find solutions to a mathematical challenge (Ethash).
+
+ * 차이점 : Ethash allows more common hardware to be used.
+
+ * 비트코인은 컴퓨터 성능이 좋아야 빠르게 계산하여 hash값을 찾을 수 있다.
+
+ * 이더리움은 일반적인 모습을 갖춘 하드웨어도 mining을 효율적으로 작업할 수 있게 알고리즘을 만들었다.
+
+
+### What is the features Ethash algorithm ?
+
+* **Ethash algorithm features**
+
+* [1] It is highly dependent on operations in RAM memory, consuming large amounts of bandwidth. (RAM에 크게 의존한다)
+
+* [2] The algorithm is GPU friendly. (GPU를 많이 활용한다)
+
+ * 그래픽 카드를 많이 활용하는 것은 이더리움에 있는 채굴 알고리즘 때문이고, GPU에 RAM 메모리가 붙어있기 때문이다.
+
+* [3] Offers excellent verification capabilities for thin clients.
+
+
+### Ethereum 2.0 (Serenity)
+
+`Ethereum 2.0(Serenity)`
+
+* In Serenity, there is a plan to move from proof-of-work mining to a proof-of-stake mining protocol (Casper).
+
+* **Proof-of-stake** "지분 증명" (중요)
+
+ * 이더리움이 많을 수록 다음 block을 채굴 할 수 있게끔 알고리즘을 짜는 것임 (채굴할 수 있는 가능성이 높아진다)
+
+* Ethereum 2.0(Serenity) 을 정착시키기 위해 해야될 일
+
+ * **Difficulty bomb(난이도 폭탄):** the increasing difficulty level of puzzles in the mining algorithm used to reward miners with Ether on its blockchain
+
+
+### Ethereum Virtual Machine (EVM)
+
+* `Ethereum Virtual Machine (EVM)` : the part of Ethereum that handles smart contract deployment and execution
+
+* EVM 특징
+
+ * 이더리움 소프트웨어를 다운로드하여 실행하면, 컴퓨터에 분리된 가상의 컴퓨터가 생성되고 시작된다.
+
+ * EVM은 모든 이더리움 거래와 블록을 처리하고 모든 계정 잔액과 smart contracts를 추적한다.
+
+ * 이더리움 네트워크의 각 노드들은 동일한 EVM을 실행하고 동일한 데이터를 처리한다.
+
+ * **Replicated state machine** : All the nodes running Ethereum are coming to consensus about the state of the Ethereum Virtual Machine
+
+### Gas
+
+* `Gas` : "가격 리스트"
+
+ * Different transaction types have different computational complexities.
+
+ * Ethereum has a concept of *gas* a sort of price list, based on the computational complexity of the different types of operation.
+
+* Gas Limit
+
+ * The gas limit you set provides a ceiling for how much gas you are prepared for a transaction to consume.
+
+ * maximum mining fee = **gas limit(양) x gas price(가격)**
+
+ * Gas Limit → 거래 예시) Consider a basic transaction of a transfer of ETH from one account to another uses 21,000 gas.
+
+ * 21,000이상 입력하게 되면 → 21,000만 사용하게 됨
+
+ * 21,000보다 낮게 입력하게 되면 → 거래 인정이 안되고 mining fee 환불이 안된다.
+
+### Uncles
+
+* `Uncle` : a block which does not form a part of main chain
+
+* 특징
+
+ * In Bitcoin, they are called `orphan`
+
+ * In Ethereum, `uncles` → 전체 시스템에 chain의 security를 향상시키는데 공헌한다.
+
+### GHOST Protocol
+
+* `GHOST(Greedy Heaviest Observed Subtree) Protocol` : An algorithm for dealing with stale blocks.
+
+* 문제점
+
+ * [1] Security issue - A먼저 생성후 B 생성하게 되면, B는 main chain에 인정받지 않게 되고 네트워크 보안에 기여하지 않게 됨
+
+ * [2] Centralization issue - 더 빨리 만드는 miner가 독점할 수 있음
+
+* 해결 방안
+
+ * [1] Security issue - Stale blocks are added to the calculation of which is the main chain of the blockchain.
+
+ * [2] Centralization issue**:** There are block rewards to stales.
+
+### Modified GHOST Implementation
+
+* `Modified GHOST Implementation` - GHOST protocol에 개선된 것
+
+ * A block must specify a parent, and it must specify 0 or more uncles.
+
+ * uncle : 자신의 직계조상의 다른 child를 의미함
+
+ * An uncle included in block *B* must have the following properties:
+
+ * It must be a direct child of the kth generation ancestor of B, where 2 ≤ k ≤ 7.
+
+ * 직계 조상이 될 수 없다.
+
+ * 만약 이전 block이 uncle인 B_1을 쓴다면, 다른 block이 B_1을 uncle에서 제외시켜야 한다.
+
+* Modified GHOST Implementation
+
+
+
+* 조상의 직계자식들만 uncle이 된다.
+
+* 가장 무거운 Subtree을 선택한다(가장 많은 block을 가진 것)
+
+* 4B의 uncle: 3E, 3C, 2D, 2B
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
+
+* [Bitcoin, Blockchain, and Cryptoassets](https://www.amazon.com/Bitcoin-Blockchain-Cryptoassets-Comprehensive-Introduction/dp/0262539160)
+
+ * A Comprehensive Introduction, Fabian Schär and Aleksander Berentsen, 2020, MIT Press
+
+* [The Basics of Bitcoins and Blockchains](https://www.amazon.com/Basics-Bitcoins-Blockchains-Introduction-Cryptocurrencies/dp/1633538001)
+
+ * An Introduction to Cryptocurrencies and the Technology that Powers Them , Antony Lewis, 2018, Mango
\ No newline at end of file
diff --git a/src/content/posts/EF-09-Digital-Tokens.md b/src/content/posts/EF-09-Digital-Tokens.md
new file mode 100644
index 00000000..a94d2023
--- /dev/null
+++ b/src/content/posts/EF-09-Digital-Tokens.md
@@ -0,0 +1,121 @@
+---
+title: "09. Digital Tokens"
+date: 2022-06-25
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+### What Are Digital Tokens?
+
+* `Digital token` : 자산의 가치를 대변하거나 특별한 사용을 의미하며 자체 블록체인에 상주하는 암호화폐의 유형이다
+
+
+
+### Types of Tokens
+
+* `Native blockchain tokens` : block-creators 에게 보상해주는 토큰
+
+* `Asset backed tokens` : 믿을만한 관리인이 신탁한 일부 실물 자산에 대한 소유권을 나타낸다.
+
+* `Utility tokens` : 토큰의 issuer에 의해 제공된 서비스를 이용할 수 있다.
+
+
+### Native Blockchain Tokens
+
+* Native blockchain tokens 특징
+
+ * They are created by the same blockchain software that keeps track of ownership of these units.
+
+ * No asset backs the value of native tokens.
+
+ * Also known as intrinsic tokens or built-in tokens.
+
+### Examples of Native Tokens
+
+#### Ripple
+
+* `Ripple` : Ripple is a money transfer network designed to serve the needs of the financial services industry.
+
+* 목적 : Swift 기능을 대체하기 위해 만들어짐
+
+* 특이점 : 이용자들이 네트워크를 이용해 거래를 할 때마다 네트워크는 소량의 XRP를 소각한다.
+
+#### XRP
+
+* `XRP` : XRP is a cryptocurrency that runs on the XRP Ledger.
+
+* **Centralized consensus protocol** 로써, XRP는 proof-of-work 에 의존하지 않고, 인정받는 노드들의 리스트를 유지한다.
+
+* 안전하고 효율적인 검증 프로세스로써 3-5초 사이로 검증하며 문제가 생기면 멈추고 재검증하는 절차가 들어간다.
+
+* XRP was **pre-mined**
+
+ * 가치를 유지하기 위해 유통되고 있는 것의 일부를 소유하며 기간적으로 유통시킨다.
+
+ * cryptocurrency 성장에 도움을 준 사람들에게 보상을 해준다.
+
+### Pros and Cons of Ripple
+
+* 장점
+
+ * 검증이 (4-5초) 빠르며, 굉장히 저렴한 거래 수수료(0.000001 XRP)를 가짐
+
+ * 법정화폐와 암호화폐에 사용될 수 있는 다목적 교환 네트워크임
+
+ * 큰 금융기관에 활용됨
+
+* 단점
+
+ * 중앙화되어 있으며, 이미 크게 pre-mined 했음
+
+ * SEC가 XRP에 소송을 걸었음
+
+### Asset Backed Tokens
+
+* `Asset backed tokens` : 실물 자산에 대한 디지털화된 문서로 자산이 보증이 된다.
+
+ * [1] `Depository receipt tokens` : 기초자산에 대해 소유권을 주장할 수 있다.
+
+ * 특징 1) 관리자에 의해 기초자산의 소유권을 나타낸다.
+
+ * 특징 2) 토큰을 redeem하고 싶을때, 토큰을 가지고 발행인에게 가서 기초 자산을 청구할 수 있다.
+
+ * [2] `Title tokens` : 자산의 소유권 증명을 나타내는 디지털 문서
+
+ * [3] `Contract tokens` : 토큰 발행자와 토큰 소지자 간의 계약상 의무를 나타내는 토큰
+
+### How Do Asset Backed Digital Tokens Work?
+
+* **Excel spreadsheet 보다 `Goldchain` 을 사용하는 이유**
+
+ * 블록체인을 사용하면 여러 노드들의 감시가 있기 때문에 사기를 치기 어렵다.
+
+ * 새로운 소프트웨어, 하드웨어가 개발됨에 따라 조금 더 효율적으로 토큰의 거래, 이동을 시킬 수 있다.
+
+ * peer-to-peer 시스템에서 중간에 토큰을 발행하고 보관하는 회사가 개입하지 않아도 거래가 가능하다.
+
+### Utility Tokens
+
+* `Utility tokens` : 어떤 토큰에 대해서 토큰을 갖고 있는 주주들이 회사가 제공하는 smart contract 형태와 같은, 회사가 약속한 제품 또는 서비스를 받을 수 있다.
+
+ * 발행 회사에게 청구권을 나타낼 수 있다.
+
+ * 제품 또는 서비스에 대해 토큰을 사용할 수 있다.
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
+
+* [The Basics of Bitcoins and Blockchains](https://www.amazon.com/Basics-Bitcoins-Blockchains-Introduction-Cryptocurrencies/dp/1633538001)
+
+ * An Introduction to Cryptocurrencies and the Technology that Powers Them , Antony Lewis, 2018, Mango
+
+* [Blockchain and Distributed Ledgers](https://www.amazon.com/Blockchain-Distributed-Ledgers-Alexander-Lipton/dp/9811221510)
+
+ * Mathematics, Technology, and Economics, Alexander Lipton and Adrien Treccani, 2022, World Scientific Publishing
+
diff --git a/src/content/posts/EF-10-Blockchain-Technology.md b/src/content/posts/EF-10-Blockchain-Technology.md
new file mode 100644
index 00000000..e5a9208f
--- /dev/null
+++ b/src/content/posts/EF-10-Blockchain-Technology.md
@@ -0,0 +1,88 @@
+---
+title: "10. Blockchain Technology"
+date: 2022-06-26
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+
+### What is Common to Blockchain Technologies?
+
+* Blockchain Technologies 특징 4가지
+
+ * [1] 데이터의 변경내용을 기록하는 데이터 저장소이다.
+
+ * [2] 여러 시스템에 걸쳐 데이터 저장소를 실시간으로 복제한다.
+
+ * [3] Peer-to-peer 방식으로 네트워크안에 있는 노드들이 줄변에 알려준다.
+
+ * [4] 소유권 및 신뢰성을 증명하기 위한 디지털 서명 및 참조용 해쉬를 사용하는 cryptographic method 이다.
+
+
+* Blockchain vs Database 차이
+
+ * Database는 단순히 데이터를 저장하고 보관한다.
+
+ * Blockchain은 주변 노드들과 연결이 되어 있고, 각자 자기 역할이 있다.
+
+ * 그리고 네트워크 통신을 하면서 주변에 새로운 transaction이 발생하면, 주변에 알리고 정해진 rule에 의해 새로운 transaction에 직접 검증하는 프로세스이다.
+
+
+
+
+### Public Blockchain
+
+* `Public (permissionless) blockchain`
+
+ * 누구나 관리당국의 허가없이 block을 만들 거나 bookkeeper가 될 수 있다.
+
+ * 누구나 다 자연스럽게 자금을 받기 위한address를 생성할 수 있고 자금을 보내기 위한 transaction을 만들 수 있다
+
+* `Private instance of public blockchain`
+
+ * Private network에서 블록체인 소프트웨어를 실행해 새로운 ledger을 만들 수 있다.
+
+ * 각 네트워크의 노드는 그들 자신의(자체) 블록체인에 보이는 것만 검증 할 수 있다.
+
+ * Private하게 활용하는 코인은 main net 에 있는 코인과 서로 호환되지 않는다.
+
+### Private Blockchain
+
+* `Permissioned (permissionable) blockchain`
+
+ * 미리 허가된 사람들만 참가할 수 있는 블록체인
+
+ * 보상이 있는 토큰이 존재하지 않으며, 비즈니스 목적으로 만든 것이다.
+
+ * 믿을 수 있는 상태에서 데이터들이 block에 저장되는 것이 중요하다.
+
+### What Are Blockchains Good for?
+
+* Public blockchains → **투자 목적**
+
+ * Speculation
+
+ * Darknet markets (익명성 보장)
+
+ * Cross border payments (국경 간 이체)
+
+ * Initial coin offerings (초기 자금 조달)
+
+* Private blockchains → **비즈니스 목적**
+
+ * Bussiness-business communication
+
+ * Duplicated data, processes, and reconciliation
+
+## Reference
+
+* [The Basics of Bitcoins and Blockchains](https://www.amazon.com/Basics-Bitcoins-Blockchains-Introduction-Cryptocurrencies/dp/1633538001)
+
+ * An Introduction to Cryptocurrencies and the Technology that Powers Them , Antony Lewis, 2018, Mango
+
+* [Blockchain and Distributed Ledgers](https://www.amazon.com/Blockchain-Distributed-Ledgers-Alexander-Lipton/dp/9811221510)
+
+ * Mathematics, Technology, and Economics, Alexander Lipton and Adrien Treccani, 2022, World Scientific Publishing
+
diff --git a/src/content/posts/EF-Introduction.md b/src/content/posts/EF-Introduction.md
new file mode 100644
index 00000000..6413c133
--- /dev/null
+++ b/src/content/posts/EF-Introduction.md
@@ -0,0 +1,74 @@
+---
+title: "0. 전자금융의 이해 과목 소개"
+date: 2022-04-20
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+# Electronic-Finance-School-of-Business-Administration
+
+* This repository covers digital currencies, blockchains, and related topics in the FinTech area.
+
+
+## Text book
+
+### Required Textbook
+
+* The Future of Finance: The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
+
+* Bitcoin, Blockchain, and Cryptoassets: A Comprehensive Introduction, Fabian Schär and Aleksander Berentsen, 2020, MIT Press
+
+* Machine Learning in Finance: From Theory to Practice, Matthew F. Dixon, Igor Halperin, Paul Bilokon, 2020, MIT Springer
+
+
+### Auxiliary Textbook
+
+* The Basics of Bitcoins and Blockchains: An Introduction to Cryptocurrencies and the Technology that Powers Them , Antony Lewis, 2018, Mango
+
+* Blockchain and Distributed Ledgers: Mathematics, Technology, and Economics, Alexander Lipton and Adrien Treccani, 2022, World Scientific Publishing
+
+* The Fintech Book:The Financial Technology Handbook for Investors, Entrepreneurs,
+ and Visionaries, Susanne Chishti and Janos Barberis, 2016, Wiley
+
+
+## Course Objective
+
+* The rapid acceleration of technology is enabling a fundamental reinvention of the structure of financial institution,
+while inventing the entrance of new competitors with the potential to upend the traditional order of industry.
+Artificial intelligence, big data, blockchain, and other new technologies have upended the global financial services sector, creating oppor- tunities for entrepreneurs and corporate innovators.
+This course covers digital currencies, blockchains, and related topics in the FinTech area.
+I hope students have global perspec- tives on technology-fueled transformations in financial services and their structure.
+
+
+## Lecture plan
+
+* 01. The Rise of Fintech
+
+ * [01. The Rise of Fintech : Drivers of the Fintech Revolution](https://devfancy.github.io/EF-The-Rise-Of-Fintech/)
+
+ * [01. The Rise of Fintech : Types of Fintech](https://devfancy.github.io/EF-The-Rise-Of-Fintech_2/)
+
+ * [01. The Rise of Fintech : Challenges Faced by Fintechs](https://devfancy.github.io/EF-The-Rise-Of-Fintech_3/)
+
+* [02. Incumbent Financial Institutions and Their Response to Fintechs](https://devfancy.github.io/EF-02-Incumbent-Financial-Institutions-and-Their-Response-to-Fintechs/)
+
+* [03. The Emergence of Techfin](https://devfancy.github.io/EF-03-The-Emergence-of-Techfin/)
+
+* [04. The Changing Structure of the Financial Ecosyste](https://devfancy.github.io/EF-04-The-Changing-Structure-of-the-Financial-Ecosystem/)
+
+* [05. Financial Innovation and Inclusion](https://devfancy.github.io/EF-05-Financial-Innovation-and-Inclusion/)
+
+* [06. Digital Money](https://devfancy.github.io/EF-06-Digital-Money/)
+
+* [07. Cryptography](https://devfancy.github.io/EF-07-Cryptography/)
+
+* [08. Cryptocurrencies](https://devfancy.github.io/EF-08-Cryptocurrencies/)
+
+* [09. Digital Tokens](https://devfancy.github.io/EF-09-Digital-Tokens/)
+
+* [10. Blockchain Technology](https://devfancy.github.io/EF-10-Blockchain-Technology/)
+
+
+> 2022년 1학기 전자금융의 이해 수업을 강의해주신 권준엽 교수님께 이 자리를 빌어 감사의 말씀을 드립니다.
\ No newline at end of file
diff --git a/src/content/posts/EF-The-Rise-Of-Fintech.md b/src/content/posts/EF-The-Rise-Of-Fintech.md
new file mode 100644
index 00000000..67b889ef
--- /dev/null
+++ b/src/content/posts/EF-The-Rise-Of-Fintech.md
@@ -0,0 +1,52 @@
+---
+title: "01. The Rise of Fintech : Drivers of the Fintech Revolution"
+date: 2022-04-21
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+
+# Drivers of the Fintech Revolution
+
+## Why is the fintech revolution happening now?
+
+1. a changing macroeconomic and regulatory environment
+2. the rapid evolution of technology
+3. shifting customer expectations
+
+* The three catalysts has forced incumbent financial institutions to re-evaluate the competitive threats they face.
+
+## 1. A Changing Economic/Regulatory Landscape
+
+After financial crisis in 2008, a number of economic and regulatory factors converged to facilitate the growth of fintech.
+
+* Regulators increased the regulatory burden on financial institutions.
+
+* Regulators also sought to encourage the emergence of nontraditional competition.
+
+* Extremely law interest rates.
+
+## 2. A Rapidly Evolving Technology Environment
+
+Financial institutions were among some of the earliest private sector entities to make significant investments in information technology.
+
+* They are deeply invested in inflexible systems that are often 40 or more years old.
+
+* Legacy systems made it difficult for them to keep pace with the exciting new opportunities presented by the rapid evolution of technology.
+
+## 3. Shifting Customer Expectations
+
+While banks struggled to prioritize resources for innovation, nonfinancial digital offerings were changing rapidly.
+
+* Technology companies conditioned consumers to expect digital services to be timely, personalized, and on-demand.
+
+* Younger customers have proven to be particularly frustrated with the banking experiences offered by incumbents.
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
\ No newline at end of file
diff --git a/src/content/posts/EF-The-Rise-Of-Fintech_2.md b/src/content/posts/EF-The-Rise-Of-Fintech_2.md
new file mode 100644
index 00000000..6d482c0a
--- /dev/null
+++ b/src/content/posts/EF-The-Rise-Of-Fintech_2.md
@@ -0,0 +1,374 @@
+---
+title: "01. The Rise of Fintech : Types of Fintech"
+date: 2022-04-21
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+
+# Types of Fintech
+
+Financial services make up a massive chunk of the global economy.
+
+* `payments`, `lending`, `wealth management`, `insurance`, and `banking` itself
+
+
+## Fintech and Payments
+
+* New payment form factors like QR codes, contactless credit cards, and mobile wallets are increasingly integrated into our daily lives.
+
+
+### Challenges in fintech payment business
+
+* “핀테크 payments 서비스가 고전하고 있는데 그 이유는 무엇인가” 에 대한 답변
+
+ * New technologies have also driven increased levels of competition for payment revenues. → 경쟁이 치열해지고 있다.
+
+ * There are regulation of payment transaction fees. → 결제 거래 수수료의 규제가 있다.
+
+ * The value of using payments service increases as the number of users increases (network effects). → 사용하고 있는 payment 서비스의 가치가 증가하고 있다.
+
+ * In the region where payments systems are relatively mature, customers are less eager to adopt technologies than their emerging counterparts. → payment 시스템이 상대적으로 성숙한 지역에서 고객들이 기술들을 채택하는 것을 신흥 상대보다 덜 열성적이다.
+
+
+### Payments 관련 기업 사례
+
+Q) 핀테크 payment 서비스에 대해 사례 1가지를 쓰고, 간단하게 그 서비스에 대한 특징을 소개하라.
+
+* Venmo (U.S.), PayMe (Hong Kong)
+
+ * integration with social network
+
+ * not charging customers a fee for transactions paid from the app’s wallet
+
+* Venmo (U.S.)
+
+ * Venmo lets you see what you friend are doing.
+
+ * Venmo creates a less awkward way for users to remind a friend that she owes you money.**
+
+* 전통적으로 국경을 넘어서면서 여러 규제들이 있어서 서비스가 복잡해졌는데, 그런 부분에 대해서 해결하는 과정에서 여러가지 핀테크 관련 서비스들이 생겼다.
+
+
+### Payments 단점
+
+* International transfers of funds remain remarkably frustrating and expensive for users.
+
+* The legacy system for the cross-border transfer of funds is complex and inefficient.
+
+* **그러한 단점을 보안한 기업 “Wise”**
+
+
+### Wise (기업 소개)
+
+(previously, TransferWise) in U.K. is an **example of a new entrant resolving in problems of international transfers.**
+
+* Wise bills as a peer-to-peer solution for international funds transfer that can deliver money quickly and with a flat transparent fee structure.
+
+* Suppose you live in the United Kingdom and want to send money to a friend who lives in France.
+
+ * You initiate a free domestic transfer of funds from your UK account to the
+ UK account of Wise. → UK 계좌안에서 거래하므로 수수료 무료
+
+ * It initiates a domestic transfer of funds from their French bank account to
+ your friend’s bank account. → French bank 안에서 이체
+
+ * It charges a transparent flat fee for the service and uses the mid-market
+ exchange rate. → 투명한 정액 요금을 부과
+
+ * Your money never actually crosses the border. → 국경을 넘지 x
+
+ * Wise needs to initiate international transfers via the legacy banking
+ systems on an occasional basis to rebalance accounts
+
+
+## Fintech and Lending
+
+* Peer-to-peer lending
+
+ * Sharing economy model ex) ABNB, UBER
+
+* Lending club (U.S.)
+
+ * Operates a peer-to-peer lending website for personal loans.
+
+### Pros and cons of fintech lending
+
+* Pros
+
+ * lower fixed cost (i.e., costs associated with branch network)
+
+ * faster service
+
+ * streamlined digital loan application service
+
+ * exploring mechanisms of credit evaluation mechanisms using social,
+ mobile, and bill payment data
+* Cons
+
+ * premium interest rate
+
+ * higher customer acquisition cost
+
+ * challenges in balancing the demand for loans and availability of capital
+ on platforms
+
+
+## Fintech and Wealth Management
+
+### Wealth Management이 성장하게 된 배경
+
+* [1] Our long-term goals form the center of our financial aspirations(재정적 열망)
+
+ * 40% 이상이 emergency expense로 \$400달러 인출할 돈이 없었다.
+
+ * 개인간의 자산관리의 상당한 지식의 갭차이가 존재했다.
+
+
+* [2] 정의된 contribution plan들에 대한 변화가 puts more responsibility on average savers.
+
+ * 미래소득에 대한 불확실성이 과거보다 커졌다.
+
+
+* [3] 소비자 평균의 financial literacy이 약하다.
+
+ * 평귱적으로, 미국인들은 basic financial literacy questions을 올바르게 대답하는 사람이 60%이하였다.
+
+ * 투자자들은 the spectrum of fees을 잘 알지 못하거나 the reasoning behind these added fees을 이해하지 못한다.
+
+
+* [4] 사람들은 복잡한 landscape of wealth management products를 그들의 장기적인 재정목표를 달성하기 위해 협상하는걸 도와주길 바란다.
+
+ * 전문가에게 기초적인 재정 계획을 얻는 것에 대한 수수료가 비싸다.(미국은 \$1,000 ~ \$3,000)
+
+ * 핀테크 투자자들은 질문에 대한 답을 얻기위해서 낮은 비용으로 “robo-advisor”을 활용한다.
+
+
+### Robo-advisor
+
+* `Robo-advisor` : a set of tools to help individuals manage their investment of wealth, by automating many of the basic activities
+
+* 유저의 금융 니즈들과 위험 선호들을 이해하도록 도와주고, 니즈에 적합한 금융 상품을 소개해준다.
+
+* 많은 로보어드바이저들이 세금 보고서, 세금 최적화 전략(양도세 완화행위 같은)을 자동화해준다.
+
+* 관련기업 - Wealthfront (U.S)
+
+ * 디지털 금융 계획 툴이 무료이다.
+
+ * 일상적인 tax-loss harvesting (양도세 완화 행위)
+
+## Fintech and Insurance
+
+**Q)** 서비스에 있어서 flexibility가 부족했다. 그 점을 극복하기 위해 insurance 사례를 간단하게 설명을 하여라
+
+**A)** Trov, Metromile 사례를 찾아서 쓴다.
+
+* Traditional insurance products are **reactive**, rather than proactive. ⇒ 사후적으로 처리한다.
+
+* 그러한 점을 극복하기 위해서, **Fintech** is going further by **introducing fundamentally new products.**
+
+ * `Trov(U.S)` - 여행하는 기간동안 ‘보험이 필요한 기간 혹은 시간동안’ 해당 보험을 가입하는 것.
+
+ * 고객의 니즈에 맞게 보험 정책들을 더 효율적으로 만들기 위해 방법들을 제공한다.
+
+ * `Metromile(U.S)` - 자동차 보험
+
+ * 이동거리에 비례해서 계산한다. (pay-per-mile)
+
+ * 전세계에 있는 보험 회사들에게 디지털 보험 플랫폼을 license해준다.
+
+* Insurance companies seek opportunities to be more proactive(사전적), offering insurance products that track policyholders’ risky behaviors(위험한 행동을 추적하는).
+
+ * Progressive(U.S)
+
+ * 운전자의 행동을 실시간으로 모니터링한다.
+
+ * Vitality(South Africa) - 건강, 보험
+
+ * 건강관리를 잘하면 인센티브를 준다
+
+ * 하지만, 조작하지 못하도록 어플을 이용해서 추적한다.
+
+* Insurtech companies are also working hard to make filing for claims faster and easier.
+
+ * Lemonade(U.S) - 보험회사(자산에 손실되는 보험)
+
+ * It offers renters’ insurance, homeowners’ insurance, car insurance, pet insurance and term life insurance.
+
+ * risk : 이용자에게 도덕적 해이 이슈를 불러일으킬 수 있다. ⇒ 보완) 남은 이익을 비영리단체에 기부함으로써 사기를 저지를 위험을 줄이고자 한다.
+
+
+## Fintech and Digital Banking
+
+* Banks would be the center of financial services
+
+* The **fintech revolution** should endeavor to disrupt the heart of banking itself.
+
+ * different names: virtual banks, digital banks, challenger banks, and neo-banks.
+
+* Banking innovator have tried to reinvent the banking experience, making it digitally native, data-driven(데이터 중심), and customer centric(유저중심).
+
+ * N26(Germany) == “Wise”
+
+ * Revolut(U.K) - 해외송금, 가상화폐 거래의 편의성
+
+ * 국제적인 돈 거래를 무료로 제공해준다.
+
+ * 모바일 앱으로 이용하기 쉽고 매력적으로 갖춰져있다.
+
+* 디지털 뱅킹 상품들의 채택비율이 인상적이지만, 고객들이 기존금융기관을 포기한다는 의미는 아니다.
+
+ * 대부분 유저들이 이러한 디지털 뱅킹서비스를 secondary account로써 사용을 한다.
+
+ * 유저들이 그들의 salaries deposited(급여계좌)을 neo-bank accounts(디지털뱅킹계좌)로 옮기는 것을 피한다
+
+ * ⇒ 디지털 은행이 기존 은행을 대체할 정도로 크지 못했다. (아직은 똑같이 평가받지 못한다)
+
+
+## Regtech: A Different Sort of Fintech Innovation
+
+* 2008년 금융위기 이후, 정부들은 **restructure their existing regulatory frameworks and introduce regulations.**
+
+ * new procedures for the Federal Reserve to inject liquidity into the system
+
+ * the ability for the government to infuse capital into troubled companies
+
+ * rescue plans to manage state-backed mortgage conglomerates Fannie Mae and Freddie Mac
+
+ * initiation of tougher bank stress-tests (얼마나 잘 버틸 수 있을지)
+
+ * new management methods for the resolution of distressed financial institutions
+
+* 새로운 규제들을 대처하기 위해 비용이 늘어나고 있다. (hiring consultants or adding heacount)
+
+* **Compliance cost : all the expenses that a firm incurs to adhere to industry regulations.**
+
+ * 이러한 비용들은 더 작은 금융기관일수록 치명타를 입게 된다.
+
+* **Anti-money laundering (AML): regulations and procedures intended to prevent criminals from disguising illegal funds as legitimate income**
+
+ * Q) 기존 금융기관에 AML과 관련된 규제를 지키는 것이 왜 어려운가 ?
+
+ * A) 아래 두가지
+
+ * [1] In some circumstance, **the false positive rate** for transactions **can exceed
+ 90%.**
+
+ * [2] Global money laundering transactions are estimated to total \$1–2 trillion
+ dollars a year, with **less than 1%** seized by authorities.
+
+* **Regtech**: the use of new technology to solve compliance burdens more effectively and efficiently**
+
+ * Regtech providers offer solutions across many different use cases.
+
+ * 관련회사) `Tookitaki` (Singapore-based startup)
+
+ * It provides solutions to banks to detect and prevent money laundering activities in banks’ systems.
+
+ * Machine learning solution
+
+* **How is regtech different from fintech (핀테크와 다른 점)**
+
+ * [1] Business-to-business sales model
+
+ * [2] No licensing required
+
+ * [3] Cooperation between financial institutions
+
+ * [4] Lengthier sales cycles
+
+ * [5] Regulator’s support
+
+ * [6] Fragmented regulatory environment
+
+
+### Regtech가 성공하기 힘든이유
+
+* 기존 금융 기관의 procurement 와 partnership teams과 함께 일하는 것이 어렵다 → 새로운 시스템을 도입하기 쉽지 않음
+
+* 많은 regtech startup이 인수되어버린다.
+
+* 큰 IT 기업들이 그들 자신의 해결책을 제공한다.
+
+
+## Challenges Faced by Fintechs
+
+### 핀테크가 직면한 과제들
+
+#### Access to Talent
+
+* 좋은 인력을 확보하기 어려운 측면이 있다.
+
+ * Achieving this ‘edge’ requires the right people with necessary skills to make a founder’s vision a reality.
+
+ * a new
+
+ * more intuitive customer experience
+
+ * designing a machine learning-enabled regetch systemm
+
+* 이러한 스킬들은 현재의 job market에 데려오기 쉽지 않다.
+
+ * 인재부족
+
+ * 고육과정이 많지 않을뿐더러, 딜레이가 종종 발생한다.
+
+ * 기존 대기업과도 경쟁해야 한다.
+
+#### Regulatory Compliance(규제 관련 이슈)
+
+* Regulatory regimes in many jurisdictions have become markedly more open to fintech innovators.
+
+* **Regulatory sandbox**
+
+ * kor) 규제당국으로부터 감시는 받지만 기존의 규제 제약을 받지 않고 자유롭게 여러 실험들을 도와주는 프레임 워크(장치)
+
+* 규제장벽이 높다. (The regulatory barriers to entry remain particularly high)
+
+ * 규제가 복잡하고 변하기도 하고 지역마다 다르기도 해서 규제를 준수하는 것이 핀테크 입장에서 도전과제가 될 수 있다.
+
+#### Scaling the Customer Base
+
+* 금융위기 이후 기존 금융기관에 대한 고객들의 불신이 증가되었다.
+
+* 이러한 관심이 반드시 고객의 신뢰와 일치하는 것은 아니다.
+
+ * 핀테크를 금융서비스의 중심이라 생각하지 않는다는 얘기이다.
+
+* A number of celebrated fintech unicorns have been able to rapidly acquire a **significant user base.**
+
+* **B2C, B2B의 차이점**
+
+* B2C fintech business model
+
+ * 이러한 비즈니스 모델은 수익성을 얻기위해 **엄청난 고객 기반을 만드는 것이 요구된다.**
+
+ * 이것을 달성하기 위해 요구된 **마케팅 비용이 매우 크다.**
+
+* B2B fintech business model
+
+ * B2B 스타트업들은 **큰 기업들에게 핀테크 솔류션을 제공한다.**
+
+ * 이러한 클라이언트를 확보하는 것은 **비용과 시간이 많이 소요될 수 있다.**
+
+#### Raising Capital
+
+* 핀테크의 높은 규제 요구조건들이 상품 출시의 복잡성을 증가시킨다.
+
+ * 디지털 서비스의 많은 영역에서 기업은 버그가 있는 초기 단계 제품을 출시하고 나중에 사용자 피드백을 통해 제품을 더욱 개선할 수 있습니다.
+
+ * For most fintech, **it is impossible.**
+
+ * 다 만들어진 상품을 검증받기 때문에, 중간마다 투자받기 어렵다
+
+ * 새로운 버전이 나올때마다 계속 검증 및 심사를 받아야한다.
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
\ No newline at end of file
diff --git a/src/content/posts/EF-The-Rise-Of-Fintech_3.md b/src/content/posts/EF-The-Rise-Of-Fintech_3.md
new file mode 100644
index 00000000..535a0cb0
--- /dev/null
+++ b/src/content/posts/EF-The-Rise-Of-Fintech_3.md
@@ -0,0 +1,88 @@
+---
+title: "01. The Rise of Fintech : Challenges Faced by Fintechs"
+date: 2022-04-22
+categories: ["대학교"]
+tags: ["전자금융"]
+---
+
+> 이 카테고리는 경영학부 전자금융의 이해 수업을 듣고 정리한 내용을 바탕으로 글을 작성하였습니다.
+
+
+# Challenges Faced by Fintechs
+
+## 핀테크가 직면한 과제들
+
+### Access to Talent
+
+* 좋은 인력을 확보하기 어려운 측면이 있다.
+
+ * Achieving this ‘edge’ requires the right people with necessary skills to make a founder’s vision a reality.
+
+ * a new
+
+ * more intuitive customer experience
+
+ * designing a machine learning-enabled regetch systemm
+
+* 이러한 스킬들은 현재의 job market에 데려오기 쉽지 않다.
+
+ * 인재부족
+
+ * 고육과정이 많지 않을뿐더러, 딜레이가 종종 발생한다.
+
+ * 기존 대기업과도 경쟁해야 한다.
+
+### Regulatory Compliance(규제 관련 이슈)
+
+* Regulatory regimes in many jurisdictions have become markedly more open to fintech innovators.
+
+* **Regulatory sandbox**
+
+ * kor) 규제당국으로부터 감시는 받지만 기존의 규제 제약을 받지 않고 자유롭게 여러 실험들을 도와주는 프레임 워크(장치)
+
+* 규제장벽이 높다. (The regulatory barriers to entry remain particularly high)
+
+ * 규제가 복잡하고 변하기도 하고 지역마다 다르기도 해서 규제를 준수하는 것이 핀테크 입장에서 도전과제가 될 수 있다.
+
+### Scaling the Customer Base
+
+* 금융위기 이후 기존 금융기관에 대한 고객들의 불신이 증가되었다.
+
+* 이러한 관심이 반드시 고객의 신뢰와 일치하는 것은 아니다.
+
+ * 핀테크를 금융서비스의 중심이라 생각하지 않는다는 얘기이다.
+
+* A number of celebrated fintech unicorns have been able to rapidly acquire a **significant user base.**
+
+#### B2C, B2B의 차이점
+
+* B2C fintech business model
+
+ * 이러한 비즈니스 모델은 수익성을 얻기위해 **엄청난 고객 기반을 만드는 것이 요구된다.**
+
+ * 이것을 달성하기 위해 요구된 **마케팅 비용이 매우 크다.**
+
+* B2B fintech business model
+
+ * B2B 스타트업들은 **큰 기업들에게 핀테크 솔류션을 제공한다.**
+
+ * 이러한 클라이언트를 확보하는 것은 **비용과 시간이 많이 소요될 수 있다.**
+
+### Raising Capital
+
+* 핀테크의 높은 규제 요구조건들이 상품 출시의 복잡성을 증가시킨다.
+
+ * 디지털 서비스의 많은 영역에서 기업은 버그가 있는 초기 단계 제품을 출시하고 나중에 사용자 피드백을 통해 제품을 더욱 개선할 수 있습니다.
+
+ * For most fintech, **it is impossible.**
+
+ * 다 만들어진 상품을 검증받기 때문에, 중간마다 투자받기 어렵다
+
+ * 새로운 버전이 나올때마다 계속 검증 및 심사를 받아야한다.
+
+
+## Reference
+
+* [The Future of Finance](https://link.springer.com/book/10.1007/978-3-030-14533-0)
+
+ * The Impact of Fintech, AI, and Crypto on Financial Services, Henry Arslanian and Fabrice Fischer, 2019, Springer
diff --git a/src/content/posts/ETC-Chrome-Bookmark.md b/src/content/posts/ETC-Chrome-Bookmark.md
new file mode 100644
index 00000000..16e8aec0
--- /dev/null
+++ b/src/content/posts/ETC-Chrome-Bookmark.md
@@ -0,0 +1,30 @@
+---
+title: "크롬 북마크에 있는 파비콘이 제대로 안보이는 경우"
+date: 2023-01-27
+categories: ["기타"]
+tags: ["블로그"]
+---
+
+* Macbook에서 최신버전으로 업데이트를 한 이후에 크롬을 들어가봤더니 다음과 같이 파비콘이 제대로 인식을 못하는 경우가 발생했다.
+
+
+
+* 여러 설정들을 봐도 간단하고 쉽게 해결방안을 찾지 못했다.
+
+* 어쩔 수 없이 노가다 전략으로 해당 문제를 해결했다.
+
+
+
+* [1] `북마크 폴더`에서 마우스 오른쪽 버튼 -> `북마크 관리자`를 클릭한다.
+
+
+
+* [2] 원하는 폴더를 지정해서 마우스 오른쪽 버튼 -> `모두 열기` / `새 창에서 모두 열기` / `시크릿 창에서 모두 열기` 중 원하는 것을 클릭한다.
+
+
+
+* [3] 새로고침을 하고 나면, 이제는 북마크에 있는 파비콘이 제대로 보이게 된다. (`guest-book-homepage`는 파비콘이 원래부터 없었기 때문에 기본 상태로 같다)
+
+*
+
+* 이 방법보다 더 좋은 방법이 있으면 추가적으로 업로드를 하자.
\ No newline at end of file
diff --git a/src/content/posts/ETC-Liquid-syntax-error.md b/src/content/posts/ETC-Liquid-syntax-error.md
new file mode 100644
index 00000000..3c7d34b6
--- /dev/null
+++ b/src/content/posts/ETC-Liquid-syntax-error.md
@@ -0,0 +1,29 @@
+---
+title: "[Jekyll] 에서 Liquid syntax error 처리하는 방법"
+date: 2023-02-10
+categories: ["기타"]
+tags: ["블로그"]
+---
+
+알고리즘 문제를 풀고 업로드를 하는데, `{{` 또는 `}}`를 사용하면 다음과 같은 에러를 발생시킨다.
+
+
+
+에러가 발생하는 동시에 build에서 `X` 표시가 나와서 업로드가 제대로 되지 않는다.
+
+
+
+해결 방안은 **중괄호가 시작하기 전에 raw와 끝날 때 endraw를 추가**하면 된다.
+
+그리고 다시 commit 하고 push하면 정상적으로 통과되는 것을 확인할 수 있다.
+
+
+
+참고로 raw 부분과 endraw를 오타없이 제대로 입력했다면 실제 페이지에서 안나오는 것도 확인할 수 있다.
+
+
+
+
+## Reference
+
+* [[Github블로그/Jekyll] Liquid Exception: Liquid syntax error 해결](https://iamheesoo.github.io/blog/gitblog-sol-jekyll02)
\ No newline at end of file
diff --git a/src/content/posts/ETC-Sipethon-Slackbot.md b/src/content/posts/ETC-Sipethon-Slackbot.md
new file mode 100644
index 00000000..fe01ca0f
--- /dev/null
+++ b/src/content/posts/ETC-Sipethon-Slackbot.md
@@ -0,0 +1,175 @@
+---
+title: "SIPE 커뮤니티를 위한 슬랙 봇 만들기 (feat. 사이프톤)"
+date: 2025-01-19
+categories: ["프로젝트"]
+tags: ["사이드프로젝트"]
+---
+
+## Prologue
+
+[SIPE](https://sipe.team/)는 개발자들이 함께 교류하며 성장하는 IT 커뮤니티입니다.
+이곳에서는 다양한 활동이 이루어지며, 그중 하나인 `사이프톤`은 **SIPE 구성원들과 외부 참여자가 하루 동안 함께 진행하는 해커톤**입니다.
+
+저는 이번 SIPE 3기의 사이프톤에서 커뮤니티에 작은 기여를 하고자 `슬랙봇` 개발을 주제로 참여하게 되었습니다.
+이번 글에서는 슬랙봇을 개발하게 된 이유와 진행 과정, 그리고 사이프톤을 마치고 난 느낌을 기록하고자 이 글을 작성하게 되었습니다.
+
+
+---
+
+## 슬랙봇을 만드게 된 이유
+
+SIPE 3기 활동에서는 6주 단위로 진행되는 1차 및 2차 미션이 있으며, 2주마다 오프라인 모임도 진행됩니다.
+현재 SIPE에서는 미션 공지, 아이디어 발제, 진행 과정 및 제출, 결과 확인 등의 모든 과정을 슬랙 채널 메시지와 구글폼을 통해 이루어지고 있으며,
+오프라인 모임에서는 `출석체크`를 운영진이 액셀 시트에 수작업으로 기록하고 관리하고 있습니다.
+
+하지만 이런 방식에는 몇 가지 아쉬운 점이 있었습니다.
+
+`미션`과 관련해서는 참가자들이 슬랙 채널의 메시지를 일일이 스크롤하며 필요한 정보를 찾아야 하는 번거로움이 있었고,
+슬랙의 무료 요금제 제한으로 3개월이 지나면 과거 메시지를 확인할 수 없는 문제도 있었습니다.
+
+
+
+`오프라인 모임`에서는 운영진이 출석 정보를 수동으로 정리하는 데 반복적으로 많은 시간과 비용이 소요되어,
+이를 조금이라도 덜어드리고 싶다는 마음이 들었습니다.
+
+
+
+이러한 **불편함과 비효율적인 부분을 개선**하기 위해 **슬랙봇을 개발하여 미션과 출석체크 과정을 간소화하고 자동화**하고자 했습니다.
+이를 통해 SIPE 커뮤니티 활동을 더욱 효율적이고 편리하게 만들고자 하는 마음으로, 사이프톤에 해당 아이디어를 발제하게 되었습니다.
+
+## 팀 빌딩
+
+저는 슬랙봇을 개발해본 경험이 없었기 때문에, 디자이너와 프론트엔드가 있으면 좋겠다고 싶어서 모집할 때에는 디자이너 1명, 프론트엔드 1명, 백엔드 2명으로 모집 인원을 구성했습니다.
+
+(아래는 사이프톤에 발제했던 아이디어 목록의 초기 화면입니다. 진행 중 아이디어가 일부 수정되어 초기 내용과 다를 수 있습니다)
+
+
+
+하지만 슬랙봇 관련 공식 문서를 살펴보니, 슬랙에서 제공하는 가이드라인이 잘 정리되어 있었고, 디자인 작업이 크게 필요하지 않을 것으로 판단되었습니다.
+그 과정에서 제 아이디어에 관심을 보여주신 분들이 예상보다 많아졌고, 결과적으로 **프론트엔드 2명, 백엔드 3명으로 총 5명**의 팀이 꾸려졌습니다.
+
+사이프톤은 **1월 18일 토요일에 진행**되었으며, 그 전에 팀원들과 온라인 회의를 통해 주제를 구체화하고 역할을 나누는 시간을 가졌습니다.
+또한 사이프톤 당일까지 각자가 공부하고 준비해야 할 부분에 대해 논의했습니다
+
+
+
+기존 아이디어 외에 추가된 기능으로는 `뒷풀이` 기능이 있었습니다.
+SIPE는 오프라인 모임 이후 뒷풀이가 거의 필수적으로 이어지는데, 매번 슬랙 채널에 관련 메시지가 쌓이는 상황이 반복되었습니다.
+이를 개선하기 위해 뒷풀이 관리 기능을 추가하면 좋겠다는 의견이 나왔고, 최종적으로 반영하게 되었습니다.
+
+사이프톤 전부터 팀원들은 열정적으로 참여해주셨고, 각자 필요한 부분을 사전에 공부하고 준비해왔습니다.
+덕분에 저도 큰 자극을 받았고, 더 열심히 노력해야겠다는 다짐을 하게 되었습니다. 아래는 기능 중 하나인 `미션`에 대해 피그마로 간단히 그린 사진입니다. (HJ님 감사합니다 👏)
+
+
+
+## 진행 과정 및 결과
+
+
+
+사이프톤 당일, 저희는 `엘리스Lab 성수점`에서 오전 8시 30분부터 오후 10시 30분까지 개발과 발표를 진행했습니다.
+
+이곳에서 작업하는 것은 처음이었는데, 깔끔한 환경과 편안한 책상과 의자가 해커톤에 최적화된 장소라는 생각이 들었습니다.
+또한 운영진 및 TF 분들께서 과자, 음료수, 저녁 식사까지 준비해주신 덕분에 더 편안하게 집중할 수 있었습니다. 정말 고생많으셨고 감사했습니다. 👏👏
+
+### 팀 구성과 역할 분담
+
+우리 팀명은 **헬핑(Helping)** 으로, 도움을 주는 봇이라는 의미와 "사랑의 하츄핑"에서 영감을 받아 이름을 지었습니다.
+
+팀이 구현해야 할 주요 기능은 **미션 관리, 출석체크, 뒷풀이**로 나뉘었으며, 이를 슬랙 공식문서를 참고하여 구체적으로 설계하기로 했습니다.
+
+다행히 슬랙의 [개발자 도구](https://tools.slack.dev/) 가 Java, JavaScript, Python 등 다양한 언어를 지원했기 때문에 팀원들이 각자 익숙한 언어를 활용할 수 있었습니다.
+
+* 프론트엔드: 미션 관리 - JavaScript
+
+* 백엔드: 출석체크, 뒷풀이 - Java
+
+사이프톤의 특성상, 당일 안에 개발부터 발표까지 모두 준비해야 했기 때문에 시간이 매우 제한적이었습니다.
+게다가 팀원 모두가 슬랙봇 개발 경험이 없었기에, 완벽한 구현보다는 **필수 기능을 중심으로 작업을 점진적으로 확장**해 나가기로 했습니다.
+작업 중에 기획이나 기술적인 문제로 도움이 필요한 경우에는 서로 적극적으로 협력하기로 했습니다.
+
+### 기술 선택과 개발 방식
+
+슬랙봇 개발 경험이 처음이었지만, 참고 자료와 공식 문서가 큰 도움이 되었습니다.
+특히 인프런의 [커뮤니티에서 바로 써먹는 슬랙 봇 만들기](https://www.inflearn.com/course/커뮤니티-슬랙-봇-만들기) 강의를 활용하여 슬랙 설정과 기본적인 기능 구현 방법을 학습했습니다.
+해당 강의는 Python 기반이지만, 슬랙 공식 문서에서 Java와 JavaScript 관련 설명도 잘 제공되었기에 팀원들이 각자 익숙한 언어로 개발을 진행할 수 있었습니다.
+
+슬랙봇 개발에는 `Socket Mode`와 `HTTP 엔드포인트` 방식이 있는데, 저희는 Socket Mode를 선택했습니다. 이유를 정리하면 아래와 같습니다.
+
+* 웹 소켓을 통해 슬랙 서버와 직접 연결하여 실시간으로 이벤트를 수신할 수 있습니다.
+
+* HTTP 설정이 필요 없어 간편하고, 코드를 실행만 하면 어디서든 바로 동작합니다.
+
+* 그렇기 때문에, Spring Boot 프레임 워크 없이 순수 Java 언어로 개발할 수 있어서 관리해야할 요소가 줄어듭니다.
+
+* 단, 봇을 외부에 공개 배포하는 경우에는 부적합하기 때문에, 추후 HTTP 엔드포인트로 변경해야 하는 점이 있습니다.
+
+이번 사이프톤에서는 제한된 시간과 팀원들의 경험을 고려해 `Socket Mode`로 진행했고, 이후 운영진이 슬랙봇을 실제로 사용하게 된다면 `HTTP 엔드포인트` 방식으로 전환하기로 결정했습니다.
+
+### 진행 결과
+
+오전 8시 30분에 시작해 오후 6시까지 구현해야 할 기능을 모두 완성했습니다.
+그 후, 오후 8시 30분까지는 기획의 세부적인 부분과 예외 처리를 개선했고, 마지막 30분 동안 발표 자료를 준비했습니다.
+
+개발 목표를 모두 달성한 점이 뿌듯했고, 팀원들 모두 긴 시간 동안 페이스를 유지하며 집중해서 작업에 임해준 덕분에 성공적으로 마무리할 수 있었습니다.
+(우리팀 모두 하루 동안 정말 고생 많으셨어요. 😌)
+
+발표는 3분이라는 제한 시간 안에 최대한 깔끔하게 진행하려고 노력했으며, 약간의 재미 요소도 추가해 보았습니다. 하지만 역시 발표는 매번 쉽지 않다고 느꼈습니다.
+
+
+
+> 구현 결과물
+
+* `미션 관리`: 슬랙에서 미션 공지, 진행 상태 확인, 결과 제출 등의 기능을 자동화.
+
+
+
+* `출석체크`: 오프라인 모임에서의 출석 정보를 간편하게 기록 및 관리.
+
+
+
+* `뒷풀이`: 뒷풀이 참여 여부를 슬랙 메시지에서 바로 처리 가능.
+
+
+
+더 자세한 시연 영상 및 발표 자료는 [Github 링크](https://github.com/sipe-team/sipethon-3_3_helpingbot) 에서 확인하실 수 있습니다.
+해당 `README.md` 파일에는 구현한 기능의 시연 영상과 관련 코드가 포함되어 있으니 참고 부탁드립니다. (시간 제약 속에서 빠르게 작업한 만큼, 코드의 완성도를 높일 여지가 있습니다)
+
+발표가 끝난 후 다른 팀들의 결과물을 보며 많은 걸 느꼈습니다.
+특히 디자이너가 포함된 팀의 결과물이 돋보였는데, 하루 만에 나온 결과물이라고 믿기 어려울 정도로 퀄리티가 좋았습니다.
+예상대로 그 팀이 우수상을 받게 되었고, 저희도 다음에는 더 세밀하고 완성도 높은 결과물을 만들어보고 싶다는 다짐을 하게 되었습니다.
+
+## 사이프톤 후기
+
+사이프톤을 진행하면서 운영진과 TF 분들이 준비해주신 스트레칭 시간, 퀴즈 타임, 그리고 무료 저녁 식사가 있었습니다.
+참여자가 대략 50명 정도였는데, 다 같이 스트레칭을 하는 모습이 저에겐 신선하면서도 재밌었고 덕분에 스트레칭을 해서 몸도 조금 뻐근했던 부분이 풀렸습니다.
+
+저녁 전에 진행된 퀴즈 타임도 머리를 식히면서 리프레시할 수 있는 시간이 되어 좋았습니다. 덕분에 긴 시간 동안 집중해서 참여할 수 있었던 것 같습니다.
+저녁 식사는 크라이치즈버거였는데, 크라이치즈버거 측 직원분들이 직접 작성해준 메시지와 함께 음식을 제공해주셨던 점이 기억에 남습니다.
+저녁 식사 때가 사이프톤 막바지에 접어들 즈음이었고 아직 해야할 부분이 남아있기 때문에 식사와 작업을 동시에 했던 상황이, 지금 생각해 보면 웃기기도 하고 약간 슬프기도 했습니다.
+
+
+
+마지막으로, 사이프톤을 기획하시고 당일 늦은 시간까지 세심하게 챙겨주신 운영진과 TF 분들께 진심으로 감사드립니다.
+덕분에 하루 동안 정말 즐겁고 보람찬 시간을 보낼 수 있었습니다. 정말 고생 많으셨습니다! 😊
+
+## 슬랙봇에 대한 아쉬운 점과 개선할 점
+
+사이프톤 당일에는 제한된 시간 내에 기능 구현에 집중하다 보니, 코드의 퀄리티를 충분히 신경 쓰지 못한 점이 아쉽습니다.
+코드 퀄리티와 예외 처리를 조금 더 다듬을 여지가 있었다고 느꼈습니다.
+
+또한, 작업을 로컬 환경에서만 진행한 점도 아쉬운 부분 중 하나입니다. 외부에 공개 배포하기에는 부적합하므로, **추후 HTTP 엔드포인트 방식으로 전환할 계획**입니다.
+만약 **SIPE 운영진 분들께서 해당 슬랙봇을 실제로 사용해보고 싶다는 제안을 주신다면**, 헬핑팀과 다시 논의하여 어떻게 발전시킬지 고민해볼 생각입니다.
+
+현재는 미션 관리, 출석체크, 뒷풀이라는 세 가지 기능을 구현했지만, 앞으로 SIPE 커뮤니티 활동에 필요한 자동화 기능이 있다면 이를 추가 개발해보고 싶습니다.
+
+**더 나은 슬랙봇을 만들기 위한 좋은 아이디어가 있다면, 언제든 SIPE 커뮤니티 슬랙 채널이나 운영진 분들께 공유해 주시면 감사하겠습니다!**
+
+함께 발전시키며 더 나은 슬랙봇을 만들어 가는 것도 흥미로운 도전이 될 것 같습니다.
+
+## Reference
+
+* [[공식문서] slack-developer-tools](https://tools.slack.dev/)
+
+* [[공식문서] slack api](https://api.slack.com/docs)
+
+* [인프런 강의(무료): 커뮤니티에서 바로 써먹는 슬랙 봇 만들기](https://www.inflearn.com/course/커뮤니티-슬랙-봇-만들기)
\ No newline at end of file
diff --git a/src/content/posts/ETC-Why-Did-You-Select-The-Developer.md b/src/content/posts/ETC-Why-Did-You-Select-The-Developer.md
new file mode 100644
index 00000000..09ce7780
--- /dev/null
+++ b/src/content/posts/ETC-Why-Did-You-Select-The-Developer.md
@@ -0,0 +1,70 @@
+---
+title: "왜 개발자를 선택했는가"
+date: 2023-01-29
+categories: ["기타"]
+tags: ["커리어"]
+---
+
+## Prologue
+
+* 이 글은 필자의 개인적인 의견이 담겨 있습니다.
+
+* 이 글에 대해 공감하거나 다른 생각이 있으시면 댓글로 의견을 남겨주시면 감사하겠습니다.
+
+* 그럼 개발자에 대한 저의 생각을 간략하게 말씀드리겠습니다.
+
+
+## 개발자라는 직업을 선택한 이유
+
+* 내가 개발자의 직업을 선택한 이유는 **끊임없이 자신을 성장시킬 수 있는 직업** 중 하나였고,
+
+ 우리의 삶에서 필요한 서비스를 직접 개발한 것을 누군가가 사용함으로써 행복을 전해줄 수 있는 뿌듯함이 나에게 맞았다.
+
+* 그리고 무엇보다 **개발 실력을 계속 디벨롭 한다면, 시장이 나에 대한 가치를 높여줄 것**이라 생각했다.
+
+
+## 개발할 때 가장 중요한 부분
+
+* 개발할 때 가장 중요한 부분은 `왜?` 라는 질문을 항상 가져야 한다고 생각한다.
+
+* **내가 그 이유를 알아야 일의 동기부여**가 되기 때문이다.
+
+* 이 이유가 없이 개발만 한다면, 어느 순간에 `내가 이걸 왜 개발하고 있지?` 라는 생각과 번아웃이 찾아올지도 모른다.
+
+
+## 서버 개발자(백엔드)에게 필요한 지식 및 경험은 무엇인가요?
+
+* 일단 기본적으로 **알고리즘 구현 실력**이다. 이는 백엔드 개발자 뿐만 아니라 모든 개발자가 갖춰야 할 역량이라고 본다.
+
+ 적어도 프로그래머스에 나와 있는 Lv3를 풀 수 있는 능력을 갖춰야 기업에서 나오는 코딩테스트를 무난하게 통과한다고 생각한다.
+
+* 두 번째로 **CS 관련 기본기**이다. 여기서 말하는 CS란 Computer Science의 약자로 컴퓨터와 관련된 학문적 지식을 의미한다.
+
+ 내가 생각하는 CS 과목은 자료구조 & 알고리즘, 운영체제, 네트워크, 데이터베이스이고, 추가적으로는 컴퓨터구조, 시스템이라고 생각한다.
+
+* 세 번째로 **프로젝트 경험**과 **기술스택 & 인프라**다.
+
+ 제대로 된 프로젝트 경험을 최소 2개 이상 갖춰야, 나중에 자소서 작성 및 면접에서 본인의 경험을 구체적이고 명확하게 전달한다면, 면접관분들이 좋게 봐주실 거라고 본다.
+
+ 기술스택 & 인프라 같은 경우는 회사마다 다르기 때문에, 꼭 본인이 가고자 하는 회사의 채용공고를 확인해야 한다.
+
+ 예로 들자면, 카카오뱅크의 `서버 엔지니어`는 JDK 1.8+, Kotlin, Java를 활용 중이며, DB는 서비스 특성에 따라 Oracle, MySQL, Postgre 등 다양하게 사용 중이다.
+
+ `시스템 엔지니어`는 Linux, HCI, Docker, Kubernetes, Terraform 등을 활용하고 있다.
+
+ 일부 운영성 업무를 수행하는 팀은 node.js를 활용하기도 하지만, **대용량 서비스를 안정적으로 제공**하기 위해선 JVM 기반 에코시스템이 보다 효과적이기에 **Java**를 주로 활용하고 있다.
+
+* 필자는 이 세 가지를 완벽하게 갖추지 못했기 때문에, 꾸준히 공부를 하고 있는 중이다.
+
+
+## 앞으로 어떤 개발자가 되고 싶나요?
+
+* 남들에게 인정받는 **쓸모 있는 개발자**가 되고 싶다.
+
+* 그리고 나의 지식과 경험을 동료에게 혹은 제3자에게 공유하면서, 도움이 된다면 엄청 뿌듯한 기분이 들 것 같다.
+
+* 그러기 위해서는 항상 개발에 대한 실력을 높이도록 열심히 성장할 것이다.
+
+* 10년 후에는 구성원들이 일을 효율적으로 할 수 있도록 시스템을 잘 갖추도록 노력할 것이고,
+
+ 개인적인 면에서는 백엔드 개발자의 역량뿐만 아니라 다른 개발 역량도 우수한 실력을 갖추는 것이다.
\ No newline at end of file
diff --git a/src/content/posts/Geultto-9th-Retrospective.md b/src/content/posts/Geultto-9th-Retrospective.md
new file mode 100644
index 00000000..44d39817
--- /dev/null
+++ b/src/content/posts/Geultto-9th-Retrospective.md
@@ -0,0 +1,113 @@
+---
+title: "글또 9기 회고. 5개월간 활동한 여정"
+date: 2024-05-01
+categories: ["회고"]
+tags: ["글또"]
+---
+
+글또는 **글 쓰는 개발자 모임**이며, 이번 9기에 활동했던 인원은 약 450명일 정도로 다양한 개발자 모임들 중에 큰 규모로 운영중인 모임이지 않을까 싶어요.
+
+글또의 비전이 **글을 작성하는 개발 직군분들이 모여서, 좋은 영향을 주고 서로 같이 자랄 수 있는 커뮤니티**인 만큼 저도 이번 9기에 참여하면서 정말로 다양한 경험과 배움을 얻었어요.
+
+
+
+---
+
+## 글또에 참가한 배경
+
+글또에 알기 전에는 그동안 혼자서 공부한 것들을 제 개인 기술 블로그에 정리하면서 지냈던 것 같아요.
+
+그렇게 약 2년이 지났을 때쯤, 2023년 11월부터는 서서히 제 글 쓰는 능력에 대한 부족함을 느꼈고, 그러한 점들을 어떻게 하면 개선해 나갈 수 있을까를 고민하던 찰나에, 어떤 개인 기술 블로그에 나와있는 내용을 통해 글또를 알게 되었어요.
+
+운이 좋게도 저의 지원서를 좋게 봐주셔서 9기에 활동할 수 있게 되었고, 그렇게 2023년 12월부터 4월까지 5개월간 참여하게 되면서 제가 느꼈던 점들을 하나씩 정리해보려고 해요.
+
+글또에 대한 궁금한 점들은 [글또 소개](https://geultto.github.io/docs/intro) 페이지에서 확인해주시면 될 것 같아요 ! (기존에는 `Notion`으로 되어져있었는데, 이번 9기에서 글또 운영진분들의 열정과 노력 덕분에 `홈페이지`로 개선되었어요)
+
+
+
+## 글또 활동
+
+### 글 제출 내역
+
+글또를 5개월간 활동하면서, 필수적으로 지켜야 할 점은 2주에 1개의 글을 작성한 뒤에 슬랙을 통해 글을 제출하는 형식이었어요.
+
+글또를 막 시작했을 12월에는 '2주에 한번 글을 쓰고 제출하는 거면 충분히 할 수 있겠네 !' 라고 다짐했었는데, 글또 9기를 활동하는 중간에 스타트업 회사로 옮기면서, 그 다짐을 지키지 못했어요 🥲.
+
+
+
+그래서 **총 10회 차에 7번 제출, 2번 패스를 사용**했고, 마지막 주차에는 제출하지 못했어요.
+
+지금 돌이켜 생각해보니, 제출하는 글 내용에 대한 퀄리티에 제 스스로 너무 생각을 많이 했던 것 같아요.
+
+초반에 3개월 동안(2023.12 ~ 2024.02)은 글 하나를 작성하는데 평균 10-12시간 정도 걸렸던 것 같아요. (예시 [[2023년 회고] 다양한 활동으로 가득한 특별한 한 해](https://devfancy.github.io/2023-Retrospective/#comments) - 글 작성하는데 걸린 시간: 11H)
+후반(나머지 2개월)에는 새로운 회사에 대한 적응하는 것과 글 쓰는 것에 대한 부담감, 그 외에 다른 여러 가지 일들로 인해 글 제출을 많이 못했어요.
+
+이미 지나가버린 과거이지만, 다음에는 적당한 분량과 시간을 조절하면서 글을 작성하려고 해요 ✨.
+무엇보다도 퀄리티에 신경써서 제출을 아예 안하는 것보다 조금이라도 작성해서 제출하는게 더 낫다는게 제 생각이에요.
+
+### 내가 활동한 것들
+
+글또에는 글 작성하는 게 필수이지만, 그 외에 다양한 활동은 본인의 의지로 할 수 있어요!
+
+대표적으로 저는 아래와 같은 활동들을 했어요.
+
+- `백엔드/인프라 빌리지 반상회`에 준비위원회로 참여 - '글또' 키캡 제작, 음식 선정 및 주문
+- `커피챗` - (온/오프라인) 총 **`4`** 번 참여
+- 그 외 다양한 채널에 참여
+ - `모닝또` - 기상 시간과 함께 오늘 할일을 공유하는 채널
+ - `몸또` - 운동과 관련된 걸 기록하고 공유하는 채널
+ - `커또` - 커피를 좋아하는 사람들이 모여서 카페 추천이나 커피 원두를 공유하는 채널
+ - `월간-메이커스` - 한달 동안 1인 개발자로 본인이 원하는 주제에 맞는 사이드 프로젝트를 기획부터 개발해서 공유하는 채널 / `2`개의 사이드 프로젝트 개발
+ - (스터디) `TIL` - 오늘 하루에 `IT`와 관련된 기술/협업에 대한 걸 정리하고 공유하는 스터디 / 2023.12 ~ 현재 진행중
+ - (스터디) `포폴-이력또` - 한달 간의 이력서와 포트폴리오를 다듬으면서 다양한 직무간의 사람들이 서로 피드백하는 스터디
+
+(`백엔드/인프라 빌리지 반상회`, `TIL`, `포폴-이력또`에 대한 자세한 후기는 [2024년 1분기 회고](https://devfancy.github.io/1th-Retrospective/)에 작성해두었어요)
+
+`커피챗`은 회사 도메인/직무/커리어 목표/취미 등 다양한 주제로 대화를 나누고 있어요.
+오프라인으로 커피챗을 하면서, '**본인의 삶과 자기개발에 열정적이고, 재밌게 사시는 분들이 많구나**'를 느꼈어요. 그리고 커피챗에서 만난 분들이 성격과 마인드가 다 좋으셔서 '어떻게 다 이런 분들만 있으시지?' 라는 생각에 많이 놀랐어요.
+그렇다고 전부 다 열정적인 분들은 아니니, 너무 부담갖지 않으셔도 되세요. 오히려 그러한 분들이 있으셔서 저도 많은 자극과 동기부여를 받았고, 덕분에 긍정적인 에너지를 많이 받으면서 잘 지내고 있습니다 😊.
+
+실제로 저는 `포폴-이력또`를 통해 AI 스타트업 회사에 백엔드 개발 직무로 합격해서 현재 다니고 있어요.
+해당 스터디를 운영해주신 YH님께 이 자리를 빌어 감사드리고, 그 외에 저의 이력서에 피드백을 해주신 스터디원 분들, 그리고 JY님, NY님께도 감사의 말씀 전합니다.
+(`포폴-이력또`에 대한 진행 과정이 궁금하시다면, YH님이 개인 블로그에 올려주신 [이력또 : 한달 간의 이력서 정리 스터디 진행 후기](https://inspire12.tistory.com/342)에 참고해 주시면 감사하겠습니다)
+
+최근에는 새로운 회사의 업무에 집중하느라 `TIL` 스터디 하나만 참여하고 있지만, 나중에 어느 정도 시간이 된다면 다른 스터디 혹은 취미 활동에 참여하려고 해요.
+
+### 내 자신에게 아쉬운 점들(그리고 Next 목표)
+
+글또에 대한 아쉬운 점 보다는 제 자신에 대한 아쉬운 점이 있어요.
+
+먼저, 위에서 언급한 것처럼 **글 제출**에 대한 부분이에요.
+회사에 업무도 중요하지만, 하루에 몰아서 글을 작성하는 것보다는 **매일 10분이라도 조금씩 글을 작성하면서 마감 기한에 맞춰서 글을 제출**할 거에요.
+그래서 웬만하면 패스 없이 글을 제출하는 것이 목표입니다.
+
+그리고 `월간-메이커스` 와 같이 사이드 프로젝트에 대한 개발 부분이에요.
+12-1월에 혼자서 사이드 프로젝트 2개를 개발부터 배포를 했지만, 디테일한 부분과 수익성 부분이 아쉬웠어요.
+만약 10기에도 `월간-메이커스`와 같은 채널이 있다면, 개발에 대한 기술 뿐만 아니라 **비즈니스 부분도 생각하면서 서비스 출시를 목표**로 할 생각입니다.
+`월간-메이커스` 채널을 만들어주시고 운영해주신 다코(daco)님께 감사의 말씀 전합니다. (`TIL` 스터디 오래오래 같이 열심히 해봐요 🙌🏻)
+(다코님의 블로그 제목은 [코드로 우주평화](https://daco2020.tistory.com/) 입니다)
+
+마지막으로 글또에 조금이나라 기여를 하고자 해요.
+글또 9기에는 `백엔드/인프라 빌리지 반상회`에 준비위원회로 참여했지만, 반상회가 아닌 기술적으로 도움을 드리고 싶어요.
+아직 무엇을 도움을 드리고자 할지에 대해서는 더 생각을 해봐야겠지만, **취업준비생분들을 위한 온/오프라인 커뮤니티 모임**을 개발로 만들면 어떨까 싶어요.
+저도 작년까지만 해도 취업준비생 시절을 보내왔지만, 생각보다 현업 개발자분들을 만나기가 쉽지 않았기 때문에, 이러한 커뮤니티 모임이 있으면 좋을 것 같다는 생각이 들었습니다.
+
+위의 아쉬운 점들을 요약하면 아래와 같아요.
+- 글또 10기에 참여하게 된다면, 패스 없이 모든 글 제출하기 !
+- 사이드 프로젝트를 개발해서 디테일 + 수익화 고려해서 서비스 출시하기 !
+- 글또에 기술적으로 기여하기 ! (어떤 것을 기여할 지에 대해서는 조금 더 고민해보고, 구체화시키기)
+
+## 끝으로
+
+제가 생각하기에 `글또` 라는 모임은 단순히 글을 작성하는 스킬 향상에 그치지 않고, 그 외 다양한 활동이 있고 그러한 점들을 통해 개인적인 성장 뿐만 아니라 서로가 도와주면서 함께 성장하는 분위기 같아요.
+시간적 여유가 되신다면 다음 글또 10기에 참여하시는 걸 적극 추천드립니다.
+
+
+
+(위에는 예시이고, 실제로 이 밖에도 다양한 활동들이 있습니다)
+
+지금까지 이 글을 읽어주셔서 감사합니다 😌.
+
+---
+
+글 작성하는데 걸린 시간: 3시간
\ No newline at end of file
diff --git a/src/content/posts/Git-Commit-Message.md b/src/content/posts/Git-Commit-Message.md
new file mode 100644
index 00000000..6e4c1139
--- /dev/null
+++ b/src/content/posts/Git-Commit-Message.md
@@ -0,0 +1,227 @@
+---
+title: "[Git] 커밋 메세지 규약 정리 (AngularJS)"
+date: 2022-12-05
+categories: ["도구"]
+tags: ["Git"]
+---
+
+## Git 커밋 메세지의 7가지 규칙
+
+1. 제목과 분문을 빈 행으로 구분한다.
+
+2. 제목을 **50글자 내**로 제한한다.
+
+3. 제목 첫 글자는 **대문자**로 작성한다.
+
+4. 제목 끝에는 마침표를 넣지 않는다.
+
+5. 제목은 **명령문을 사용**하며 과거형을 사용하지 않는다.
+
+6. 본문의 각 행은 72글자 내로 제한한다.
+
+7. 어떻게 보다는 **무엇과 왜**를 설명한다.
+
+---
+
+```
+