ํ๊ตญ์ ๋ค์ํ ๋งค๋ ฅ์ ๊ณต์ ํ๋ ์์ ํ๋ซํผ
- Google Maps API ๊ธฐ๋ฐ ์ธํฐ๋ํฐ๋ธ ์ง๋
- Google Places API ์ฐ๋ ์ฅ์ ๊ฒ์
- ์นดํ ๊ณ ๋ฆฌ๋ณ ์ฅ์ ํํฐ๋ง (์ฌํ์ง, ๋ง์ง, ์นดํ)
- ์ฅ์ ์์ธ ์ ๋ณด ์กฐํ (์ด์์๊ฐ, ์ ํ๋ฒํธ, ์น์ฌ์ดํธ)
- ์ฅ์ ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ์์น ๊ธฐ๋ฐ ๊ทผ์ฒ ์ฅ์ ๊ฒ์
- community: ์ฌ์ฉ์ ์์ ๊ฒ์ํ
- ๊ฒ์๊ธ ์์ฑ/์์ /์ญ์
- ๋๊ธ ์์คํ
- ์ข์์/์คํฌ๋ฉ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ (์ฌํํ, ๋ง์ง๋ฆฌ๋ทฐ, ์นดํ๋ฆฌ๋ทฐ, ์ผ๋ฐ)
- trend: ํธ๋ ๋ ๊ฒ์๊ธ (๊ด๋ฆฌ์ ์ ์ฉ)
- ๊ด๋ฆฌ์๋ง ์์ฑ/์์ ๊ฐ๋ฅ
- ์ข์์/์คํฌ๋ฉ ๊ธฐ๋ฅ
- tips: ์ฌํ ํ ๊ฒ์๊ธ (๊ด๋ฆฌ์ ์ ์ฉ)
- ๊ด๋ฆฌ์๋ง ์์ฑ/์์ ๊ฐ๋ฅ
- ๋๊ธ ๊ธฐ๋ฅ ์์
- ์ฌ์ฉ์ ํ๋ ํต๊ณ (๊ฒ์๊ธ, ๋๊ธ, ์ข์์, ์คํฌ๋ฉ ์)
- ๋ถ๋งํฌํ ์ฅ์ ๋ชฉ๋ก ์กฐํ
- ์คํฌ๋ฉํ ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
- ์์ฑํ ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
- ์์ฑํ ๋๊ธ ๋ชฉ๋ก ์กฐํ
- Google OAuth 2.0 ์์ ๋ก๊ทธ์ธ
- JWT ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- HttpOnly ์ฟ ํค ๋ณด์
- ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด (user/admin)
- ์๋ ํ ํฐ ๊ฐฑ์ ์ง์
- NestJS 11 - Node.js ํ๋ ์์ํฌ
- TypeORM - ORM (MySQL)
- Passport - ์ธ์ฆ ๋ฏธ๋ค์จ์ด
- JWT - ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- Google OAuth 2.0 - ์์ ๋ก๊ทธ์ธ
- Swagger - API ๋ฌธ์ํ
- MySQL 8.0 - ๋ฐ์ดํฐ๋ฒ ์ด์ค
- React 19 - UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- TypeScript - ํ์ ์์ ์ฑ
- Vite - ๋น๋ ๋๊ตฌ
- Tailwind CSS 4 - ์คํ์ผ๋ง
- React Router 7 - ๋ผ์ฐํ
- Zustand - ์ํ ๊ด๋ฆฌ
- TanStack Query - ์๋ฒ ์ํ ๊ด๋ฆฌ
- Google Maps API - ์ง๋ ์๋น์ค
K-Mate/
โโโ server/ # NestJS ๋ฐฑ์๋
โ โโโ src/
โ โ โโโ features/ # ๊ธฐ๋ฅ๋ณ ๋ชจ๋
โ โ โ โโโ auth/ # ์ธ์ฆ ๋ชจ๋ (Google OAuth + JWT)
โ โ โ โโโ places/ # ์ฅ์ ๊ด๋ฆฌ ๋ชจ๋
โ โ โ โโโ posts/ # ๊ฒ์๊ธ ๊ด๋ฆฌ ๋ชจ๋
โ โ โ โโโ comments/ # ๋๊ธ ๊ด๋ฆฌ ๋ชจ๋
โ โ โ โโโ interactions/ # ์ํธ์์ฉ ๊ด๋ฆฌ ๋ชจ๋
โ โ โ โโโ mypage/ # ๋ง์ดํ์ด์ง ๋ชจ๋
โ โ โโโ database/ # DB ์ค์
โ โ โโโ common/ # ๊ณตํต ์ ํธ๋ฆฌํฐ
โ โ โ โโโ decorators/ # ์ปค์คํ
๋ฐ์ฝ๋ ์ดํฐ
โ โ โ โโโ guards/ # ์ธ์ฆ/๊ถํ ๊ฐ๋
โ โ โโโ main.ts # ์ ํ๋ฆฌ์ผ์ด์
์ง์
์
โ โโโ database/
โ โโโ migrations/ # DB ๋ง์ด๊ทธ๋ ์ด์
โ โโโ 001_create_initial_schema.sql
โ โโโ 002_create_triggers.sql
โ โโโ 003_create_views.sql
โ โโโ 004_insert_sample_data.sql
โโโ client/ # React ํ๋ก ํธ์๋
โ โโโ src/
โ โ โโโ features/ # ๊ธฐ๋ฅ๋ณ ํ
/์คํ ์ด
โ โ โ โโโ auth/ # ์ธ์ฆ ๊ด๋ จ ์ํ ๊ด๋ฆฌ
โ โ โโโ components/ # UI ์ปดํฌ๋ํธ
โ โ โ โโโ common/ # ๊ณตํต ์ปดํฌ๋ํธ
โ โ โ โโโ layout/ # ๋ ์ด์์ ์ปดํฌ๋ํธ
โ โ โ โโโ places/ # ์ฅ์ ๊ด๋ จ ์ปดํฌ๋ํธ
โ โ โโโ pages/ # ํ์ด์ง ์ปดํฌ๋ํธ
โ โ โ โโโ KBuzz/ # K-Buzz ๊ด๋ จ ํ์ด์ง
โ โ โ โโโ KmapPage.tsx # K-Map ํ์ด์ง
โ โ โ โโโ KBuzzPage.tsx # K-Buzz ๋ฉ์ธ ํ์ด์ง
โ โ โ โโโ LoginPage.tsx # ๋ก๊ทธ์ธ ํ์ด์ง
โ โ โโโ api/ # API ํด๋ผ์ด์ธํธ
โ โ โโโ types/ # TypeScript ํ์
์ ์
โ โ โโโ styles/ # ์คํ์ผ ํ์ผ
โ โโโ public/
โโโ infrastructure/ # ๋ฐฐํฌ ์ธํ๋ผ
โ โโโ nginx/ # Nginx ์ค์
โ โโโ scripts/ # ๋ฐฐํฌ ์คํฌ๋ฆฝํธ
โ โโโ systemd/ # ์๋น์ค ์ค์
โโโ report/ # ํ๋ก์ ํธ ๋ฌธ์
โโโ requirements_specification.md
โโโ README.md
# ์๋ฒ ํ๊ฒฝ๋ณ์ ์ค์
cp server/.env.example server/.env
# ํด๋ผ์ด์ธํธ ํ๊ฒฝ๋ณ์ ์ค์
cp client/.env.example client/.env# MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
mysql -u root -p
CREATE DATABASE kmate_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# ๋ง์ด๊ทธ๋ ์ด์
์คํ
mysql -u root -p kmate_db < server/database/migrations/001_create_initial_schema.sql
mysql -u root -p kmate_db < server/database/migrations/002_create_triggers.sql
mysql -u root -p kmate_db < server/database/migrations/003_create_views.sql
mysql -u root -p kmate_db < server/database/migrations/004_insert_sample_data.sql# ๋ฐฑ์๋ ์๋ฒ ์คํ
cd server
npm install
npm run start:dev
# ํ๋ก ํธ์๋ ์๋ฒ ์คํ (์ ํฐ๋ฏธ๋)
cd client
npm install
npm run dev- Google OAuth 2.0 ๊ธฐ๋ฐ ์์ ๋ก๊ทธ์ธ
- JWT ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- HttpOnly ์ฟ ํค ๋ณด์
- ์๋ ํ ํฐ ๊ฐฑ์ ์ง์
- ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด (user/admin)
- community: ๋ชจ๋ ์ฌ์ฉ์ ์์ ๊ฒ์ํ
- trend: ํธ๋ ๋ ๊ฒ์๊ธ (๊ด๋ฆฌ์๋ง ์์ฑ/์์ )
- tips: ์ฌํ ํ ๊ฒ์๊ธ (๊ด๋ฆฌ์๋ง ์์ฑ/์์ )
- ๊ฒ์๊ธ CRUD: ํ์ ๋ณ ๊ถํ ์ ์ด
- ๋๊ธ ์์คํ : community/trend ๊ฒ์๊ธ์๋ง ํ์ฉ
- ์ํธ์์ฉ: ์ข์์/์คํฌ๋ฉ ํ ๊ธ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ: ์ฌํ, ๋ง์ง, ์นดํ, ์ผ๋ฐ
- ๊ฒ์ ๋ฐ ํํฐ๋ง: ๊ฒ์๊ธ ๊ฒ์ ๊ธฐ๋ฅ
- ํ์ด์ง๋ค์ด์ : ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- Google Maps API ์ฐ๋
- Google Places API ์ฅ์ ๊ฒ์
- ๊ด๊ด์ง ๋ง์ปค ํ์
- ์ฅ์ ์์ธ ์ ๋ณด ์กฐํ
- ์ฅ์ ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ์์น ๊ธฐ๋ฐ ์๋น์ค
- ์ง๋ ์คํ์ผ๋ง
- ์ฌ์ฉ์ ํ๋ ํต๊ณ ์กฐํ
- ๋ถ๋งํฌํ ์ฅ์ ๋ชฉ๋ก
- ์คํฌ๋ฉํ ๊ฒ์๊ธ ๋ชฉ๋ก
- ์์ฑํ ๊ฒ์๊ธ ๋ชฉ๋ก
- ์์ฑํ ๋๊ธ ๋ชฉ๋ก
- users: ์ฌ์ฉ์ ์ ๋ณด (Google OAuth)
- places: ์ฅ์ ์ ๋ณด (Google Places API ์ฐ๋)
- posts: ๊ฒ์๊ธ (community/trend/tips ํตํฉ)
- comments: ๋๊ธ
- interactions: ์ํธ์์ฉ (like/scrap/bookmark)
- community_posts: ์ปค๋ฎค๋ํฐ ๊ฒ์๊ธ ๋ทฐ
- tips_posts: ํ ๊ฒ์๊ธ ๋ทฐ
- trend_posts: ํธ๋ ๋ ๊ฒ์๊ธ ๋ทฐ
- user_interaction_stats: ์ฌ์ฉ์ ํ๋ ํต๊ณ
- post_interaction_stats: ๊ฒ์๊ธ ์ํธ์์ฉ ํต๊ณ
- ๊ฒ์๊ธ ์์ฑ ๊ถํ: tips/trend๋ ๊ด๋ฆฌ์๋ง ์์ฑ/์์
- ๋๊ธ ์์ฑ ์ ํ: community/trend ๊ฒ์๊ธ์๋ง ํ์ฉ
- ์ํธ์์ฉ ์ ์ฑ : like/scrap์ community/trend ๊ฒ์๊ธ์๋ง ํ์ฉ
# amplify.yml ์ค์ ํ์ธ
# ์๋ ๋ฐฐํฌ ์ค์ ๋จ- Nginx: ๋ฆฌ๋ฒ์ค ํ๋ก์ ๋ฐ ์ ์ ํ์ผ ์๋น
- Systemd: ์๋น์ค ๊ด๋ฆฌ
- ๋ฐฐํฌ ์คํฌ๋ฆฝํธ: ์๋ํ๋ ๋ฐฐํฌ ํ๋ก์ธ์ค
๊ฐ๋ฐ ์๋ฒ ์คํ ํ http://localhost:3000/docs์์ Swagger API ๋ฌธ์ ํ์ธ ๊ฐ๋ฅ
- ์ธ์ฆ:
/auth/*- Google OAuth, JWT ํ ํฐ ๊ด๋ฆฌ - ์ฅ์:
/places/*- ์ฅ์ ๊ฒ์, ์์ธ ์ ๋ณด, ๋ถ๋งํฌ - ๊ฒ์๊ธ:
/posts/*- ๊ฒ์๊ธ CRUD, ๊ฒ์, ํํฐ๋ง - ๋๊ธ:
/comments/*- ๋๊ธ CRUD - ์ํธ์์ฉ:
/interactions/*- ์ข์์/์คํฌ๋ฉ ํ ๊ธ - ๋ง์ดํ์ด์ง:
/mypage/*- ์ฌ์ฉ์ ํ๋ ํต๊ณ ๋ฐ ๋ชฉ๋ก
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request