IT-DA๋ ๋ค์ํ ์ทจ๋ฏธ๋ฅผ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ชจ์์ ๋ง๋ค๊ณ ์ฐธ์ฌํ ์ ์๋ ์ข ํฉ ๋ชจ์ ๋งค์นญ ํ๋ซํผ์ ๋๋ค.
- ๐ฏ ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ชจ์ ๊ฒ์ ๋ฐ ์ฐธ์ฌ (์ด๋, ์์, ๋ฌธํ/์์ , ์คํฐ๋, ์ฌ๊ต)
- ๐ ์ง์ญ ๊ธฐ๋ฐ ๋ชจ์ ์ฐพ๊ธฐ
- ๐ฅ ์ค์๊ฐ ๋ชจ์ ๊ด๋ฆฌ ๋ฐ ์ฐธ์ฌ์ ๊ด๋ฆฌ
- ๐ ์์ ํ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ์ ๊ด๋ฆฌ
- ๐ ๊ด๋ฆฌ์ ๋์๋ณด๋ (์ฌ์ฉ์/๋ชจ์/์ ๊ณ ๊ด๋ฆฌ)
- ๐ค AI ๊ธฐ๋ฐ ์ถ์ฒ ์์คํ (์์ )
- Framework: Spring Boot 3.x
- Language: Java 17
- Database: MySQL 8.0
- Cache/Session: Redis
- Authentication: Redis Session (JWT ๋ฏธ์ฌ์ฉ)
- API: RESTful API
- Framework: React 19
- Language: TypeScript
- Build Tool: Vite
- State Management: Zustand
- Styling: Tailwind CSS + shadcn/ui
- HTTP Client: Axios
- Language: Python
- Framework: FastAPI / Flask
- Integration: REST API ์ฐ๋
- N+1 ๋ฌธ์ ๋ฐฉ์ง: LEFT JOIN FETCH๋ฅผ ํ์ฉํ ์ฟผ๋ฆฌ ์ต์ ํ
- Redis ์บ์ฑ: ์ธ์ ๊ด๋ฆฌ ๋ฐ ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ ์บ์ฑ
- Soft Delete: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง
- Redis Session ๊ธฐ๋ฐ ์ธ์ฆ
- JWT ๋์ Redis Session ํ์ฉ
HttpSession์ ํตํ ๊ฐํธํ ์ธ์ ๊ด๋ฆฌ- ์๋ฒ ์ธก ์ธ์ ์ ์ด๋ก ๋ณด์์ฑ ๊ฐํ
| ์ด๋ฆ | ๋ด๋น ์์ญ |
|---|---|
| ๊น๋ดํ | Admin ๊ธฐ๋ฅ, Redis ์ค์ , Auth ์ค์ , ๋ฐฑ์๋ ์ธํ๋ผ |
| ๊น๋๋ฏผ | ์ฌ์ฉ์(User) ๊ด๋ จ ๊ธฐ๋ฅ, ํ๋กํ ๊ด๋ฆฌ |
| ์ต๋์ | ๋ชจ์(Meeting) ๊ด๋ จ ๊ธฐ๋ฅ, ๋ชจ์ CRUD |
| ๊น๋ณด๋ฏผ | ํ๋ก ํธ์๋ UI/UX, ์ปดํฌ๋ํธ ๊ฐ๋ฐ |
| ์ ์์ง | ์ ๊ณ (Report) ๊ธฐ๋ฅ, ์ปค๋ฎค๋ํฐ ๊ด๋ฆฌ |
| ๋ฐ์ฑํ | ๋ฆฌ๋ทฐ(Review) ๊ธฐ๋ฅ, ํ๊ฐ ์์คํ |
IT-DA/
โโโ backend/ # Spring Boot ๋ฐฑ์๋
โ โโโ src/main/java/
โ โ โโโ com/example/itda/
โ โ โโโ config/ # Redis, Security ์ค์
โ โ โโโ controller/ # REST API ์ปจํธ๋กค๋ฌ
โ โ โโโ service/ # ๋น์ฆ๋์ค ๋ก์ง
โ โ โโโ repository/ # JPA Repository
โ โ โโโ entity/ # JPA ์ํฐํฐ
โ โ โโโ dto/ # ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด
โ โโโ src/main/resources/
โ โโโ application.yml # ์ค์ ํ์ผ
โ โโโ data.sql # ์ด๊ธฐ ๋ฐ์ดํฐ
โ
โโโ frontend/ # React ํ๋ก ํธ์๋
โ โโโ src/
โ โ โโโ components/ # ์ฌ์ฌ์ฉ ์ปดํฌ๋ํธ
โ โ โโโ pages/ # ํ์ด์ง ์ปดํฌ๋ํธ
โ โ โโโ stores/ # Zustand ์ํ ๊ด๋ฆฌ
โ โ โโโ api/ # API ํธ์ถ ํจ์
โ โ โโโ types/ # TypeScript ํ์
์ ์
โ โ โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โ โโโ public/
โ โโโ package.json
โ
โโโ ai/ # Python AI ์๋ฒ (์์ )
โโโ main.py
โโโ models/
โโโ requirements.txt
- Java 17+
- Node.js 18+
- MySQL 8.0+
- Redis 6.0+
- Python 3.9+ (AI ๊ธฐ๋ฅ ์ฌ์ฉ ์)
cd backend
# MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
mysql -u root -p
CREATE DATABASE itda;
# Redis ์๋ฒ ์์
redis-server
# ์ ํ๋ฆฌ์ผ์ด์
์คํ
./mvnw spring-boot:runcd frontend
# ์์กด์ฑ ์ค์น
npm install
# ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run devcd ai
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
# ์๋ฒ ์คํ
python main.pyPOST /api/auth/signup- ํ์๊ฐ์POST /api/auth/login- ๋ก๊ทธ์ธPOST /api/auth/logout- ๋ก๊ทธ์์GET /api/auth/check- ์ธ์ ํ์ธ
GET /api/users/{id}- ์ฌ์ฉ์ ์ ๋ณด ์กฐํPUT /api/users/{id}- ์ฌ์ฉ์ ์ ๋ณด ์์ DELETE /api/users/{id}- ํ์ ํํด
GET /api/meetings- ๋ชจ์ ๋ชฉ๋ก ์กฐํGET /api/meetings/{id}- ๋ชจ์ ์์ธ ์กฐํPOST /api/meetings- ๋ชจ์ ์์ฑPUT /api/meetings/{id}- ๋ชจ์ ์์ DELETE /api/meetings/{id}- ๋ชจ์ ์ญ์ POST /api/meetings/{id}/join- ๋ชจ์ ์ฐธ์ฌ
GET /api/admin/users- ์ฌ์ฉ์ ๊ด๋ฆฌGET /api/admin/meetings- ๋ชจ์ ๊ด๋ฆฌGET /api/admin/reports- ์ ๊ณ ๊ด๋ฆฌ
users- ์ฌ์ฉ์ ์ ๋ณดmeetings- ๋ชจ์ ์ ๋ณดmeeting_participants- ๋ชจ์ ์ฐธ์ฌ์reports- ์ ๊ณ ๋ด์ญreviews- ๋ฆฌ๋ทฐ ๋ฐ ํ๊ฐcategories- ์นดํ ๊ณ ๋ฆฌ ์ ๋ณด
- Backend: Java ํ์ค ์ปจ๋ฒค์ ์ค์
- Frontend: Airbnb React/TypeScript Style Guide
- Naming: camelCase (๋ณ์/๋ฉ์๋), PascalCase (ํด๋์ค/์ปดํฌ๋ํธ)
main- ๋ฐฐํฌ ๊ฐ๋ฅํ ์์ ๋ฒ์ develop- ๊ฐ๋ฐ ํตํฉ ๋ธ๋์นfeature/๊ธฐ๋ฅ๋ช- ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์นhotfix/๋ฒ๊ทธ๋ช- ๊ธด๊ธ ์์ ๋ธ๋์น
feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
fix: ๋ฒ๊ทธ ์์
docs: ๋ฌธ์ ์์
style: ์ฝ๋ ํฌ๋งทํ
refactor: ์ฝ๋ ๋ฆฌํฉํ ๋ง
test: ํ
์คํธ ์ฝ๋
chore: ๋น๋/์ค์ ๋ณ๊ฒฝ
// โ Bad - N+1 ๋ฌธ์ ๋ฐ์
@Query("SELECT m FROM Meeting m WHERE m.deletedAt IS NULL")
List<Meeting> findAll();
// โ
Good - JOIN FETCH ์ฌ์ฉ
@Query("SELECT m FROM Meeting m " +
"LEFT JOIN FETCH m.participants " +
"WHERE m.deletedAt IS NULL")
List<Meeting> findAllWithParticipants();// ์ธ์
์ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ
session.setAttribute("userId", user.getId());
// ์ธ์
์์ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
Long userId = (Long) session.getAttribute("userId");// ๋ชจ๋ ์กฐํ ์ฟผ๋ฆฌ์ deletedAt ํํฐ ์ถ๊ฐ
WHERE entity.deletedAt IS NULL# Backend ํ
์คํธ
./mvnw test
# Frontend ํ
์คํธ
npm run test
# E2E ํ
์คํธ
npm run test:e2e# JAR ํ์ผ ๋น๋
./mvnw clean package
# ์คํ
java -jar target/itda-0.0.1-SNAPSHOT.jar# ํ๋ก๋์
๋น๋
npm run build
# ๋น๋ ํ์ผ์ dist/ ํด๋์ ์์ฑ- AI ๊ธฐ๋ฐ ๋ชจ์ ์ถ์ฒ ์์คํ ๊ณ ๋ํ
- ์๋ฆผ ๊ธฐ๋ฅ ๊ฐํ
- UI ๊ณ ๋ํ