๐จ ํ๋กฌํํธ ๋ง์ผ UI/UX ๊ฐ์ : ์ข์์, ์ญ์ , ๊ทธ๋ฆฌ๊ณ ๋ํ ์ผ
โจ ์์ ๋ํ ์ผ์ด ๋ช ํ์ ๋ง๋ญ๋๋ค. ์ค๋์ ํ๋กฌํํธ ๋ง์ผ์ ์์ฑ๋๋ฅผ ๋์ด๋ ๋ ์ ๋๋ค.
๐ ์ค๋์ ์์ ์์ฝ
๊ธฐ์กด Bitdak ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ์ 'ํ๋กฌํํธ ๋ง์ผ'์ด๋ผ๋ ์๋ก์ด ์ ์ฒด์ฑ์ ๋ง์ถฐ ์์ ํ ์ ํํ์ต๋๋ค. ๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด, ์ข์์ ๋ฒํผ์ ์๊ฐ์ ํผ๋๋ฐฑ, ์ง๊ด์ ์ธ ๋ผ์ฐํ , ๊ทธ๋ฆฌ๊ณ ์์ฑ์ ๊ฒฝํ์ ์ํ ์ญ์ ๊ธฐ๋ฅ๊น์ง ๋ํ ์ผ์ ๋ค๋ฌ์์ต๋๋ค.
๐ ๏ธ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ (Key Changes)
1. ๋ค๋น๊ฒ์ด์ ๋ฐ ๋ผ์ฐํ ๋ํตํฉ
- URL ๊ตฌ์กฐ ๋ณ๊ฒฝ:
/communityโ/prompt - ํค๋ ๋ค๋น๊ฒ์ด์ ์ง๊ดํ: 'Dashboard' โ 'ํ', 'Community' โ 'ํ๋กฌํํธ', 'Scripts' โ '์ปค๋ฎค๋ํฐ'๋ก ๋ณ๊ฒฝํ์ฌ ์ ์ ํผ๋์ ์ค์์ต๋๋ค.
2. ์ข์์ ๊ธฐ๋ฅ ๊ณ ๋ํ (Visual & Logic)
๋จ์ํ ์ซ์๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ๋์ด, ์ฌ์ฉ์๊ฐ '๋ด๊ฐ ์ด ๊ธ์ ์ข์ํ๋ค'๋ ๊ฒ์ ํ์คํ ๋๋ ์ ์๋๋ก ์๊ฐ์ ํผ๋๋ฐฑ์ ๊ฐํํ์ต๋๋ค. ๋ํ ๋ฐฑ์๋ ๋ก์ง์ ํตํด ์ค๋ณต ์ข์์๋ฅผ ๋ฐฉ์งํ์ต๋๋ค.
// UI: ๋๋ ์ ๋๋ง ๋นจ๊ฐ์์ผ๋ก ํ์คํ ํผ๋๋ฐฑ
<Heart className={`h-5 w-5 ${post.isLiked ? "fill-red-500 text-red-500" : "text-[var(--brand-primary)]"}`} />
// Logic: ์์ ๋ฐฉ์ง ๋ฐ Optimistic UI ์
๋ฐ์ดํธ
const newCount = Math.max(0, post.likes + (newStatus ? 1 : -1));
3. ๊ฒ์๊ธ ์ญ์ ๋ฐ ์ฒญ์
- ์์ฑ์(Author)์๊ฒ๋ง ๋ณด์ด๋ ์ญ์ ๋ฒํผ(Trash Icon) ๊ตฌํ.
- UI ๊ฐ์ํ: ๋ถํ์ํ '๋ฌด๋ฃ' ํ ์คํธ ๋ฑ์ง๋ฅผ ์ ๊ฑฐํ๊ณ , ๊น๋ํ ๊ฐ๊ฒฉ ํ์๋ก ๋ณ๊ฒฝ.
๐ ๋ฒ๊ทธ ์ฌ๋ฅ (Troubleshooting)
- React Child Error ํด๊ฒฐ: Supabase join ์ฟผ๋ฆฌ์์
likes๊ด๊ณ๋ช ๊ณผ ์ซ์ ์ปฌ๋ผ์ด ์ถฉ๋ํ๋ ๋ฌธ์ ๋ฅผ alias(user_likes) ์ฒ๋ฆฌ๋ก ํด๊ฒฐํ์ต๋๋ค. - Mono-repo Transpile: Next.js ์ค์ ์ ํจํค์ง ํธ๋์คํ์ผ ์ต์ ์ ์ถ๊ฐํ์ฌ ์ฐธ์กฐ ์ค๋ฅ๋ฅผ ์์ ํ์ต๋๋ค.
๐ ์ํ
๊ธฐ๋ฅ์ด '์๋'ํ๋ ๊ฒ๊ณผ ์ฌ์ฉ์๊ฐ '๋ง์กฑ'ํ๋ ๊ฒ์ ๋ค๋ฆ ๋๋ค. ์ค๋ ์ข์์ ๋ฒํผ์ ๋นจ๊ฐ ํํธ ํ๋๊ฐ ์ฌ์ฉ์์๊ฒ ์ฃผ๋ ๋ง์กฑ๊ฐ์ ์๊ฐ๋ณด๋ค ํฝ๋๋ค. ์์ผ๋ก๋ ์ด๋ฐ ๋ํ ์ผ์ ๋์น์ง ์๋ ๊ฐ๋ฐ์ ์งํฅํด์ผ๊ฒ ์ต๋๋ค.
โฌ๏ธ ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด, ์๋ ๊ด๊ณ ๋ฅผ ํ ๋ฒ๋ง ํด๋ฆญํด์ฃผ์ธ์! ์ ์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค ๐โโ๏ธ โฌ๏ธ