diff --git a/README.md b/README.md new file mode 100644 index 0000000..71dacd6 --- /dev/null +++ b/README.md @@ -0,0 +1,305 @@ +
+ +# πŸ§‘β€πŸ« TeachING + +TeachING overview + +### 흩어진 정보λ₯Ό μ—°κ²°ν•΄ λ‚˜λ§Œμ˜ μ§€μ‹μœΌλ‘œ λ§Œλ“œλŠ” AI ν•™μŠ΅ μ„œλΉ„μŠ€ + +**URL둜 μ €μž₯ν•œ ν•™μŠ΅ 자료(λΈ”λ‘œκ·Έ, 유튜브 λ“±)λ₯Ό AIκ°€ μžλ™ λΆ„μ„Β·μš”μ•½ν•˜κ³ ,
+RAG 기반 챗봇과 개인 λ§žμΆ€ν˜• ν•™μŠ΅ 경둜 'ν‹°μΉ­λ§΅'을 톡해
+λ‹¨κ³„λ³„λ‘œ ν•™μŠ΅μ„ μ΄λŒμ–΄μ£ΌλŠ” AI ν•™μŠ΅ 관리 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.** + +
+ + +μ„œλΉ„μŠ€ λ°”λ‘œκ°€κΈ° + + +

+ +Stars +Closed PRs +Commits + +
+ +
+ +## πŸ“– μ„œλΉ„μŠ€ μ†Œκ°œ + +TeachING은 흩어진 온라인 ν•™μŠ΅ 자료λ₯Ό ν•œκ³³μ— λͺ¨μœΌκ³ , AIκ°€ νŠœν„°μ²˜λŸΌ ν•¨κ»˜ ν•™μŠ΅μ„ μ΄λŒμ–΄μ£ΌλŠ” 개인 ν•™μŠ΅ 관리 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. + +λΈ”λ‘œκ·Έ, 유튜브 λ“±μ—μ„œ λ°œκ²¬ν•œ 자료의 URL을 μ €μž₯ν•˜λ©΄ AIκ°€ μžλ™μœΌλ‘œ λ³Έλ¬Έ(λ˜λŠ” μ˜μƒ 슀크립트)을 뢄석해 μš”μ•½κ³Ό 상세 해섀을 μƒμ„±ν•˜κ³ , 벑터 검색(RAG) 기반으둜 μƒ‰μΈν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ €μž₯된 μžλ£Œλ“€μ„ 폴더와 νƒœκ·Έλ‘œ 자유둭게 정리할 수 있고, κΆκΈˆν•œ 점은 μ±„νŒ…μœΌλ‘œ μ§ˆλ¬Έν•˜λ©΄ AIκ°€ λ‚΄κ°€ μ €μž₯ν•œ 자료λ₯Ό 근거둜 λ‹΅λ³€ν•˜λ©° β€” κ΄€λ ¨ μžλ£Œκ°€ 없을 λ•ŒλŠ” 일반 μ§€μ‹μœΌλ‘œ 보완해 λ‹΅ν•©λ‹ˆλ‹€. + +κ°€μž₯ 큰 νŠΉμ§•μ€ **ν‹°μΉ­λ§΅**μž…λ‹ˆλ‹€. 폴더 μ•ˆμ˜ μžλ£Œλ“€μ„ μˆœμ„œκ°€ μžˆλŠ” ν•™μŠ΅ λ‹¨κ³„λ‘œ μž¬κ΅¬μ„±ν•΄, 마치 컀리큘럼처럼 ν•˜λ‚˜μ”© 따라가며 ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 λ‹¨κ³„μ—μ„œ μ€‘μš”ν•œ 뢀뢄을 ν•˜μ΄λΌμ΄νŠΈν•˜λ©΄ μ‚¬μš©μžκ°€ μ„€μ •ν•œ μ„±ν–₯(λ‹€μ •ν•œ/μ—„κ²©ν•œ/μ‘μ›ν•˜λŠ”)의 'AI μ„ μƒλ‹˜'이 κ·Έ 뢀뢄을 μ§šμ–΄ μ„€λͺ…ν•΄μ£Όκ³ , ν•™μŠ΅ μ§„ν–‰λ₯ λ„ ν•¨κ»˜ μΆ”μ λ©λ‹ˆλ‹€. + +μΉ΄μΉ΄μ˜€Β·κ΅¬κΈ€ μ†Œμ…œ 둜그인으둜 κ°„νŽΈν•˜κ²Œ μ‹œμž‘ν•  수 있으며, 무료/프리미엄 멀버십을 톡해 더 λ§Žμ€ 자료 μ €μž₯κ³Ό 폴더 생성이 κ°€λŠ₯ν•©λ‹ˆλ‹€. + +
+ +## ✨ μ£Όμš” κΈ°λŠ₯ + +
+ + + + + +
+ +### πŸ“„ 자료 관리 + +- λΈ”λ‘œκ·Έ, 유튜브 λ“± **온라인 자료의 URL을 μ €μž₯**ν•˜λ©΄ AIκ°€ λ³Έλ¬Έ/슀크립트λ₯Ό μΆ”μΆœν•΄ **μš”μ•½Β·μƒμ„Έ 뢄석** 생성 +- 뢄석 κ²°κ³ΌλŠ” chunk둜 λ‚˜λˆ  **Qdrant에 벑터 색인** +- AI μš”μ•½/상세 뢄석은 **직접 μˆ˜μ •** κ°€λŠ₯ +- 폴더 μƒμ„±Β·μžλ£Œ μ΄λ™Β·νƒœκ·ΈΒ·νœ΄μ§€ν†΅μœΌλ‘œ 자료 정리 + + + +### πŸ’¬ 챗봇 (RAG) + +- μ±„νŒ…λ°©μ„ λ§Œλ“€κ³  λ‚΄κ°€ μ €μž₯ν•œ μžλ£Œμ— λŒ€ν•΄ **자유둭게 질문** +- μ§ˆλ¬Έμ„ **벑터 검색**으둜 κ΄€λ ¨ 자료λ₯Ό μ°Ύμ•„ 근거둜 λ‹΅λ³€ 생성 +- κ΄€λ ¨ μžλ£Œκ°€ μ—†μœΌλ©΄ **일반 지식 기반 fallback** 응닡 +- 닡변에 인용된 **좜처 자료** ν•¨κ»˜ ν‘œμ‹œ + +
+
+ +
+ + + + + +
+ +### πŸ—ΊοΈ ν‹°μΉ­λ§΅ + +- 폴더 속 μžλ£Œλ“€μ„ μˆœμ„œκ°€ μžˆλŠ” **ν•™μŠ΅ μŠ€ν…**으둜 μž¬κ΅¬μ„± +- ν•˜μ΄λΌμ΄νŠΈν•œ 뢀뢄에 **AI μ„ μƒλ‹˜ ν•΄μ„€** 제곡 +- λ§νˆ¬λŠ” **λ‹€μ •ν•œ / μ—„κ²©ν•œ / μ‘μ›ν•˜λŠ”** 페λ₯΄μ†Œλ‚˜ 쀑 선택 +- μŠ€ν… μ™„λ£Œ ν† κΈ€λ‘œ **μ§„ν–‰λ₯ ** μžλ™ κ°±μ‹ , μž„μ‹œμ €μž₯ 지원 + + + +### πŸ” 인증 & 멀버십 + +- **카카였 Β· ꡬ글** OAuth2 μ†Œμ…œ 둜그인, JWT 기반 인증 +- **카카였페이** 연동 TeachING Plus ꡬ독 결제 +- **FREE / PREMIUM** 멀버십 λ“±κΈ‰ ꡬ뢄 +- λ§ˆμ΄νŽ˜μ΄μ§€μ—μ„œ ν”„λ‘œν•„ Β· μ•Œλ¦Ό Β· AI μ„ μƒλ‹˜ μ„€μ • 관리 + +
+
+ +
+ +## πŸ›  기술 μŠ€νƒ + +
+ +**Backend** + +![Java](https://img.shields.io/badge/Java_17-ED8B00?style=flat-square&logo=openjdk&logoColor=white) +![Spring Boot](https://img.shields.io/badge/Spring_Boot_4.1-6DB33F?style=flat-square&logo=springboot&logoColor=white) +![Spring Security](https://img.shields.io/badge/Spring_Security-6DB33F?style=flat-square&logo=springsecurity&logoColor=white) +![Spring Data JPA](https://img.shields.io/badge/Spring_Data_JPA-6DB33F?style=flat-square&logo=spring&logoColor=white) +![JWT](https://img.shields.io/badge/JWT-000000?style=flat-square&logo=jsonwebtokens&logoColor=white) +![OAuth2](https://img.shields.io/badge/OAuth2-EB5424?style=flat-square&logo=auth0&logoColor=white) +![Gradle](https://img.shields.io/badge/Gradle-02303A?style=flat-square&logo=gradle&logoColor=white) + +**Database** + +![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=flat-square&logo=mysql&logoColor=white) +![Qdrant](https://img.shields.io/badge/Qdrant_Vector_DB-DC244C?style=flat-square&logo=databricks&logoColor=white) + +**AI Β· 자료 μˆ˜μ§‘** + +![OpenAI](https://img.shields.io/badge/OpenAI_API-412991?style=flat-square&logo=openai&logoColor=white) +![Jsoup](https://img.shields.io/badge/Jsoup-43853D?style=flat-square&logo=html5&logoColor=white) +![Selenium](https://img.shields.io/badge/Selenium-43B02A?style=flat-square&logo=selenium&logoColor=white) +![YouTube](https://img.shields.io/badge/YouTube_Transcript_API-FF0000?style=flat-square&logo=youtube&logoColor=white) + +**결제 Β· Infra Β· CI/CD** + +![KakaoPay](https://img.shields.io/badge/KakaoPay-FFCD00?style=flat-square&logo=kakao&logoColor=black) +![AWS EC2](https://img.shields.io/badge/EC2-FF9900?style=flat-square&logo=amazonec2&logoColor=white) +![AWS RDS](https://img.shields.io/badge/RDS-527FFF?style=flat-square&logo=amazonrds&logoColor=white) +![AWS ECR](https://img.shields.io/badge/ECR-FF9900?style=flat-square&logo=amazonaws&logoColor=white) +![AWS S3](https://img.shields.io/badge/S3-569A31?style=flat-square&logo=amazons3&logoColor=white) +![Nginx](https://img.shields.io/badge/Nginx-009639?style=flat-square&logo=nginx&logoColor=white) +![Let's Encrypt](https://img.shields.io/badge/Let's_Encrypt-003A70?style=flat-square&logo=letsencrypt&logoColor=white) +![Docker](https://img.shields.io/badge/Docker-2496ED?style=flat-square&logo=docker&logoColor=white) +![GitHub Actions](https://img.shields.io/badge/GitHub_Actions-2088FF?style=flat-square&logo=githubactions&logoColor=white) + +**Docs** + +![Swagger](https://img.shields.io/badge/Swagger-85EA2D?style=flat-square&logo=swagger&logoColor=black) + +
+ +
+ +## πŸ— μ•„ν‚€ν…μ²˜ + +
+ +TeachING μ•„ν‚€ν…μ²˜ + +
+ +
+ +## 🌿 ν˜‘μ—… κ·œμΉ™ + +| ꡬ뢄 | λ‚΄μš© | +| --- | --- | +| 🌿 **브랜치** | `type/#이슈번호/μ„€λͺ…` (예: `feat/#69/material-url`) β†’ `main` 으둜 PR | +| πŸ“ **컀밋** | `Type: μ„€λͺ…` (`Feat` `Fix` `Docs` `Test` `Refactor` `Chore` λ“±) | +| πŸ” **PR** | GitHub Actions **CI(Gradle λΉŒλ“œ) 톡과** ν›„ λ¨Έμ§€ | +| πŸš€ **배포** | `main` push μ‹œ ECR 이미지 λΉŒλ“œ β†’ EC2 Docker Compose μžλ™ 배포 | + +
+ +## πŸ‘₯ νŒ€μ› + +
+ + + + + + + +
+ +
+@hwiyoon20010309 +

+λ°±μ—”λ“œ
+πŸ“„ 자료 Β· URL 뢄석
+πŸ’¬ 챗봇(RAG) +
+ +
+@Mymyseoyoung +

+λ°±μ—”λ“œ
+πŸ—ΊοΈ ν‹°μΉ­λ§΅
+πŸ” 인증 Β· μ•½κ΄€ +
+ +
+@m00nsh +

+λ°±μ—”λ“œ
+πŸ“„ 자료 Β· 폴더
+πŸ”” μ•Œλ¦Ό Β· ν™ˆ +
+ +
+@EH-OI +

+λ°±μ—”λ“œ
+πŸ—‘οΈ νœ΄μ§€ν†΅
+πŸ’³ 결제 +
+
+ +
+ +## πŸ“ μ €μž₯μ†Œ ꡬ쑰 + +``` +backend/ +β”œβ”€β”€ src/main/java/com/teaching/backend/ +β”‚ β”œβ”€β”€ domain/ 도메인별 νŒ¨ν‚€μ§€ (controller Β· service Β· entity Β· repository Β· dto) +β”‚ β”‚ β”œβ”€β”€ auth Β· user Β· material Β· folder Β· chat +β”‚ β”‚ β”œβ”€β”€ teachingmap Β· trash Β· tag Β· notification +β”‚ β”‚ └── payment Β· term Β· home Β· support +β”‚ └── global/ 곡톡 μ„€μ • (security Β· config Β· ai Β· storage Β· exception Β· response) +β”œβ”€β”€ docker-compose.yml app(Spring Boot) + qdrant μ»¨ν…Œμ΄λ„ˆ ꡬ성 +└── .github/workflows/ CI(λΉŒλ“œ 검증) Β· CD(ECR/EC2 배포) μ›Œν¬ν”Œλ‘œ +``` + +
+ +
+

πŸ“– 도메인별 상세 API λͺ…μ„Έ (펼쳐보기)

+ +### Auth (`/api/v1/auth`) +- `POST /reissue` β€” AccessToken μž¬λ°œκΈ‰ +- `POST /signup` β€” νšŒμ›κ°€μž…(λ‹‰λ„€μž„ ν™•μ • Β· μ•½κ΄€ λ™μ˜ 등둝) +- `POST /logout` β€” λ‘œκ·Έμ•„μ›ƒ +- `GET /check-nickname` β€” λ‹‰λ„€μž„ 쀑볡 확인 +- `GET /oauth2/authorization/{kakao|google}` β€” μ†Œμ…œ 둜그인 μ§„μž…μ  + +### User (`/users`) +- `GET /me` β€” λ‚΄ 정보 쑰회 +- `PATCH /me` β€” ν”„λ‘œν•„ μˆ˜μ • (multipart) +- `PATCH /me/notifications` β€” μ•Œλ¦Ό μ„€μ • λ³€κ²½ +- `DELETE /me` β€” νšŒμ› νƒˆν‡΄ +- `PATCH /me/teacher-persona` β€” AI μ„ μƒλ‹˜ 페λ₯΄μ†Œλ‚˜ λ³€κ²½ + +### Material (`/materials`, `/api/v1/materials`) +- `GET /materials` β€” 자료 λͺ©λ‘ 쑰회 +- `POST /materials/{materialId}/index` β€” 자료 색인(Qdrant) +- `POST /api/v1/materials/analyze` β€” URL 기반 AI 뢄석 μš”μ²­ +- `PATCH /api/v1/materials/{materialId}/finalize` β€” 뢄석 κ²°κ³Ό μ €μž₯ ν™•μ • + +### Folder (`/api/folders`) +- `GET /` Β· `POST /` β€” 폴더 λͺ©λ‘ 쑰회 Β· 생성 +- `GET /{folderId}` Β· `PATCH /{folderId}` β€” 폴더 상세 쑰회 Β· 이름 μˆ˜μ • +- `GET /{folderId}/materials` β€” 폴더 λ‚΄ 자료 λͺ©λ‘ +- `PATCH /{folderId}/trash` Β· `PATCH /{folderId}/restore` β€” 폴더 νœ΄μ§€ν†΅ 이동 Β· 볡ꡬ +- `GET/PATCH /{folderId}/materials/{materialId}/analysis(/summary|/detail)` β€” AI 뢄석 쑰회 Β· μˆ˜μ • +- `GET /{folderId}/materials/{materialId}/tags` β€” νƒœκ·Έ 쑰회 +- `GET /{folderId}/materials/{materialId}/origin-url` β€” 원본 URL 쑰회 +- `PATCH /{folderId}/materials/move|trash|restore` β€” 자료 이동 Β· νœ΄μ§€ν†΅ 이동 Β· 볡ꡬ + +### ChatRoom / ChatMessage (`/chatrooms`) +- `GET /` Β· `POST /` β€” μ±„νŒ…λ°© λͺ©λ‘ 쑰회(μ»€μ„œ νŽ˜μ΄μ§€λ„€μ΄μ…˜) Β· 생성 +- `GET /{chatRoomId}/messages` β€” λ©”μ‹œμ§€ νžˆμŠ€ν† λ¦¬ 쑰회(좜처 포함) +- `POST /{chatRoomId}/messages` β€” μ§ˆλ¬Έν•˜κΈ°(RAG 기반 λ‹΅λ³€ 생성) + +### TeachingMap (`/api/v1/teaching-maps`) +- `GET /` Β· `POST /` β€” ν‹°μΉ­λ§΅ λͺ©λ‘ 쑰회 Β· 생성(폴더 기반) +- `GET /{teachingMapId}` Β· `PATCH /{teachingMapId}` β€” 단건 쑰회 Β· 제λͺ©/μ„€λͺ… μˆ˜μ • +- `GET /{teachingMapId}/steps/{stepId}` β€” μŠ€ν… 상세 쑰회 +- `PATCH /{teachingMapId}/steps/{stepId}/toggle` β€” μŠ€ν… μ™„λ£Œ ν† κΈ€ +- `GET /materials/{materialId}/highlights/{highlightId}/analysis` β€” ν•˜μ΄λΌμ΄νŠΈ AI μ„ μƒλ‹˜ ν•΄μ„€ 쑰회/생성 +- `PATCH /trash` β€” ν‹°μΉ­λ§΅ 닀쀑 νœ΄μ§€ν†΅ 이동 +- `POST /temp` β€” μž„μ‹œμ €μž₯ + +### Trash (`/api/v1/trash`) +- `GET /folders|materials|teaching-maps` β€” νœ΄μ§€ν†΅ λͺ©λ‘ 쑰회 +- `GET /folders/{folderId}/materials` β€” νœ΄μ§€ν†΅ 폴더 상세(λ‚΄λΆ€ 자료) 쑰회 +- `PATCH /folders|materials|teaching-maps/restore` β€” 닀쀑 볡ꡬ + +### Notification (`/api/v1/notifications`) +- `GET /` Β· `GET /summary` β€” μ•Œλ¦Ό λͺ©λ‘ Β· μš”μ•½ 쑰회 +- `PATCH /{notificationId}/read` β€” 읽음 처리 + +### Payment (`/api/v1/payments`) +- `POST /ready` β€” ꡬ독 결제 μ€€λΉ„(카카였페이) +- `GET /success|cancel|fail` β€” 결제 κ²°κ³Ό 콜백 + +### Term (`/api/v1/terms`) +- `GET /` β€” μ•½κ΄€ λͺ©λ‘ 쑰회 + +### Home (`/api/v1/home`) +- `GET /` β€” ν™ˆ λŒ€μ‹œλ³΄λ“œ 쑰회 + +
+ +
+ +
+ +**πŸ§‘β€πŸ« TeachING** Β· Made with care by the TeachING-Dev team + +2026. 08. 13. ver. + +
diff --git a/images/architecture.png b/images/architecture.png new file mode 100644 index 0000000..6685690 Binary files /dev/null and b/images/architecture.png differ diff --git a/images/teaching-overview.png b/images/teaching-overview.png new file mode 100644 index 0000000..6bd6590 Binary files /dev/null and b/images/teaching-overview.png differ