diff --git a/docs/index.md b/docs/index.md
index 9c553bc4..9b82c2b4 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -10,7 +10,7 @@ hero:
link: /stack
- theme: brand
text: ๐ ํธ๋ฌ๋ธ์ํ
- link: /trouble
+ link: /trouble/index.md
- theme: brand
text: ๐๏ธ ํ๋ก์ ํธ ํด๋๊ตฌ์กฐ
link: /folder
diff --git a/docs/trouble/gradient.md b/docs/trouble/gradient.md
new file mode 100644
index 00000000..9b7df281
--- /dev/null
+++ b/docs/trouble/gradient.md
@@ -0,0 +1,79 @@
+### โ ๋ฌธ์ ์์ฝ
+
+### 1. **๋ฌธ์ ์ํฉ**
+
+- ๋งค์นญ ์ฑ์ฌ ํ๋ฉด์์ ์๋ํ **๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ**์ **๋ก๋ (Lottie) ์ ๋๋ฉ์ด์
๊ฐ์กฐ ๊ทธ๋ผ๋์ธํธ**๊ฐ ์ ์์ ์ผ๋ก ํ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
+- ๊ธฐ์กด์๋ ํด๋น ๊ทธ๋ผ๋์ธํธ๊ฐ ์ ์์ ์ผ๋ก ๋ ๋๋ง๋๊ณ ์์์ผ๋, **API ์ฐ๋ ์์
**๊ณผ **๋ฆฌ๋ฒ ์ด์ค ๊ณผ์ **, ๊ทธ๋ฆฌ๊ณ **์ ์ฒด ๋ ์ด์์ ๊ตฌ์กฐ ์์ **์ ๋ฐ๋ณตํ๋ฉด์ ์์์น ๋ชปํ๊ฒ ๋ ์ด์์์ด ๊นจ์ง๊ณ , ๊ทธ๋ผ๋์ธํธ๊ฐ ์ ํ ๋ณด์ด์ง ์๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
+- ์ด๊ธฐ ์ค๊ณ ๋จ๊ณ์์ **`position: fixed`๋ฅผ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๊ณ ํ๋ ์ ํ**์ด ์ด๋ฒ ๋ฌธ์ ์ ์ํฅ์ ์ค ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๊ทธ๋ผ๋์ธํธ๋ฅผ fixed๋ก ์ฒ๋ฆฌํ์ง ์๊ณ ์๋์ ์ธ ๋ ์ด์์์์ ๊ตฌํํ๋ ค๋ค ๋ณด๋, **์์ ์ปจํ
์ด๋์ overflow, z-index, transform ์์ฑ** ๋ฑ์ ์ํฅ์ ๋ฐ์ผ๋ฉด์ ์๋์น ์๊ฒ ๊ฐ๋ ค์ง๋ ํ์์ด ๋ฐ์ํ์ ๊ฐ๋ฅ์ฑ์ด ๋์๋ค.
+- ํนํ **๋ฆฌ๋ฒ ์ด์ค ํ ์ฝ๋ ์ถฉ๋์ ํด๊ฒฐํ๋ฉด์ ์ผ๋ถ ์คํ์ผ ๋ก์ง์ด ๋๋ฝ๋๊ฑฐ๋ ๋ฎ์ด์์์ก์ ๊ฐ๋ฅ์ฑ**๋ ์กด์ฌํ๋ค. ๊ธฐ์กด์ ์ ๋ณด์ด๋ ๊ทธ๋ผ๋์ธํธ๊ฐ ์ฌ๋ผ์ง ์์ ์ด ๋ช
ํํ์ง ์์ ์์ธ์ ์ถ์ ํ๋ ๋ฐ ์๊ฐ์ด ์์๋์๋ค.
+- QA ๊ณผ์ ์์ Lottie ์ ๋๋ฉ์ด์
์ ๊ฐ์กฐ ์์ญ์ด ์ ์์ ์ผ๋ก ํํ๋์ง ์์, ํ๋ฉด์ **๊ฐ์กฐ ํฌ์ธํธ๊ฐ ์ฌ๋ผ์ง๊ณ ์๊ฐ์ ์์ฑ๋๊ฐ ๋จ์ด์ง๋ ๋ฌธ์ **๊ฐ ๋๋ฌ๋๋ฉด์ ํด๋น ์ด์๊ฐ ์ค์ํ๊ฒ ๋ถ๊ฐ๋์๋ค.
+
+### โ ์์ธ ๋ถ์
+
+- ๊ธฐ์กด ๊ตฌ์กฐ์์๋ ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ์ ๋ก๋ ๊ฐ์กฐ ๊ทธ๋ผ๋์ธํธ๋ฅผ**absolute**๋ก ํฌ์ง์
๋ํ์ฌ,`.matching-success-background`, `.matching-lottie-gradient` ํด๋์ค๋ฅผ ํตํด ๋ฐฐ์นํ๋ค.
+- ํ์ง๋ง,**Header**๊ฐ ์์ Layout ์ปดํฌ๋ํธ์์ ๋จผ์ ๋ ๋๋ง๋๊ณ , ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ๊ฐ ํฌํจ๋ MatchingSuccessView๋ ๊ทธ ์๋ DOM ๊ณ์ธต์ ์์นํด ์์๋ค.
+- ์ด๋, ์๋ฌด๋ฆฌ z-index๋ฅผ ๋๊ฒ ์ฃผ์ด๋ **๋ถ๋ชจ stacking context**์ ์ํฅ์ผ๋ก Header๋ณด๋ค ์๋ก ์ฌ๋ผ์ค์ง ์์๋ค.
+- **z-index์ position ์์ฑ์ DOM ๊ณ์ธต ๊ตฌ์กฐ์ ๋งฅ๋ฝ(=stacking context) ์์์๋ง ๋์ํ๋ค.**
+- ๋ถ๋ชจ ์์๊ฐ ๋ฎ์ z-index๋ฅผ ๊ฐ์ง๊ฑฐ๋ stacking context๋ฅผ ์๋ก ๋ง๋ค๋ฉด, ์์์ด ์๋ฌด๋ฆฌ z-index๋ฅผ ๋์ฌ๋**๋ถ๋ชจ์ stacking context๋ฅผ ๋ฒ์ด๋์ง ๋ชปํ์๋ค.**
+- ํนํ, Header๊ฐ ์์์ ์๊ณ , ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ๊ฐ ์๋์ ์ผ๋ก ํ์ DOM์ ์์ผ๋ฉด z-index๋ง ๋์ฌ์๋ ์ ๋ ์๋ก ์ฌ๋ผ์ค์ง ์๋๋ค.
+
+### โ ํด๊ฒฐ ๋ฐฉ๋ฒ
+
+### **absolute โ fixed**
+
+- **absolute** ๋์ **fixed** ํฌ์ง์
๋์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ค.
+- `position: fixed`๋ DOM ๊ณ์ธต๊ณผ ๋ฌด๊ดํ๊ฒ**๋ทฐํฌํธ ๊ธฐ์ค**์ผ๋ก ๋ฐฐ์น๋๋ฏ๋ก, stacking context์ ์ํฅ์ ๋ฐ์ง ์์๋ค.
+- ๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ์ ๋ก๋ ๊ฐ์กฐ ๊ทธ๋ผ๋์ธํธ๋ฅผ fixed๋ก ์ ์ธํ์ฌ,**Header๋ณด๋ค ์๋, ์ฃผ์ ์ฝํ
์ธ ๋ณด๋ค ๋ค**์ ์์ฐ์ค๋ฝ๊ฒ ๊น๋ฆฌ๋๋ก ์ค๊ณํ์๋ค.
+
+### **Foreground์ Background์ ๋ช
ํํ ๋ถ๋ฆฌ**
+
+- **ํ
์คํธ, Lottie ์ ๋๋ฉ์ด์
๋ฑ ์ฃผ์ ์ฝํ
์ธ **๋
+z-10 ์ด์์ผ๋ก ๋์ด foreground ๊ณ์ธต์์ ๋ช
ํํ๊ฒ ํํํ์๋ค.
+- **๋ฐฐ๊ฒฝ ๊ทธ๋ผ๋์ธํธ**๋ z-0 ์ดํ๋ก ๋์ด
+background ๊ณ์ธต์์ ์์ฐ์ค๋ฝ๊ฒ ๊น๋ฆฌ๋๋ก ์กฐ์ ํ์๋ค.
+
+### **Layout ๋ฐ Route ๊ตฌ์กฐ๋ ๊ทธ๋๋ก**
+
+- ์ ์ฒด Layout ๋ฐ Route ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ๋๊ณ , **MatchingSuccessView ๋ด๋ถ์์๋ง ํฌ์ง์
๋์ ์์ **ํ์ฌ ์ํฅ ๋ฒ์๋ฅผ ์ต์ํํ๋ค.
+- ์ด ์ ๊ทผ๋ฒ ๋๋ถ์ **๋ค๋ฅธ ํ์ด์ง๋ ์ปดํฌ๋ํธ์ ๋ฏธ์น๋ ๋ถ์์ฉ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ**ํ ์ ์์๋ค.
+
+### ์ค์ CSS ์์ (custom-utilities.css)
+
+```css
+.matching-success-background {
+ @apply absolute left-1/2 w-[30rem] h-[30rem] blur-3xl rounded-full z-[var(--z-negative-5)];
+ top: calc(50% + 10px);
+ transform: translate(-50%, -50%);
+ background: radial-gradient(67.17% 67.17% at 33.26% 84.78%, #9be88a 5%, #bcf3ff 88.05%);
+}
+
+.matching-lottie-gradient {
+ @apply absolute left-1/2 top-1/2 w-[18rem] h-[18rem] -translate-x-1/2 -translate-y-1/2 rounded-full z-[var(--z-negative-1)];
+ background: radial-gradient(
+ 74.24% 74.24% at 50.22% 50.22%,
+ rgba(255, 255, 255, 0) 46.82%,
+ #ffffff 72.4%
+ );
+}
+```
+
+### ์ค์ ์ ์ฉ ์์ (MatchingSuccessView)
+
+```tsx
+
+```
+
+- ๊ธฐ์กด absolute โ fixed๋ก ๋ณ๊ฒฝ
+- z-index๋ 0 ์ดํ๋ก ์ค์ ํ์ฌ Header๋ณด๋ค ๋ค์, ์ฃผ์ ์ฝํ
์ธ ๋ณด๋ค ์๋์ ์์น
+
+### โ ํ๊ณ ๋ฐ ๊ฐ์ ๋ฐฉํฅ
+
+- **z-index ๋ฌธ์ ๋ ๋จ์ํ ๊ฐ์ ํฌ๊ธฐ๋ก ํด๊ฒฐ๋์ง ์๋๋ค.** Stacking context์ ๋ํ ๋ช
ํํ ์ดํด๊ฐ ์์ผ๋ฉด ๋ ์ด์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ ๋ค์ ๊นจ๋ฌ์๋ค.
+- `position: fixed`๋ **DOM ๊ตฌ์กฐ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ์ํ๋ ๋ ์ด์ด๋ง์ ๊ตฌํํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ**์์ ์ฒด๊ฐํ๋ค.
+- ์ด๋ฒ ๊ฒฝํ์ผ๋ก ์ธํด **๋ ์ด์์์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ์ปดํฌ๋ํธ ๋จ์์ ํฌ์ง์
๋ ์ ๋ต์ ์ ์ฐํ๊ฒ ๋ฐ๊พธ๋ ์ ๊ทผ๋ฒ**์ด ํจ์ฌ ํจ์จ์ ์ผ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
\ No newline at end of file
diff --git a/docs/trouble/image-1.png b/docs/trouble/image-1.png
new file mode 100644
index 00000000..c5c9f3c2
Binary files /dev/null and b/docs/trouble/image-1.png differ
diff --git a/docs/trouble/image.png b/docs/trouble/image.png
new file mode 100644
index 00000000..e49c1f54
Binary files /dev/null and b/docs/trouble/image.png differ
diff --git a/docs/trouble/index.md b/docs/trouble/index.md
new file mode 100644
index 00000000..9aa1813b
--- /dev/null
+++ b/docs/trouble/index.md
@@ -0,0 +1,22 @@
+---
+layout: home
+
+hero:
+ name: "ํธ๋ฌ๋ธ์ํ
"
+ tagline: ๋ฉ์๋ณผ ํด๋ผ์ด์ธํธ ํธ๋ฌ๋ธ์ํ
๋ฌธ์๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
+ actions:
+ - theme: brand
+ text: protectedRoute ์ค์ ๊ด๋ จ
+ link: /trouble/protectedRoute
+ - theme: brand
+ text: useFunnel ๊ธฐ๋ฐ ์จ๋ณด๋ฉ ๊ตฌ์กฐ ๋ถ๊ธฐ ๋ฐ ์ํ ์ ์ง ์ ๋ต
+ link: /trouble/useFunnel
+ - theme: brand
+ text: React Hooks ๊ท์น, Supense ๊ฐ์ด๋์ ๋ง๋ ๋งค์นญ ์นด๋ ๊ตฌ์กฐ ๊ฐ์
+ link: /trouble/suspense
+ - theme: brand
+ text: ์ฌ๋ผ์ง ๊ทธ๋ผ๋์ธํธ๋ฅผ ์ฐพ์์..
+ link: /trouble/gradient
+
+---
+
diff --git a/docs/trouble/protectedRoute.md b/docs/trouble/protectedRoute.md
new file mode 100644
index 00000000..01f83a99
--- /dev/null
+++ b/docs/trouble/protectedRoute.md
@@ -0,0 +1,79 @@
+๋ก๊ทธ์ธ ํ์ง ์์ ์ฌ์ฉ์๊ฐ, ๋ก๊ทธ์ธ ์ดํ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ก ์ ์ํ์๋๋ splash ํ๋ฉด์ผ๋ก ์ด๋ ํ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๊ฐ๋ ํ๋ฆ
+
+### โ ๋์
ํ ๊ธฐ์
+
+์ด๋ฒ ๋ก๊ทธ์ธ ํ๋ฆ ๊ฐ์ ์์๋ React Router ๊ธฐ๋ฐ์ ๋ผ์ฐํ
์์คํ
์ ๊ตฌ์ถํ๋ฉด์, `protected route`์ `public route`๋ฅผ ๋ช
ํํ ๋ถ๋ฆฌํ๋ ๊ตฌ์กฐ๋ฅผ ๋์
ํ๋ค. ์ด๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์๊ฒฉํ ์ ์ดํ๊ณ ์ ํ๋ค. ์ธ์ฆ ์ํ ํ์ธ๊ณผ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด `tanstack-query`๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ํ๋ฅผ ์๋ฒ์์ ์กฐํํ๋ `useAuth` ์ปค์คํ
ํ
์ ๋ง๋ค์๊ณ , ์ธ์ฆ ํ๋ฆ ์ ์ด๋ `AuthGuard` ์ปดํฌ๋ํธ๋ก ๊ตฌํํ๋ค. ๋ํ, ์นด์นด์ค ์์
๋ก๊ทธ์ธ ์ฐ๋ ์ ๋ฐ์ํ๋ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ์ ์๋ฒ์ ์ ๋ฌํด ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ `LoginCallback` ์ปดํฌ๋ํธ๊ฐ ์๋ค. ๋ก๊ทธ์ธ ๊ณผ์ ์ค 401 Unauthorized ์ํ๊ฐ ๋ฐ์ํ๋ฉด ์ธํฐ์
ํฐ๋ก ์ด๋ฅผ ๊ฐ์งํด ์๋์ผ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ ๋ก์ง๋ ํจ๊ป ๊ตฌ์ฑ๋์๋ค.
+
+### โ ๋ฌธ์ ์์ฝ
+
+์ด๊ธฐ์๋ ๋ก๊ทธ์ธ ํ์ ํ์ด์ง์ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ๊ฒฝ์ฐ, ์ ์ ํ ๋ณดํธ ๋ฐ ๋ฆฌ๋ค์ด๋ ํธ ์ฒ๋ฆฌ๊ฐ ์ฒด๊ณ์ ์ผ๋ก ์ด๋ค์ง์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ด ์ผ๊ด๋์ง ์์๋ค. ํนํ, ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ ํ ์ฝ๋ฐฑ์์ ํ ํฐ ๋ฐ๊ธ ๋ฐ ์ฌ์ฉ์ ์ ๋ณด ์กฐํ ํ ํ๋ฉด ์ ํ๊น์ง์ ํ๋ฆ์ด ๋ช
ํํ์ง ์์๊ณ , ์ธ์ฆ ์ํ๋ฅผ ํ๋จํ๋ `useAuth` ํ
๊ณผ `AuthGuard`์ ์ญํ ๋ถ๋ฆฌ๊ฐ ์ ๋งคํด ๋ก์ง์ด ๋ณต์กํ๊ฒ ์ฝํ ์์๋ค. ์ด๋ก ์ธํด ๋ก๊ทธ์ธ ์ฑ๊ณต ์ฌ๋ถ์ ํ์ ๊ฐ์
์ฌ๋ถ ํ๋จ ํ ์ฌ๋ฐ๋ฅธ ํ๋ฉด์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด๋์ํค๋ ๋ถ๋ถ์์ ์์ธ ์ํฉ์ด ๋ฐ์ํ๊ฑฐ๋ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ด ๋ง์๋ค. ๋๋ถ์ด interceptor์์ ๋ฐ์ํ๋ 401 ์๋ฌ ์ฒ๋ฆฌ์ ์ธ์ฆ ํ๋ฆ์ด ๋ช
ํํ ์ฐ๊ฒฐ๋์ง ์์ ์ค๋ณต๋ ์ธ์ฆ ๊ฒ์ฌ์ ๋นํจ์จ์ ์ธ ๋ค๋น๊ฒ์ด์
์ด ๋ฐ์ํ๋ค.
+
+์ถ๊ฐ์ ์ผ๋ก ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์๊ฐ ํ ๊ฐ์ ์ธ์ฆ ํ์ ๊ฒฝ๋ก์ ์ ๊ทผํ ๊ฒฝ์ฐ, Tanstack Query๋ฅผ ํตํ API ์์ฒญ์ด ๋จผ์ ๋ฐ์ํด ์๋ฒ๋ก๋ถํฐ 401 Unauthorized ์๋ฌ๊ฐ ๋ฐํ๋๋ค. ์ด๋ ์ธ์ฆ ์ํ ํ๋จ ์ ์ API ์์ฒญ์ด ๋จผ์ ์คํ๋๊ณ , ์ธ์ฆ ์คํจ(Hi developersโฆ .. ใ
ใ
) ํ ์คํ๋์ ํ๋ฉด์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ๋๋ฉด์ ํ๋ฉด ๊น๋นก์ ํ์์ด ๋ฐ์ํด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋จ์ด์ก๋ค.
+
+### โ ์์ธ ๋ถ์
+
+๊ฐ์ฅ ํฐ ์์ธ์ ์ธ์ฆ ํ๋ฆ์ ๋จ๊ณ๋ณ ์ญํ ๊ณผ ๊ฒฝ๊ณ๊ฐ ๋ช
ํํ ์ ์๋์ด ์์ง ์์ ๋ฐ ์์๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ ์ฝ๋ฐฑ์์ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ์ ์๋ฒ์ ์ ๋ฌํ๊ณ , ์๋ฒ๋ก๋ถํฐ ๋ก๊ทธ์ธ ์ฑ๊ณต ์๋ต์ ๋ฐ์ ํ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํด ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ๋จํ๋ ๋ถ๋ถ์ด ๋ถ๋ฆฌ๋์ด ์์๊ณ , ์ด ์ฌ์ด์ ์ํ ๊ด๋ฆฌ๊ฐ ์ผ๊ด์ ์ด์ง ์์๋ค. ๋ํ, `useAuth` ํ
์ด ์ฌ์ฉ์ ์ํ๋ฅผ ์กฐํํ์ง๋ง ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก `AuthGuard`๊ฐ ๊ฒฝ๋ก ์ ๊ทผ์ ์ ์ดํ๋ ์ญํ ์ด ๋๋ ทํ๊ฒ ๊ตฌ๋ถ๋์ง ์์ ์ฑ
์์ด ๋ถ์ฐ๋์๋ค. interceptor๋ 401 ์ํ ๋ฐ์ ์ ๋ก๊ทธ์์ ํน์ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋์ ์ฒ๋ฆฌํ์ง๋ง, ๊ทธ ํ๋ฆ์ด `useAuth`๋ ๋ผ์ฐํฐ์ ์กฐํ๋กญ๊ฒ ์ฐ๊ฒฐ๋์ง ๋ชปํด ์ค๋ณต ๊ฒ์ฌ์ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋ฐ๋ณต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ก๊ทธ์ธ ์ , ๋ก๊ทธ์ธ ํ ํ๋ฉด ์ ํ๊ณผ ์ํ ๋ฐ์์ด ๋น๋๊ธฐ์ ์ผ๋ก ๊ผฌ์ฌ ํ๋ฆ ์ ์ด๊ฐ ์ด๋ ค์ ๋ค.๊น๊น
+
+๊น๋นก์ ๊ด๋ จ ํ์์, ๋ผ์ฐํฐ์์ ์ธ์ฆ ๋ณดํธ ๊ธฐ๋ฅ(`AuthGuard`)์ด ์์ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ ์ ์ ํ๋์ง ์์, ์ธ์ฆ ๊ฒ์ฆ ์ API ์์ฒญ์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ๋ํ ๋ผ์ฐํฐ์ ์๋ฌ ์ฒ๋ฆฌ์ฉ `errorElement`๊ฐ ์์ด์ 401 ์๋ฌ๋ก ์ธํ ์์ธ ์ํฉ์ด ์์ฐ์ค๋ฝ๊ฒ ํธ๋ค๋ง๋์ง ์์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ์ฉ์๋ ์ธ์ฆ ์ํ ํ์ธ ์ด์ ์ ๋ถํ์ํ API ํธ์ถ๊ณผ ๊น๋นก์ ํ์์ ๊ฒฝํํ๋ค.
+
+### โ ํด๊ฒฐ ๋ฐฉ๋ฒ
+
+- ๋ผ์ฐํฐ ๊ตฌ์กฐ ์ฌ์ค๊ณ: React Router์ createBrowserRouter๋ฅผ ํ์ฉํด, ๋ก๊ทธ์ธ ํ์ ๊ฒฝ๋ก๋ฅผ AuthGuard ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ๊ณ , ๋ก๊ทธ์ธ ์ ์ฉ ๊ฒฝ๋ก๋ publicRoutes๋ก ๋ถ๋ฆฌํด ๋์๋ค. ์ด๋ก์จ ์ธ์ฆ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ์๊ฒฉํ ๊ตฌ๋ถ๋๋๋ก ํ๋ค.
+- useAuth ํ
๊ฐ์ : ์๋ฒ์์ ์ฌ์ฉ์ ์ํ๋ฅผ ์กฐํํด ๋๋ค์ ์กด์ฌ ์ฌ๋ถ(isAuthenticated)์ ๊ฐ์
์กฐ๊ฑด(isNotMatched) ๋ฑ์ ๋ช
ํํ ๋ฐํํ๋๋ก ํ์ฌ, ๋ก๊ทธ์ธ ์ฌ๋ถ ๋ฐ ์ถ๊ฐ ๋งค์นญ ํ์ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ ๋ก์ง์ ์ผ์ํํ๋ค. ์บ์ ๋ฌดํจํ ๊ธฐ๋ฅ์ ํ์ฉํด ์ฌ์ฉ์ ์ํ ๊ฐฑ์ ๋ ์ฝ๊ฒ ํ ์ ์๋๋ก ์ค๊ณํ๋ค.
+- AuthGuard ์ปดํฌ๋ํธ ์ญํ ๋ช
ํํ: useAuth์์ ๋ฐํ๋ ๋ก๊ทธ์ธ ์ํ์ ๋ก๋ฉ ์ํ๋ฅผ ํ ๋๋ก ๋ก๊ทธ์ธ๋์ง ์์ ๊ฒฝ์ฐ Navigate ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ์ํค๊ณ , ์ธ์ฆ ์ค์ด๋ฉด ๋ก๋ฉ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํ์ฌ ์ ๊ทผ ์ ์ด๋ฅผ ์๊ฒฉํ๊ฒ ๊ตฌํํ๋ค.
+- ๊น๋นก์ ๊ด๋ จ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก๋ , ๋ผ์ฐํฐ์์ `AuthGuard`๋ฅผ ์ต์์ ๋ ๋ฒจ๋ก ๋ฐฐ์นํด, ์ธ์ฆ ์ฌ๋ถ ํ์ธ์ด ๋จผ์ ์ด๋ฃจ์ด์ง๊ณ ์์ ๋ผ์ฐํธ๋ค์ด ๋ ๋๋ง ๋๋๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ฅผ ํตํด ์ธ์ฆ์ด ์ ๋ ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ๋ค์ API ์์ฒญ ์์ฒด๋ฅผ ๋ง์๋ค. ๋, ๋ผ์ฐํฐ์ `errorElement`๋ฅผ ๋น ์ปดํฌ๋ํธ ๋๋ ๋ณ๋ ์๋ฌ UI๋ก ์ถ๊ฐํด ์์ธ ์ํฉ์ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌํ๋๋ก ํจ์ผ๋ก์จ, ์๊ธฐ์น ์์ ์๋ฌ ๋ฐ์ ์ ์ฌ์ฉ์์๊ฒ ๋ถํ์ํ ๊น๋นก์์ ๋ณด์ฌ์ฃผ์ง ์๋๋ก ํ๋ค. `AuthGuard` ์ปดํฌ๋ํธ์์ ์ธ์ฆ ์ํ ๋ก๋ฉ ์ค์ ์คํ๋์ ํ๋ฉด์ ๋ ๋๋งํ๊ณ , ์ธ์ฆ ์คํจ ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ฆ์ ๋ฆฌ๋ค์ด๋ ํธํ๋๋ก ๊ฐ์ ํด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค์๋ค.
+
+- ์ฝ๋ ์ผ๋ถโฆ
+
+ ```tsx
+ // router.tsx
+ import { createBrowserRouter } from 'react-router-dom';
+ import AuthGuard from '@routes/auth-guard';
+ import Layout from '@routes/layout';
+ import Splash from '@pages/login/components/splash';
+ import ErrorView from '@pages/error/error-view';
+ import { protectedRoutes } from '@routes/protected-routes';
+ import { publicRoutes } from '@routes/public-routes';
+ import { ROUTES } from '@routes/routes-config';
+
+ export const router = createBrowserRouter([
+ {
+ path: ROUTES.SPLASH,
+ element: ,
+ },
+ ...publicRoutes,
+ {
+ path: '/',
+ element: , // ์ต์์์ AuthGuard ๋ฐฐ์น
+ errorElement: <>>, // ๋น ์ปดํฌ๋ํธ๋ ๋ณ๋์ ์๋ฌ UI๋ก ๊น๋นก์ ๋ฐฉ์ง
+ children: [
+ {
+ element: ,
+ children: [
+ ...protectedRoutes,
+ {
+ path: '/error',
+ element: ,
+ },
+ {
+ path: '*',
+ element: (
+
+ ),
+ },
+ ],
+ },
+ ],
+ },
+ ]);
+
+ ```
+
+
+### โ ํ๊ณ ๋ฐ ๊ฐ์ ๋ฐฉํฅ
+
+์ด๋ฒ ๋ก๊ทธ์ธ ํ๋ฆ ์ค๊ณ ๋์ ์ protected route์ public route๋ฅผ ๋ช
ํํ ๋ถ๋ฆฌํ์ฌ, ์ธ์ฆ ์ํ์ ๋ฐ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ํฐ ๋์์ด ๋์๋ค. ํ์ง๋ง ์นด์นด์ค ๋ก๊ทธ์ธ ์ฝ๋ฐฑ ์ดํ ์ธ๊ฐ ์ฝ๋ ์ฒ๋ฆฌ๋ถํฐ ์ฌ์ฉ์ ์ํ ์กฐํ ๋ฐ ํ๋ฉด ์ ํ๊น์ง ์ด์ด์ง๋ ๋น๋๊ธฐ ํ๋ฆ์ด ๋ณต์กํ์ฌ, interceptor, useAuth, AuthGuard ๋ฑ ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ์ธ์ฆ ํ๋ฆ์ ์ผ๋ถ๋ฅผ ๋ถ๋ดํ๋ ๊ณผ์ ์์ ์ํ ๋ณํ๊ฐ ์ฆ์ ๋ฐ์๋์ง ์์ ๋ก์ง ๊ผฌ์๊ณผ ๋๋ฒ๊น
์ด๋ ค์์ด ์์๋ค.
+
+์์ผ๋ก๋ ์ธ์ฆ ํ๋ฆ ๋ด ๊ฐ ์ญํ ๋ณ ์ฑ
์๊ณผ ์ํ ๋ณํ๋ฅผ ๋์ฑ ๋ช
ํํ ๊ตฌ๋ถํ๋ ๋์์, ์ ์ญ ์ํ ๊ด๋ฆฌ ์๋ฃจ์
(Recoil, Zustand ๋ฑ)์ ๋์
ํด ์ธ์ฆ ์ํ ๋ณํ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๊ณ ๋ฏผํ ์์ ์ด๋ค. ๋ํ ๋คํธ์ํฌ ์ค๋ฅ, ํ ํฐ ๋ง๋ฃ ๋ฑ ๋ค์ํ ์์ธ ์ฒ๋ฆฌ ์ผ์ด์ค๋ฅผ ์ธ๋ฐํ๊ฒ ํ
์คํธํ์ฌ ์ฌ์ฉ์ ์ดํ์ ๋ฐฉ์งํ๋ UX ๊ฐ์ ์๋ ์ฃผ๋ ฅํ ๊ณํ์ด๋ค. ์ด๋ฅผ ํตํด ๋ก๊ทธ์ธ๊ณผ ์ธ์ฆ ๋ก์ง์ ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ์ฑ ์๊ฒ ๋ค๋ฌ๋ ๊ฒ์ด ๋ชฉํ๋ค.
+
+์ด๋ฒ ๊ฐ์ ์์
์ ํตํด ์ธ์ฆ ์ํ๊ฐ ์์ ํ ํ์ธ๋ ํ์๋ง protected route ๋ด๋ถ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋๋ก ํ์ฌ, ๋ถํ์ํ API ํธ์ถ๊ณผ 401 ์๋ฌ๋ก ์ธํ ํ๋ฉด ๊น๋นก์ ํ์์ ์์ฒ ์ฐจ๋จํ ์ ์์๋ค. ๋๋ถ์ ์คํ๋์ ํ๋ฉด์ด ์์ฐ์ค๋ฝ๊ฒ ๋
ธ์ถ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ด ํฌ๊ฒ ํฅ์๋์๋ค. ์์ผ๋ก๋ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ๋ ๋ผ์ฐํฐ ์์ค์์ ๊ด๋ฆฌํ์ฌ ํ์ด์ง ๋ ๋๋ง ํ์ด๋ฐ๊ณผ API ํธ์ถ ํ๋ฆ์ ์ต๋ํ ์ผ์น์ํค๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณํ ๊ณํ์ด๋ค. ๋ํ, ์๋ฌ ํธ๋ค๋ง UI๋ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌ์ฑํด ์ฌ์ฉ์ ์ดํ์ ์ต์ํํ๋ ๋ฐ ์ง์คํ ์์ ์ด๋ค.
\ No newline at end of file
diff --git a/docs/trouble/suspense.md b/docs/trouble/suspense.md
new file mode 100644
index 00000000..7c34dfc9
--- /dev/null
+++ b/docs/trouble/suspense.md
@@ -0,0 +1,115 @@
+### โ ๋ฌธ์ ์์ฝ
+
+**๊ธฐ์กด useMatchCreate**ย ํ
์ ๋ API(**`SINGLE_MATCH_RESULT`**,ย **`GROUP_MATCH_RESULT`**)์ Mock ๋ฐ์ดํฐ(**`mockMateSingle`**)๋ฅผ ๋ชจ๋ ํ ๊ณณ์์ ๋ค๋ฃจ๋ฉด์,ย **`type`**์ด๋ผ๋ Prop์ ๋ฐ๋ผ ๋ถ๊ธฐ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์ด ์์๋ค.
+
+```tsx
+const useMatchCreate = (matchId: number, type: 'single' | 'group' | null | undefined) => {
+ // ๊ทธ๋ฃน ๊ฒฐ๊ณผ ์กฐํ ์์ฒญ
+ const { data: mateGroup } = useSuspenseQuery(
+ matchQueries.GROUP_MATCH_RESULT(matchId, type === 'group')
+ );
+
+ const getMatchData = (): MatchCardData | null => {
+ if (type === 'single') { ... } // mock ๋ฐ์ดํฐ ๋ฐํ
+ if (!mateGroup) return null;
+ return { ...mateGroup, type: 'group' }; // ๊ทธ๋ฃน API ์๋ต ๋ฐํ
+ };
+
+ return { matchData: getMatchData() };
+};
+
+```
+
+- **๋ฌธ์ 1: ํ์
์ ๋ฐ๋ผ ์ฟผ๋ฆฌ/๋ฐ์ดํฐ ๋ถ๊ธฐ๊ฐ ๋์ ์ผ๋ก ์ผ์ด๋จ.**
+
+ **`type`**์ดย **`group`**์ผ ๋๋ย **`useSuspenseQuery`**๋ก ๊ทธ๋ฃน ๋งค์น ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฌ์ค๊ณ ,
+
+ **`type`**์ดย **`single`**์ผ ๋๋ mock ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌ๋จ.
+
+- **๋ฌธ์ 2: ๋ ์ฟผ๋ฆฌ ํ
์ ๋์์ ์ ์ธํ๊ณ , ์กฐ๊ฑด๋ถ๋ก ๋ฐํ.**
+
+ ํ
๋ด๋ถ์ย **`useSuspenseQuery`**๊ฐ ํ ๋ฒ๋ง ์์ ๊ฒ ๊ฐ์ง๋ง,ย **`type`**์ดย **`group`**์ด๋ฉด ํญ์ย **`useSuspenseQuery`**๊ฐ ์คํ๋จ.
+
+ **`type`**์ดย **`single`**์ด๋ฉด ์ด ํ
์ ์คํ๋์ง ์์ง๋ง, ๋ค๋ฅธ ์ปดํฌ๋ํธ์์์ ์ฌ์ฉ์ด ๋ช
ํํ์ง ์์.
+
+- **๋ฌธ์ 3: mock ๋ฐ์ดํฐ์ API ๋ฐ์ดํฐ๋ฅผ ์์ด ์ฐ๊ณ ์์.**
+
+ **`single`**ย ํ์
๊ฒฐ๊ณผ๋ mock์ด๊ณ ,ย **`group`**ย ํ์
๊ฒฐ๊ณผ๋ API ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์ด. ์ด๋ ๋ฏธ๋์ API ์ ํ ์ ์ ์ง๋ณด์๋ฅผ ํ๋ค๊ฒ ํจ.
+
+- **๋ฌธ์ 4: ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ด ํ
๋ด๋ถ์์ ์ผ์ด๋จ.**
+
+ ์ด ๊ตฌ์กฐ๋ React Hook ๊ท์น์ ๋ฌด์กฐ๊ฑด ํ
์ย **ํญ์ ๊ฐ์ ์์น์์ ํธ์ถ๋์ด์ผ**ย ํ๋ค๋ ์์น์ ์ด๊ธฐ๊ฒ ๋จ.
+
+
+### โ ์์ธ ๋ถ์
+
+- **2-1. useSuspenseQuery๋ ์กฐ๊ฑด๋ถ๋ก ํธ์ถํ ์ ์์**
+
+ **`type`**์ ๋ฐ๋ผย **`useSuspenseQuery`**๋ฅผ ๋ฐ๋ก๋ฐ๋ก ๋ฐ๊ฟ์ ์ฐ๋ฉด, ๋ฆฌ์กํธ๋ ํ
ํธ์ถ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ถ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก **`type`**์ด ๋ฐ๋๋ฉด ํธ์ถ ์์๊ฐ ๊ผฌ์ฌ ์๋ฌ ๋ฐ์!
+
+- **2-2. enabled๋ก ์กฐ๊ฑด๋ถ ์คํ์ ์๋**
+
+ **`useSuspenseQuery`**์์ย **`enabled`**ย ์ต์
(**`GROUP_MATCH_RESULT(matchId, type === 'group')`**)์ ์ค๋
+
+ ์ด๋ ๋จ์ํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ย **`data`**์ย **`isFetching`**ย ๋ฑ์ ์ ์ดํ ๋ฟ, ํ
์์ฒด๊ฐย **์คํ ์์ฒด๋ฅผ ์ต์ ํ๋ ๊ฒ์ ์๋**. ์ฆ,ย **`type`**์ดย **`group`**์ด๋ ย **`single`**์ด๋ ย **ํ
์ ํญ์ ์คํ**๋จ.
+
+- **2-3. API ํธ์ถ์ด ๋ถํ์ํ๊ฒ ๋ฐ์**
+
+ **`type`**์ดย **`single`**์ด๋๋ผ๋ ๊ทธ๋ฃน ๋งค์นญ ๊ฒฐ๊ณผ ์กฐํ API๊ฐ ์คํ๋จ. ๋ฐ๋๋ก,ย **`group`**์ธ๋ฐ๋ย **`single`**(mock) ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ด ์๊ด์์ด ์๋ค๋ ๊ตฌ์กฐ์ ํผ๋์ด ์กด์ฌํจ.
+
+- **2-4. ํ
๊ณผ ์ปดํฌ๋ํธ์ ์ฑ
์ ๋ถ๋ฆฌ ํ์**
+
+ **`useMatchCreate`**๊ฐย **API ํธ์ถ**,ย **mock ๋ฐ์ดํฐ ๋ฐํ**,ย **ํ์
ํ๋จ**,ย **์นด๋ ๋ฐ์ดํฐ ๋ณํ**๊น์ง ํ ๋ฒ์ ๋ชจ๋ ๋ด๋นํ๋ฉด, ์ ์ง ๋ณด์์ ํ์ฅ์ด ์ด๋ ต๊ณ , ์ค์ ๋กย **ํ
๊ท์น ์๋ฐ**์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํจ.
+
+
+### โ ํด๊ฒฐ ๋ฐฉ๋ฒ
+
+**2-1. ํ
๊ณผ ์ปดํฌ๋ํธ ๊ตฌ์กฐ ๋ถ๋ฆฌ**
+
+- **SingleMatchCard**: ์ฑ๊ธ ๋งค์นญ ๋ฐ์ดํฐ๋ง์ ๋ฐ์ ํ์ํ๋ ์ปดํฌ๋ํธ
+- **GroupMatchCard**: ๊ทธ๋ฃน ๋งค์นญ ๋ฐ์ดํฐ๋ง์ ๋ฐ์ ํ์ํ๋ ์ปดํฌ๋ํธ
+- **MatchCardSection**: ํ์
(**`type`**)์ ๋ฐ๋ผ Single/Group ์ปดํฌ๋ํธ๋ฅผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
+
+```tsx
+// MatchCardSection.tsx
+const MatchCardSection = ({ matchId, type }: MatchCardSectionProps) => {
+ if (type === 'single') return ;
+ if (type === 'group') return ;
+ return null;
+};
+```
+
+์ฅ์ : ํ์
๋ณ๋ก ํ
(์ฟผ๋ฆฌ) ํธ์ถ๊ณผ ๋ฐ์ดํฐ ๋ณํ ๋ก์ง์ด ๋ช
ํํ ๋ถ๋ฆฌ๋์ดย ํ
๊ท์น์ ์ฒ ์ ํ ์งํฌ ์ ์์
+
+**2-2. Mock -> API ์ ํ์ด ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ**
+
+๊ธฐ์กด์๋ย **`single`**์ด๋ฉด ๋ฌด์กฐ๊ฑด mock์ ์ฐ๋ค๊ฐ, ์ด์ ๋ย **SingleMatchCard ์ปดํฌ๋ํธ ๋จ์์๋ ์ค์ API๋ฅผ ์ฌ์ฉํ๋๋ก**ย ์ค๊ณ๋ง ์กฐ๊ธ๋ง ๋ฐ๊พธ๋ฉด ์ฝ๊ฒ ๋ง์ด๊ทธ๋ ์ด์
ํ ์ ์์.
+
+**2-3. ๋ฐ์ดํฐ ํ๋ฆ์ ์ผ๊ด์ฑ ํ๋ณด**
+
+- **SingleMatchCard**:ย **`useSuspenseQuery(matchQueries.SINGLE_MATCH_RESULT(matchId))`**
+- **GroupMatchCard**:ย **`useSuspenseQuery(matchQueries.GROUP_MATCH_RESULT(matchId))`**
+
+๊ฐ ์ปดํฌ๋ํธ๋ย **์์ ์ ํ์
์ ๋ง๋**ย ์ฟผ๋ฆฌ๋ง ํ
์ผ๋ก ํธ์ถํจ. ๋ถํ์ํ API ํธ์ถ, mock ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ์ ๊ฑฑ์ ํ ํ์๊ฐ ์์.
+
+**2-4. React Hook ๊ท์น ์์**
+
+ํ
ํธ์ถ์ย **์ปดํฌ๋ํธ ์๋จ์์ ๋ฌด์กฐ๊ฑด ๋์ผํ ์์๋ก**. ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์์ JSX ๋ ๋ฒจ์์ ์ฒ๋ฆฌ.
+
+โย **ํ
๋ด๋ถ์์ ์กฐ๊ฑด๋ถ ์ฒ๋ฆฌ๊ฐ ์๋๋ผ, ํธ๋ฆฌ(์ปดํฌ๋ํธ ๋ ๋ฒจ)์์ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋ง**์ ํ๊ฒ ๋๋ฏ๋ก, ํ
๊ท์น์ ์ ๋๋ก ์ด๊ธฐ์ง ์์.
+
+**2-5. Suspense๋ก ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์๋ฌ ์ฒ๋ฆฌ ์ฉ์ด**
+
+Suspense๋ฅผ ์ฌ์ฉํ์ฌ,ย **๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ํ ๋ ๋๋ง**๋๋ฏ๋ก **`undefined`**๋ก ์ธํ ๊น๋นก์, ์คํ์ผ ์ด์ ๋ฑ์ ์์ ํ ๋ฐฉ์ง.
+
+### โ ํ๊ณ ๋ฐ ๊ฐ์ ๋ฐฉํฅ
+
+์ปดํฌ๋ํธ ๊ตฌ์กฐ ๊ฐ์ ์ ํตํด ๋งค์นญ ํ์
(์ฑ๊ธ/๊ทธ๋ฃน)๋ณ๋ก ๊ธฐ์กด์ ํ๊ณณ์์ ๋ด๋นํ๋ ๋ณต์กํ ๋ก์ง์,ย **๊ฐ์์ ์ญํ ์ ๋ง๊ฒ ๋ถ๋ฆฌ**ํจ์ผ๋ก์จ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ช
ํํ๊ฒ ํด๊ฒฐํ ์ ์์๋ค. ๊ธฐ์กด์๋ ํ์
๊ตฌ๋ถ์ด ํ
๋ด๋ถ์์ ์กฐ๊ฑด๋ถ๋ก ์ฒ๋ฆฌ๋๋ค ๋ณด๋, ํ
์ด ํญ์ ๊ฐ์ ์์๋ก ํธ์ถ๋์ด์ผ ํ๋ค๋ย **React Hooks ๊ท์น**์ ์ด๊ธธ ์๋ฐ์ ์์๊ณ , ์ด๋ก ์ธํด ์๊ธฐ์น ์์ ๋ฒ๊ทธ์ ๋๋ฒ๊น
์ ์ด๋ ค์์ด ๋ฐ์ํ๋ค. ๋ํ, API์ mock ๋ฐ์ดํฐ๊ฐ ํผ์ฌ๋์ด ์์ด, ์ค์ ์๋น์ค ์ฐ๋ ์ย **๋ถํ์ํ API ํธ์ถ์ด ๋ฐ์**ํ๊ฑฐ๋, ๋ฐ์ดํฐ ํ๋ฆ์ด ๋ถ๋ช
ํํด์ง๋ ๋ฑ,ย **์ ์ง๋ณด์์ฑ**๊ณผย **๋คํธ์ํฌ ์ฑ๋ฅ**ย ๋ชจ๋์ ์
์ํฅ์ ๋ผ์ณค๋ค.
+
+์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํดย **SingleMatchCard**,ย **GroupMatchCard**ย ์ปดํฌ๋ํธ๋ก ๊ฐ๊ฐ ์ญํ ์ ๋๋์๊ณ , ์ด ๋ ์ปดํฌ๋ํธ๋ ๊ฐ์์๊ฒ ๋ง๋ API๋ ๋ฐ์ดํฐ๋ง์ ์ ๋ดํ๋๋ก ํ๋ค. ์ด์ ย **MatchCardSection**์์๋ ๋จ์ํ ๋งค์นญ ํ์
์ ๋ฐ๋ผ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋ง๋ง ํ๋ฉด ๋๋ฏ๋ก, ์ปดํฌ๋ํธ ๊ตฌ์กฐ๊ฐ ๋ช
ํํด์ง๊ณ ,ย **ํ
์ด ๋์ผํ ์์น์์ ํ ๋ฒ๋ง ํธ์ถ**๋๋๋ก ๋ณด์ฅํ ์ ์๋ค.
+
+์ด ๊ตฌ์กฐ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ย **API๊ฐ ๋ฐ๋๊ฑฐ๋, mock์์ ์ค์ API๋ก ์ ํํ ๋ ์ปดํฌ๋ํธ ํ๋๋ง ์์ ํ๋ฉด ์ถฉ๋ถํ๋ค**๋ ์ ์ด๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ธ ๋งค์นญ๋ ๊ฒฐ๊ตญ API ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ตฌ์กฐ๋ก ์ ํํ๊ณ ์ถ์ ๋, SingleMatchCard๋ง ์์ ํ๋ฉด ๋๋ฏ๋กย **๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋ ฅ**์ ๊ฐ์ง๋ค. ๋ํ,ย **๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ด ๊ทผ๋ณธ์ ์ผ๋ก ์ฐจ๋จ**๋์ด, ์๋น์ค์ ๋คํธ์ํฌ ํจ์จ๊ณผ ์ฑ๋ฅ์ด ํฌ๊ฒ ๊ฐ์ ๋๋ค.
+
+**Suspense**๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ ํ์นญ์ด ๋๋ ํ์๋ง ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๋๋ก ๋ณด์ฅํจ์ผ๋ก์จ, ํ์ด์ง ์ ํ ์ ๋ถ์์ ํ ๋ฐ์ดํฐ๋ก ์ธํ ๊น๋นก์์ด๋ ์คํ์ผ ์ด์๋ ๋ง์ ์ ์๋ค. ๋ฐ์ดํฐ ํ๋ฆ์ด ํ์
๋ณ๋ก ๋ช
ํํ๊ฒ ๊ตฌ๋ถ๋์ด ์์ด,ย **๋๋ฒ๊น
๊ณผ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ํจ์ฌ ์ฉ์ด**ํด์ก๊ณ ,ย **ํ
์ ๊ท์น ์๋ฐ**ย ๋ฌธ์ ๋ ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.
+
+์ด์ฒ๋ผ,ย **์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ณต์กํด์ง์๋ก ์ปดํฌ๋ํธ์ ํ
์ ์ญํ ์ ๋ถ๋ฆฌ**ํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค. ํ
๋ด๋ถ์์ ์กฐ๊ฑด๋ถ ์ฒ๋ฆฌํ๊ธฐ๋ณด๋ค๋,ย **์์ ์ปดํฌ๋ํธ์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง**์ ํ๋ ๊ตฌ์กฐ๋ฅผ ํตํด, ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์์ ์ ๋ฐ์ดํฐ์ API, UI์ ๋ํ ์ฑ
์๋ง์ ๊ฐ์ง๋๋ก ํ๋ ๊ฒ์ดย **์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ, ๊ทธ๋ฆฌ๊ณ ์์ ์ฑ**ย ๋ชจ๋๋ฅผ ๋์ด๋ ํต์ฌ์ ์ธ ์์น์์ ๋ค์ ํ ๋ฒ ๊นจ๋ฌ์๋ค.
\ No newline at end of file
diff --git a/docs/trouble/useFunnel.md b/docs/trouble/useFunnel.md
new file mode 100644
index 00000000..d63ac883
--- /dev/null
+++ b/docs/trouble/useFunnel.md
@@ -0,0 +1,103 @@
+### โ ๋์
ํ ๊ธฐ์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ)๊ณผ ์ด์ (์๋ค๋ฉด ์๋ต ๊ฐ๋ฅ)
+
+- `useSearchParams` (react-router-dom)
+
+ โ URL ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ํผ๋ ๋จ๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์
ํ๋ค. ์๋ก๊ณ ์นจ์ด๋ ๊ณต์ ์์๋ ํ์ฌ ๋จ๊ณ๋ฅผ ์ ์งํ ์ ์๋ค.
+
+- ์ปค์คํ
ํ
`useFunnel`
+
+ โ ํผ๋ ๋จ๊ณ ๊ด๋ฆฌ, ์ด์ /๋ค์ ๋จ๊ณ ์ด๋, ์ ํจ์ฑ ๊ฒ์ฌ ๋ฑ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํํ๋ก ๋ถ๋ฆฌํด ๊ตฌ์กฐํํ๋ค.
+
+
+### โ ๋ฌธ์ ์์ฝ
+
+ํผ๋ ๊ตฌ์กฐ์ ์จ๋ณด๋ฉ์ ๊ตฌํํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค:
+
+1. ์จ๋ณด๋ฉ ๋์ค ์ฌ์ฉ์๊ฐ '๊ทธ๋ฃน ๋งค์นญ'์ ์ ํํ์ ๋, ํผ๋ ํ๋ฆ์ด ๊ฐ๋ผ์ง๋ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ ์ง.
+2. ํผ๋ ๋จ๊ณ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ก๊ทธ๋ ์ค ๋ฐ๋ฅผ ํ์ํ๋ ค ํ์ผ๋, **์ ์ฒด ์คํ
์๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋ ์ํฉ์์ ์งํ๋ฅ ์ ์ด๋ป๊ฒ ๊ณ์ฐํ ์ง**.
+3. ์๋ก๊ณ ์นจ ์ ํ์ฌ ๋จ๊ณ์ ์ ํ๊ฐ์ด ์ ์ง๋์ง ์์ **์งํ ์ค์ด๋ ์จ๋ณด๋ฉ์ด ์ด๊ธฐํ๋๋ UX ๋ฌธ์ **.
+4. ์ด๋ฏธ ์จ๋ณด๋ฉ์ ์๋ฃํ ์ฌ์ฉ์๊ฐ URL๋ก ๋ค์ ์ ์ํ์ ๋ **์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง** (์ฌ์ ๊ทผ ํ์ฉ? ํ ๋ฆฌ๋๋ ์
? ์๋ฌ ํ์ด์ง?).
+
+### โ ์์ธ ๋ถ์
+
+### 1. ํผ๋์ ๋์ ๋ถ๊ธฐ ๊ตฌ์กฐ
+
+์ฒ์์๋ ํ๋์ `useFunnel` ํ
์์์ `MATCHING_TYPE`์ ๋ฐ๋ผ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ค ํ์ผ๋,
+
+- ๋ถ๊ธฐ ์ ์๋ ์ ์ฒด ์คํ
์ ๊ฐ์๋ฅผ ์ ์ ์์ด `ProgressBar` ๊ณ์ฐ์ ๋ฌธ์ ๋ฐ์
+- `GROUP_FUNNEL_STEPS`๋ `FIRST_FUNNEL_STEPS`์ ๊ตฌ์กฐ๋ ๋ค๋ฅด๊ณ , ์ฟผ๋ฆฌ์คํธ๋ง๋ ๋ณ๋๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋ฏ๋ก ๊ฒฐ๊ตญ **๋ ํผ๋์ ๋ถ๋ฆฌ**ํจ
+
+### 2. ์๋ก๊ณ ์นจ ์ ์ํ ์ด๊ธฐํ
+
+- ์ํ(state)๋ `useState`๋ก๋ง ๊ด๋ฆฌ๋๊ณ ์์๊ณ , URL์ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ํ์ฌ `step`๋ง ์ ์ง๋จ
+- ์๋ก๊ณ ์นจ ์ `selections` ๊ฐ์ฒด๊ฐ ์ด๊ธฐํ๋๋ฏ๋ก, ์ด์ ์ ์ ํํ๋ ๊ฐ๋ค์ด ๋ชจ๋ ์ฌ๋ผ์ง โ ํผ๋ ํ๋ฆ์ ๋ค๋ก ๋์๊ฐ๋ UX๊ฐ ๋ถ์์ ํด์ง
+
+### 3. ์๋ฃ๋ ์ฌ์ฉ์์ ์ฌ์ ๊ทผ
+
+- API๋ฅผ ํตํด ์๋ฒ์ `POST` ์์ฒญ์ ๋ณด๋ธ ํ, ์ฌ์ฉ์๊ฐ `/onboarding` ์ฃผ์๋ก ๋ค์ ์ ์ํ ์ ์๋ ๊ตฌ์กฐ์์
+- ๋ค์ ์ ์ ์ ์๋ฃ๋ ์ฌ์ฉ์๋ ์จ๋ณด๋ฉ ํ๋ฆ์ผ๋ก ์ง์
๊ฐ๋ฅํด ์๋์น ์์ ์ฌ์์ฒญ ๋๋ ์ค๋ณต ์
๋ ฅ์ด ๋ฐ์ํ ์ ์์
+
+### โ ํด๊ฒฐ ๋ฐฉ๋ฒ
+
+### 1. ํผ๋ ๊ตฌ์กฐ ๋ถ๋ฆฌ ๋ฐ `navigate` ํ์ฉ
+
+- `MATCHING_TYPE` ๋จ๊ณ์์ "๊ทธ๋ฃน"์ ์ ํํ๋ฉด `navigate('/onboarding/group?step=GROUP_ROLE')`๋ก ์ด๋
+- ์ผ๋ฐ ์จ๋ณด๋ฉ๊ณผ ๊ทธ๋ฃน ์จ๋ณด๋ฉ์ ์์ ํ **๋ค๋ฅธ ํผ๋ ํ๋ฆ**์ผ๋ก ๋ถ๋ฆฌํ์ฌ `useFunnel(GROUP_FUNNEL_STEPS)`์ ๊ฐ๊ฐ ์ ์ฉ
+- `goTo`๋ฅผ ํตํด ์ฟผ๋ฆฌ์คํธ๋ง๋ง ๋ณ๊ฒฝํ๋ฉฐ ๋จ๊ณ ์ด๋ โ ์๋ก๊ณ ์นจ ํ์๋ ํด๋น ๋จ๊ณ ์ ์ง ๊ฐ๋ฅ
+
+### 2. `ProgressBar`์ ๋์ ์คํ
์ ์ฒ๋ฆฌ
+
+- ์ผ๋ฐ ํผ๋์์๋ `ProgressBar currentStep={progressOverride ?? currentIndex}`๋ก ๊ณ์ฐ
+- ๊ทธ๋ฃน ํผ๋๋ก ๋ถ๊ธฐ๋ ์ดํ์๋ `GROUP_FUNNEL_STEPS.length`๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ๋๋ก `ProgressBar` ๋ ๋๋ง
+- `progressOverride` state๋ฅผ ํตํด ์กฐ๊ฑด๋ถ๋ก ์ค๋ฒ๋ผ์ด๋ฉ ๊ฐ๋ฅํ๊ฒ ๊ตฌํ
+
+### 3. ์๋ก๊ณ ์นจ ์ ๋จ๊ณ ์ ์ง ๋ฐ ์๋ฌ ๋ฐฉ์ง
+
+- `useFunnel` ๋ด๋ถ์์ ์ฟผ๋ฆฌ์คํธ๋ง(`?step=X`)์ด ์๊ฑฐ๋ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ,
+
+ โ `setSearchParams({ step: steps[0] })`์ผ๋ก ๊ฐ์ ์ด๊ธฐํ
+
+ โ ์๋ชป๋ ์ ๊ทผ์ `navigate(ROUTES.ERROR)`๋ก ์๋ฌ ํ์ด์ง ์ ๋
+
+
+```tsx
+useEffect(() => {
+ if (!stepFromUrl) {
+ setSearchParams({ step: steps[0] }, { replace: true });
+ }
+ if (!isValidStep) {
+ navigate(ROUTES.ERROR, { replace: true });
+ }
+}, [...]);
+```
+
+### 4. ์๋ฃ๋ ์ฌ์ฉ์์ ์ฌ์ ๊ทผ ์ฒ๋ฆฌ
+
+- ์๋ฒ์์ ์ด๋ฏธ ์จ๋ณด๋ฉ์ ์๋ฃํ ์ฌ์ฉ์์ ๊ฒฝ์ฐ `/onboarding` ์ ์ ์ ํ์ผ๋ก redirect ๋๋๋ก ๊ฐ๋ ํ์
+- ํด๋ผ์ด์ธํธ์์ `GET /my/onboarding-status`์ ๊ฐ์ API๋ฅผ ํตํด ์งํ ์ฌ๋ถ ํ๋จ โ ์ง์
์ ํํ๊ฑฐ๋ ์ค๊ฐ๋จ๊ณ์์ redirect ์ฒ๋ฆฌ
+
+### โ ํ๊ณ ๋ฐ ๊ฐ์ ๋ฐฉํฅ
+
+- **ํผ๋ UI๋ ์ ์ ์ธ ํ๋ฆ์ ๊ฐ์ ํ๋ฉด ์ ๋ ๊ฒ ๊ฐ๋ค.**
+
+ ํนํ UX ํ๋ฆ ์ ์ฌ์ฉ์์ ์ ํ์ ๋ฐ๋ผ ๋ค์ ๋จ๊ณ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์,
+
+ ํผ๋ ์ ์ฒด ๋จ๊ณ๋ฅผ ํ๋์ ๊ณ ์ ๋ ๋ฆฌ์คํธ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ณด๋ค **๋ถ๊ธฐ๋ณ ํผ๋์ ๋๋๊ณ ๊ตฌ์กฐ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ์์ ์ **์ด์๋ค.
+
+- **ProgressBar ๊ณ์ฐ์ ํผ๋ ํ๋ฆ์ ๊ฐํ๊ฒ ์์กดํ๋ค.**
+
+ โ์ ์ฒด ๋จ๊ณ ์๋ฅผ ์ด๋๊น์ง ๊ณ์ฐํ ๊ฒ์ธ๊ฐโ๋ผ๋ ๋ฌธ์ ๋ ๋ถ๊ธฐ๋ฅผ ํฌํจํ๋ฉด ๋ ๋ณต์กํด์ง๋ฏ๋ก,
+
+ ๋ถ๊ธฐ๋ ํผ๋ ํ๋ฆ๋ง๋ค ๊ณ ์ ํ `useFunnel`์ ๊ด๋ฆฌํ๊ณ `progressOverride` ๋ฑ์ ํ์ฉํ๋ ์ ๋ต์ด ํจ๊ณผ์ ์ด์๋ค.
+
+- **URL ๊ธฐ๋ฐ ์ํ ๊ด๋ฆฌ์ ์ฅ์ **
+
+ `useSearchParams`๋ฅผ ํตํด ํผ๋ ๋จ๊ณ๋ฅผ URL์ ๋ช
์ํ ๋๋ถ์, ์๋ก๊ณ ์นจ/๋ค๋ก๊ฐ๊ธฐ/์ง์ ์ ๊ทผ ๋ฑ์ ์๋๋ฆฌ์ค์์๋ ์ํ๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์๋ค.
+
+- **์ํ ์ ์ง์ ์ด๊ธฐํ์ ๊ท ํ ํ์**
+
+ selections๋ฅผ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ ์ง ์ฌ๋ถ๋ ์์ง ๋ณด๋ฅํ์ง๋ง, ์ด๊ธฐ์๋ ์์ ํ ์ฌ๋ผ์ง๋ UX๊ฐ ๋๋ฌด ๋ถ์น์ ํด์ ์ถํ์๋ `step`๋ง ์ ์งํ๊ณ ๊ฐ์ ์์์ ์ผ๋ก `sessionStorage`์ ์ ์ฅํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ ์ ์์ ๋ฏํ๋ค.
+
+- **์ค๋ณต ์ ๊ทผ ๋ฐฉ์ง ํ์**
+
+ ์ด๋ฏธ ์๋ฃ๋ ์ฌ์ฉ์์ `/onboarding` ์ฌ์ ๊ทผ ์ด์๋ ์์ง ๋ช
ํํ UX ๊ธฐ์ค์ด ์๋ค๋ฉด ์๋ฒ์์ ์ง์
์ ํ flag๋ฅผ ๋ด๋ ค์ฃผ๋ ๊ตฌ์กฐ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์์ ํ ๊ฒ ๊ฐ๋ค.
\ No newline at end of file