๊ฐ์ด๋ ์ ๋ณด๋ฅผ ๋๋๋ ํซ๋ ์ปค๋ฎค๋ํฐ ํฌ๋ผ
์ค์๊ฐ ํซ๋ ์ ๋ณด์ ์๋น์ ํ๊ธฐ, ๊ฟํ์ ๊ณต์ ํ ์ ์๋ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ชฉํ๋ก ์ง์ ๊ธฐํํ๊ณ ๊ฐ๋ฐํ ์น ํฌ๋ผ ์๋น์ค์ ๋๋ค.
- ๐ธ ๋ฐ๋ชจ ๋ฐ ๋ฐฐํฌ ๋งํฌ
- ๐ก ํ๋ก์ ํธ ํ์ ๋ฐฐ๊ฒฝ
- ๐ฏ ํต์ฌ ๊ธฐ๋ฅ ๋ฐ ์ฌ์ฉ์ ์๋๋ฆฌ์ค
- ๐ ๊ธฐ์ ์คํ ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ
- ๐ ๊ธฐ์ ์คํ ์ ํ ์ด์
- ๐ ์คํ ๋ฐฉ๋ฒ
- ๐ณ Docker๋ก ์คํํ๊ธฐ
- ๐ธ ์ฃผ์ ํ๋ฉด ์คํฌ๋ฆฐ์ท
- ๐ง ์ฃผ์ ํธ๋ฌ๋ธ ์ํ ํ์คํ ๋ฆฌ
- ๐ ํ๋ก์ ํธ ์ฑ๊ณผ ๋ฐ ์ฌ์ฉ์ ํผ๋๋ฐฑ
- ๐ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ฐฐ์ด ์
- ๐ ํฅํ ๋ฐ์ ๋ฐฉํฅ
- ๐จโ๐ป ๊ฐ๋ฐ์ ์ ๋ณด
- ๐ ๋ง์น๋ฉฐ
๊ธฐ์กด ํซ๋ ์ ๋ณด ๊ณต์ ๋ ์ฃผ๋ก ํน์ ๋ถ์ผ ์ค์ฌ์ ์ปค๋ฎค๋ํฐ์์ ์ด๋ฃจ์ด์ก์ต๋๋ค.
ํ์ฌ ์ํฉ:
- ์๋ฅ ์ปค๋ฎค๋ํฐ โ ์๋ฅ ๊ด๋ จ ํซ๋๋ง ๊ณต์
- ์ ์๊ธฐ๊ธฐ ์ปค๋ฎค๋ํฐ โ ์ ์์ ํ ํซ๋๋ง ๊ณต์
- ํด๋ํฐ ์ปค๋ฎค๋ํฐ โ ํต์ ๊ด๋ จ ํซ๋๋ง ๊ณต์
ํต์ฌ ๋ฌธ์ ์ :
- ์นดํ ๊ณ ๋ฆฌ ํธํฅ: ํน์ ๋ถ์ผ์ ๊ด์ฌ ์๋ ์ฌ๋๋ค์ด ํด๋น ์นดํ ๊ณ ๋ฆฌ ํซ๋๋ง ์ง์ค ๊ณต์
- ์ ๋ณด ๋ถ์ฐ: ๋ค์ํ ๋ถ์ผ์ ํซ๋์ ์ฐพ์ผ๋ ค๋ฉด ์ฌ๋ฌ ์ปค๋ฎค๋ํฐ๋ฅผ ๋์๋ค๋ ์ผ ํจ
- ํซ๋ ๋ณธ์ง ํฌ์: "ํซ๋ ์์ฒด"๋ณด๋ค๋ "ํด๋น ์นดํ ๊ณ ๋ฆฌ ์ ํ"์ ๋ํ ๊ด์ฌ์ด ์ฐ์
์ง์ง ํซ๋๋ฌ๋ค์ ์ํ, ํซ๋ ๊ทธ ์์ฒด์ ์ง์คํ๋ ํ๋ซํผ์ด ์๋ค
๋ชฉํํ ์ฐจ๋ณ์ :
- ์นดํ ๊ณ ๋ฆฌ์ ์๊ด์์ด ํ ์ธ์จ๊ณผ ๊ฐ์ฑ๋น ์์ฒด์ ์ง์ค
- ์๋ฅ๋ถํฐ ์ ์๊ธฐ๊ธฐ, ์ํํ๊น์ง ๋ชจ๋ ๋ถ์ผ์ ํซ๋์ ํ ๊ณณ์์
- ํน์ ๋ถ์ผ ์ ๋ฌธ๊ฐ๊ฐ ์๋ ํซ๋ ์ฐพ๊ธฐ์ ๋ฌ์ธ๋ค์ด ๋ชจ์ด๋ ๊ณต๊ฐ
- ์ค์๊ฐ์ฑ: ํซ๋ ์ ๋ณด๋ฅผ ์ฆ์ ๊ณต์ ํ๊ณ ํ์ธํ ์ ์๋ ํ๊ฒฝ
- ์ ๋ขฐ์ฑ: ๊ตฌ๋งค ํ๊ธฐ์ ์ฃผ์์ฌํญ์ ํตํ ๊ฒ์ฆ๋ ์ ๋ณด ์ ๊ณต
- ์ฌ์ฉ์ฑ: ์ง๊ด์ ์ธ UI๋ก ๋๊ตฌ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ๋ซํผ
์ฌ์ฉ์ ์คํ ๋ฆฌ: "๋ฐฉ๊ธ ๋ฐ๊ฒฌํ ์ข์ ๋์ ๋น ๋ฅด๊ฒ ๊ณต์ ํ๊ณ ์ถ์ด์"
- ๊ฐํธํ ๊ฒ์๊ธ ์์ฑ (์ ๋ชฉ 10์ ์ด์ ์ ํจ์ฑ ๊ฒ์ฌ๋ก ํ์ง ๊ด๋ฆฌ)
- ์ค์๊ฐ ๊ฒ์๊ธ ์ ๋ฐ์ดํธ
- ์ข์์/๋ถ๋งํฌ๋ก ์ ์ฉํ ์ ๋ณด ์ ์ฅ
์ฌ์ฉ์ ์คํ ๋ฆฌ: "์ํ๋ ์ํ์ ํซ๋ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ ์ถ์ด์"
- ์ค์๊ฐ ๊ฒ์์ผ๋ก ์ฆ์ ๊ฒฐ๊ณผ ํ์ธ
- ๊ฒ์ ๋ชจ๋ฌ UI๋ก ๋๊น ์๋ ์ฌ์ฉ์ ๊ฒฝํ
- Firestore ์ธ๋ฑ์ค ์ต์ ํ๋ก ๋น ๋ฅธ ๊ฒ์ ์๋ ๊ตฌํ
์ฌ์ฉ์ ์คํ ๋ฆฌ: "๋ด ์ทจํฅ์ ๋ง๋ ํ๊ฒฝ์์ ํธ๋ฆฌํ๊ฒ ์ด์ฉํ๊ณ ์ถ์ด์"
- Google ๊ฐํธ ๋ก๊ทธ์ธ
- ๋คํฌ/๋ผ์ดํธ ๋ชจ๋ ์ง์
- ๊ฐ์ธ ํ๋ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ
| ๊ตฌ๋ถ | ๋ด์ฉ |
|---|---|
| Frontend | React, React Router |
| Language | TypeScript (JavaScript์์ ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ) |
| State Management | Redux Toolkit, React Query |
| State Persistence | redux-persist |
| Styling | styled-components, ThemeProvider |
| Custom Hook | useOnClickOutside, useInfinitePosts ๋ฑ ์์ฒด ๊ตฌํ |
| Architecture | FSD (Feature-Sliced Design) |
| Build Tool | CRA โ Vite |
| Authentication | Firebase Authentication (Google Login) |
| Database | Firebase Cloud Firestore |
| ์ปจํ ์ด๋ํ | Docker, Docker Compose, Nginx |
| ๋ฐฐํฌ ํ๊ฒฝ | GitHub Pages, Docker Container |
- React + TypeScript: ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ ์์ ์ฑ์ ํตํ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ
- Redux Toolkit: ๋ณต์กํ ์ฌ์ฉ์ ์ํ์ ๊ฒ์๋ฌผ ์ํ์ ์ผ๊ด๋ ๊ด๋ฆฌ
- React Query: ์๋ฒ ์ํ ์บ์ฑ์ผ๋ก ๋ถํ์ํ API ํธ์ถ ์ต์ํ
- Firebase: ๋น ๋ฅธ ํ๋กํ ํ์ดํ๊ณผ ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ ์ง์
- Firestore: NoSQL์ ์ ์ฐ์ฑ๊ณผ ์ค์๊ฐ ๋ฆฌ์ค๋๋ฅผ ํตํ ์ฆ์ ์ ๋ฐ์ดํธ
- Vite: CRA ๋๋น 3๋ฐฐ ๋น ๋ฅธ ๋น๋ ์๋๋ก ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์
- GitHub Pages: ๋ฌด๋ฃ ํธ์คํ ์ผ๋ก ๋น ๋ฅธ MVP ๊ฒ์ฆ
- Docker: ํ๊ฒฝ ๋ ๋ฆฝ์ ์คํ๊ณผ ์ผ๊ด๋ ๋ฐฐํฌ ํ๊ฒฝ ์ ๊ณต
- Docker + Nginx: ํ๋ก๋์ ํ๊ฒฝ๊ณผ ๋์ผํ ๋ฉํฐ ์คํ ์ด์ง ๋น๋
- Docker Compose: ๊ฐ๋ฐ์ ์นํ์ ์ธ ๊ฐํธํ ๋ก์ปฌ ์คํ ํ๊ฒฝ
- ํ๊ฒฝ ๊ฒฉ๋ฆฌ: Node.js ๋ฒ์ ์ด๋ ์์กด์ฑ ์ถฉ๋ ์๋ ์์ ์ ์คํ
- Node.js 18.0 ์ด์
- npm ๋๋ yarn
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/ensil-dev/DogGain_Forum.git
cd DogGain_Forum/forum_client# 2. ์์กด์ฑ ์ค์น
npm install --legacy-peer-deps# 3. ๊ฐ๋ฐ ์๋ฒ ์คํ
npm start# 4. ํ๋ก๋์
๋น๋
npm run build# .env ํ์ผ ์์ฑ ํ Firebase ์ค์ , kakao api key ์ถ๊ฐ
VITE_apiKey=your_api_key
VITE_authDomain=your_auth_domain
VITE_projectId=your_project_id
VITE_storageBucket=your_storageBucket
VITE_messagingSenderId=your_messagingSenderId
VITE_appId=your_appId
VITE_measurementId=your_measurementId
VITE_KAKAO_JAVASCRIPT_KEY=your_KAKAO_JAVASCRIPT_KEYDocker๋ฅผ ์ฌ์ฉํ๋ฉด ํ๊ฒฝ์ ๊ด๊ณ์์ด ์ผ๊ด๋ ์คํ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ ์๋ฎฌ๋ ์ด์ ๊ณผ ๋ฐฐํฌ ํ ์คํธ์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- Docker
โ ๏ธ ํ๊ฒฝ๋ณ์ ์ค์ ํ์ - ํ๊ฒฝ๋ณ์ ์ค์ ์น์ ์ฐธ๊ณ
# 1. ์ ์ฅ์ ํด๋ก ๋ฐ ์์กด์ฑ ์ค์น
git clone https://github.com/ensil-dev/DogGain_Forum.git
cd DogGain_Forum/forum_client
npm install
# 2. ํ๊ฒฝ๋ณ์ ์ค์ (.env ํ์ผ ์์ฑ)
# โ ๏ธ ์ด ๋จ๊ณ ์์ด๋ Firebase ์ฐ๊ฒฐ์ด ์คํจํ์ฌ ์ฑ์ด ์ ์ ๋์ํ์ง ์์ต๋๋ค
# ํ๊ฒฝ๋ณ์ ์ค์ ๋ฐฉ๋ฒ์ ์ '์คํ ๋ฐฉ๋ฒ' ์น์
์ 'ํ๊ฒฝ ๋ณ์ ์ค์ ' ์ฐธ๊ณ
# 3. ์์คํฑ ๋ฐฐํฌ ํ
์คํธ (๋น๋ + ์คํ)
npm run docker:testnpm run docker:build # Docker ์ด๋ฏธ์ง ๋น๋
npm run docker:start # ์ปจํ
์ด๋ ์์ (8080 ํฌํธ)
npm run docker:stop # ์ปจํ
์ด๋ ์ค์ง์คํ ์๋ฃ ํ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์ฃผ์๋ก ์ ์:
- ๋ก์ปฌ ์ ์: http://localhost:8080
# ์ปจํ
์ด๋ ์ํ ํ์ธ
docker ps -f name=doggain-forum
# ์ปจํ
์ด๋ ์ค์ง
docker stop doggain-forum
# ์ปจํ
์ด๋ ์ ๊ฑฐ
docker rm doggain-forum
# ์ด๋ฏธ์ง ์ ๊ฑฐ
docker rmi doggain-forum:latest# ์ค์๊ฐ ๋ก๊ทธ ํ์ธ
docker logs -f doggain-forum- ๋ฌดํ ์คํฌ๋กค๋ก ๊ฒ์๊ธ ๋ชฉ๋ก ๋ก๋ฉ
- ๊ฒ์๊ธ ์์ฑ
- ์์ธ ๊ฒ์๊ธ ์กฐํยท์์ ยท์ญ์
- ์ข์์
- ๋ถ๋งํฌ ์ค์
- ๊ฒ์๊ธ ๊ณต์
- ์กฐํ์ ์นด์ดํธ
- ๋๊ธ ๋ฌ๊ธฐ
- ์ค์๊ฐ ๊ฒ์๊ณผ ๊ฒ์ ๋ชจ๋ฌ UI ์ ๊ณต
- Google ๋ก๊ทธ์ธ ๋ฐ ๋ก๊ทธ์์
- ํ๋กํ ์ค์ (ํ๋กํ ์ฌ์ง ๋ณ๊ฒฝ, ๋๋ค์ ํธ์ง)
- ์ฌ์ฉ์ ํ์คํ ๋ฆฌ
- ๋ถ๋งํฌ ๊ด๋ฆฌ
- ์ฌ์ฉ์ ํต๊ณ ๊ทธ๋ํ / ๊ด๋ฆฌ์ ์ด๋ฉ์ผ ๋ฑ๋กยท์ญ์ / ์ฌ์ฉ์ ๊ฒ์๊ธยท๋๊ธ ๊ด๋ฆฌ
- ๋คํฌ ๋ชจ๋ยท๋ผ์ดํธ ๋ชจ๋ ์ ํ ํ ๊ธ
๋ฌธ์ : ๊ฒ์๊ธ ๊ฒ์ ์ ์ ์ฒด ๋ฐ์ดํฐ ๋ก๋๋ก ์ธํ ์๋ต ์ง์ฐ ๋ฐ ๋คํธ์ํฌ ํธ๋ํฝ ๊ณผ๋ค ๋ฐ์
์์ธ ๋ถ์:
- ์ ์ฒด ๊ฒ์๊ธ์ ๊ฐ์ ธ์จ ํ ํด๋ผ์ด์ธํธ์์ ํํฐ๋งํ๋ ๋นํจ์จ์ ๊ตฌ์กฐ
- Firestore ๊ฒ์ ์ธ๋ฑ์ค(
keywordsํ๋) ๋ถ์ฌ - ๊ฒ์ ์ฟผ๋ฆฌ ์ต์ ํ ๋ฏธ์ ์ฉ
ํด๊ฒฐ ๊ณผ์ :
// Before: ์ ์ฒด ๋ฐ์ดํฐ ๋ก๋ ํ ํด๋ผ์ด์ธํธ ํํฐ๋ง
const q = query(collection(db, 'posts'), orderBy('created', 'desc'));
const snap = await getDocs(q);
const posts = snap.docs.map((d) => ({ ...d.data(), id: d.id }));
return filterPostsByKeyword(posts, keyword, type).slice(0, limitCount);
// After: Firestore ์ธ๋ฑ์ค ์ฟผ๋ฆฌ ํ์ฉ
// ๋จ์ผ ํค์๋ ๊ฒ์
const q = query(
collection(db, 'posts'),
where('keywords', 'array-contains', keyword.toLowerCase()),
orderBy('created', 'desc'),
limit(limitCount)
);
// ๋ค์ค ํค์๋ ๊ฒ์
const q = query(
collection(db, 'posts'),
where('keywords', 'array-contains-any', tokens),
orderBy('created', 'desc'),
limit(limitCount)
);์ฑ๊ณผ: ๊ฒ์ ์๋ต์๊ฐ 70-80% ๋จ์ถ, ๋คํธ์ํฌ ํธ๋ํฝ 90% ๊ฐ์, ์๋ฒ ์ฌ์ด๋ ์ฟผ๋ฆฌ ์ต์ ํ๋ก ํ์ฅ์ฑ ๋ํญ ํฅ์
๋ฌธ์ : ์๋ก๊ณ ์นจํ ๋๋ง๋ค ์กฐํ์๊ฐ ์ฆ๊ฐํ๋ ํ์
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ ์กฐํ ๊ธฐ๋ก ๊ด๋ฆฌ
- ๋์ผ ์ฌ์ฉ์์ 24์๊ฐ ๋ด ์ค๋ณต ์กฐํ ๋ฐฉ์ง ๋ก์ง ๊ตฌํ
์ํฅ: ์ ํํ ์ธ๊ธฐ ๊ฒ์๊ธ ์์ ์ ๊ณต์ผ๋ก ์ฌ์ฉ์ ๋ง์กฑ๋ ํฅ์
๋ฌธ์ : JavaScript ํ๊ฒฝ์์ ๋น๋ฒํ ํ์ ๊ด๋ จ ๋ฐํ์ ์ค๋ฅ ๋ฐ์
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต:
- ํต์ฌ ์ปดํฌ๋ํธ๋ถํฐ ์ ์ง์ ์ ์ฉ
- ๊ณตํต ํ์ ์ ์๋ฅผ ํตํ ์ฌ์ฌ์ฉ์ฑ ํ๋ณด
- Strict ๋ชจ๋ ํ์ฑํ๋ก ํ์ ์์ ์ฑ ๊ทน๋ํ
์ฑ๊ณผ: ๊ฐ๋ฐ ์ค ํ์ ๊ด๋ จ ์ค๋ฅ ์ฌ์ ๋ฐ๊ฒฌ, ์ฝ๋ ํ์ง ๋ํญ ํฅ์
๋ฌธ์ : Redux store๊ฐ ๋น๋ํด์ง๋ฉด์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐ์
ํด๊ฒฐ:
- React Query๋ก ์๋ฒ ์ํ ๋ถ๋ฆฌ
- Redux๋ ์ฌ์ฉ์ ์ธ์ฆ ์ํ๋ง ๊ด๋ฆฌํ๋๋ก ์ญํ ์ถ์
- useMemo, useCallback ์ ์ ํ ํ์ฉ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ
- ๊ฒ์ ์๋: 3์ด โ 1์ด ์ด๋ด (3๋ฐฐ ํฅ์)
- ๋ฐํ์ ์ค๋ฅ: TypeScript ๋์ ์ผ๋ก 90% ๊ฐ์
- ๋น๋ ์๊ฐ: CRA โ Vite ์ ํ์ผ๋ก 70% ๋จ์ถ
- ๋คํฌ ๋ชจ๋: "๋์ ํผ๋ก๊ฐ ์ค์ด๋ค์ด ๋ ์ค๋ ์ฌ์ฉํ๊ฒ ๋จ"
- ์ค์๊ฐ ๊ฒ์: "์ํ๋ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ด ํธ๋ฆฌํจ"
- ๋ฌดํ ์คํฌ๋กค: "ํ์ด์ง ์ด๋ ์์ด ์์ฐ์ค๋ฝ๊ฒ ์ฝํ ์ธ ํ์ ๊ฐ๋ฅ"
- ์ฑ๋ฅ ์ต์ ํ์ ์ค์์ฑ: ์ฌ์ฉ์ ๊ฒฝํ์ ๊ธฐ๋ฅ๋ณด๋ค ์๋์ ๋ ๋ฏผ๊ฐ
- ์ ์ง์ ๊ฐ์ : JavaScript โ TypeScript ๋ง์ด๊ทธ๋ ์ด์ ์ ํตํ ์์ ํ ์ฝ๋๋ฒ ์ด์ค ๊ตฌ์ถ
- ์ ์ ํ ๊ธฐ์ ์ ํ: Firebase์ ์ค์๊ฐ ๊ธฐ๋ฅ์ ํ์ฉํ ๋น ๋ฅธ MVP ๊ตฌํ
- ์ฌ์ฉ์ ์ค์ฌ ์ฌ๊ณ : ๊ธฐ์ ์ ์์ฑ๋๋ณด๋ค ์ค์ ์ฌ์ฉ์ฑ ์ฐ์
- ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ: FSD ์ํคํ ์ฒ๋ก ๊ธฐ๋ฅ ์ถ๊ฐ ์ ์ ์ง๋ณด์์ฑ ํ๋ณด
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ : ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ํตํ ์ง์์ ๊ฐ์
- PWA ์ง์์ผ๋ก ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ์ ๊ฒฝํ ์ ๊ณต
- ์ค์๊ฐ ์๋ฆผ ์์คํ ๊ตฌํ
- Vitest ๊ธฐ๋ฐ ํ ์คํธ ์ฝ๋ ์์ฑ
- AI ๊ธฐ๋ฐ ๊ฐ์ธ ๋ง์ถค ํซ๋ ์ถ์ฒ
- ์ํ ๊ฐ๊ฒฉ ๋ณ๋ ์๋ฆผ ๊ธฐ๋ฅ
- ์์ ๋ก๊ทธ์ธ ํ์ฅ (์นด์นด์ค, ๋ค์ด๋ฒ)
์ด์ ์ค - Full Stack Developer
- ๐ง Email: dlwjd164@gmail.com
- ๐ GitHub: ensil-dev
- ์๋น์ค ๊ธฐํ ๋ฐ UX ์ค๊ณ (100%)
- Frontend ๊ฐ๋ฐ (100%)
- Firebase ๋ฐฑ์๋ ๊ตฌ์ถ (100%)
- ์ฑ๋ฅ ์ต์ ํ ๋ฐ ํธ๋ฌ๋ธ ์ํ (100%)
DogGain Forum์ ๋จ์ํ ๊ฐ๋ฐ ์ค์ต์ ๋์ด, ์ค์ ์ปค๋ฎค๋ํฐ ์ฌ์ฉ์๋ค์ด ๊ฒช๋ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ ๋ฌธ์ ์์์์ ์ถ๋ฐํ ํ๋ก์ ํธ์ ๋๋ค.
์ฒ์์๋ ๋จ์ํ "ํซ๋ ์ ๋ณด๋ฅผ ๋ชจ์๋ณด์"๋ ์์ด๋์ด์์ง๋ง, ๊ฐ๋ฐ์ ์งํํ๋ฉด์ ๊ธฐ์กด ์ปค๋ฎค๋ํฐ๋ค์ด ๊ฐ๋ ์นดํ ๊ณ ๋ฆฌ ํธํฅ, ์ ๋ณด ๋ถ์ฐ, UX ๋นํจ์จ๊ณผ ๊ฐ์ ์ค์ง์ ์ธ ๋ฌธ์ ๋ค์ด ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด์ ๋ฐ๋ผ ๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด์, ์ฌ์ฉ์ ๊ฒฝํ์ ์ค์ฌ์ผ๋ก ๊ธฐ๋ฅ์ ์ฐ์ ์์๋ฅผ ์กฐ์ ํ๊ณ , ๊ฒ์ ์ต์ ํยท์ค๋ณต ์กฐํ ๋ฐฉ์งยท๋คํฌ๋ชจ๋ ์ง์ ๋ฑ ์ฌ์ฉ์๊ฐ ๊ฒช๋ ๋ถํธํจ์ ์ง์ ํด๊ฒฐํ๋ ๋ฐ ์ง์คํ์ต๋๋ค.
ํนํ, ๊ฒ์ ์ฑ๋ฅ ๊ฐ์ ์ ์ํ Firestore ์ฟผ๋ฆฌ ์ต์ ํ, ์ธ์ ๊ธฐ๋ฐ ์กฐํ์ ์ค๋ณต ๋ฐฉ์ง, ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฐ ๋ฌดํ ์คํฌ๋กค ์ค๊ณ ๋ฑ์ ๋ชจ๋ "์ฌ์ฉ์"๋ฅผ ๊ณ ๋ คํ ์์ฌ๊ฒฐ์ ์ด์๊ณ , ์ด๋ ๊ธฐ์ ์ ํ์ต ๊ทธ ์ด์์ผ๋ก ํฐ ์ฑ์ฅ์ ์ด๋์์ต๋๋ค.
DogGain Forum์ ๋จ์ํ ํซ๋ ์ ๋ณด๋ฅผ ๋ชจ์ผ๋ ์๋น์ค๊ฐ ์๋๋ผ, ํซ๋์ ์ฌ๋ํ๋ ์ฌ๋๋ค์ ์ํ ํจ์จ์ ์ธ ์ ๋ณด ๊ณต์ ํ๋ซํผ์ ์งํฅํฉ๋๋ค. ์์ผ๋ก๋ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๋ฐํ์ผ๋ก, ์ค์ง์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ ํด๊ฒฐํ๋ ๊ฐ๋ฐ์๋ก์ ๊พธ์คํ ๊ฐ์ ํด ๋๊ฐ๊ฒ ์ต๋๋ค.
๋ ๋์ ์ปค๋ฎค๋ํฐ, ๋ ์ ์ฉํ ํซ๋ ๊ฒฝํ์ ํจ๊ป ๋ง๋ค์ด๊ฐ๊ณ ์ถ๋ค๋ฉด ์ธ์ ๋ ํธํ๊ฒ ์ฐ๋ฝ ์ฃผ์ธ์! ๐ถ๐