diff --git a/README.md b/README.md index cbabf66..c9d9395 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,307 @@ -# Team29_BE -29조 백엔드 - -## 3주차 코드리뷰 질문 -- 프로젝트 구조 - - 프로젝트의 전체적인 구조에 대한 피드백을 받고 싶습니다. 처음으로 이런 규모의 프로젝트를 진행하다 보니 좋은 구조로 진행하고 싶은 욕심이 있습니다. 개선해야 할 점이 있을까요? -- 코드 이해도 관련 - - 서비스 규모가 커질수록 타인이 작성한 코드를 이해하기 점점 어려워질 것 같습니다. 어느정도의 단위로 주석을 작성하는것이 좋을까요? -- 미구현 기능 처리 - - 협업 중 아직 구현되지 않은 클래스 또는 메서드 등을 사용해야 할 때, 어떻게 접근하는게 좋을까요? -- PR 단위 - - 금요일까지 제출로 정해진 상황에서, 기능이 완전히 구현되지 않아도 PR을 보내야 하는 상황이 있을 거 같습니다. 개발 내용이 어렵거나 여러 이유로 개발이 늦어질 수 있는데, 아직 구현중인 기능도 PR을 보내는 것이 괜찮을까요? -- 협업 방식 - - PR로만 소통하는 것과 공통 레포(공용 Organization에 작업 레포를 포크해 온 레포)에서 커밋 단위로 어려움이 생겼을 때 코드를 공유하며 확인하는 것 중 어떤 방식이 더 효율적일까요? +![image](https://github.com/user-attachments/assets/b3d84499-a30d-4649-abfc-e4599f2594b2) + +## 목차 +- [⭐ NOTAI 를 소개합니다! ⭐](#-notai-를-소개합니다-) +- [🎬 시연영상 🎬](#-시연영상-) +- [🧑🤝🧑 팀원 🧑🤝🧑](#-팀원-) +- [🧑💻 핵심 기능 🧑💻](#-핵심-기능-) +- [🔗 링크 모음 🔗](#-링크-모음) +- [📁 파일구조 📁](#-파일구조-) +- [💠 ERD 💠](#-erd-) +- [👀 API 모아보기 👀](#-api-모아보기) +- [🛠️ 기술스택 🛠️](#%EF%B8%8F-기술스택-%EF%B8%8F) +- [☁️ 추후 개발예정 기능 ☁️](#%EF%B8%8F-추후-개발예정-기능-%EF%B8%8F) + + +# ⭐ NOTAI 를 소개합니다! ⭐ + +## 1. 타깃층 및 제작 목적 +**NOTE + AI**를 의미하는 **NOTAI**는 **대학생을 주 타깃**으로 하여 <br> 효율적이고 효과적인 **강의 학습** 및 **시험 대비**를 도와주는<br> **안드로이드 태블릿에 최적화**된 애플리케이션입니다. + +> * iOS용 추후 출시 예정 + +## 2. 제공 서비스 + +### 1. 동기화된 강의 자료 3-TYPE +- **한눈에 보이는** + - 강의 녹음 → PDF 파일 — 사용자 필기 + +> 🔑 **흩어진 강의자료, 확인하기 불편하셨죠? 강의 흐름에 꼭 맞춰 정리되는 자료로 더 편리하게 학습하세요!** + +### 2. AI 학습 보조 자료 3-STEP +- **음성 필기** + - 강의 녹음 파일을 STT (Speech to Text) 변환 + +- **AI 요약** + - 강의 자료 3가지를 통합한 요약본 제공 + +- **AI 예상 시험 문제** + - 강의 자료 3가지를 통합한 시험 예상 문제 생성 + +### 3. 해결하려는 문제점 및 기대효과 + +| 문제점 BIG 3 | ➡️ | 기대효과 | +|--------------|----|----------| +| 1. 필기하느라 수업을 놓친 흑우가 있다?! 🐂 | ➡️ | 1. **필기는 AI에게 맡겨요!**<br>강의 집중 UP 📈 | +| 2. 너무 긴 강의내용... 다 못 보게 되는데... 😅 | ➡️ | 2. **AI 요약으로 핵심만!**<br>학습 효율 UP 🔝 | +| 3. 이거 시험에는 어떻게 나올지 도저히 모르겠어!! 💢 | ➡️ | 3. **AI가 만들어주는 문제로**<br>더 완벽한 시험대비 💯 | + + +# 🎬 시연영상 🎬 +(영상업로드 예정) + +# 🧑🤝🧑 팀원 🧑🤝🧑 +### Backend + +| <img src="https://github.com/hynseoj.png" width="80"> <br/> [hynseoj](https://github.com/hynseoj) | <img src="https://github.com/rladbrua0207.png" width="80"> <br/> [rladbrua0207](https://github.com/rladbrua0207) | <img src="https://github.com/mingjuu.png" width="80"> <br/> [mingjuu](https://github.com/mingjuu) | <img src="https://github.com/Shsin9797.png" width="80"> <br/> [Shsin9797](https://github.com/Shsin9797) | <img src="https://github.com/yunjunghun0116.png" width="80"> <br/> [yunjunghun0116](https://github.com/yunjunghun0116) | +|:-:|:-:|:-:|:-:|:-:| +| Backend | Backend | Backend | Backend | Backend | + +### Frontend (Android) + +| <img src="https://github.com/aengzu.png" width="80"> <br/> [aengzu](https://github.com/aengzu) | <img src="https://github.com/Kjamm.png" width="80"> <br/> [Kjamm](https://github.com/Kjamm) | +|:-:|:-:| +| Android | Android | + + + +# 🧑💻 핵심 기능 🧑💻 +| 기능명 | 기능 설명 | +|--------|---------------------| +| 기본적인 노트 앱 기능 지원 | <img src="https://github.com/user-attachments/assets/1696c342-c5d0-4694-89b0-9f71a1641989" width="400" alt="노트 앱 기능"><div style="margin: 10px 0;"><hr></div>폴더 및 파일 업로드를 통해 원하는 자료를 마음껏 학습 | +| AI를 통한 녹음 변환 기능 지원 | <img src="https://github.com/user-attachments/assets/1696c342-c5d0-4694-89b0-9f71a1641989" width="400" alt="녹음 변환 기능"><div style="margin: 10px 0;"><hr></div>페이지 이동 이벤트를 지원해 더욱 똑똑한 음성 변환 가능 | +| AI를 통한 페이지 요약 기능 제공 | <img src="https://github.com/user-attachments/assets/1696c342-c5d0-4694-89b0-9f71a1641989" width="400" alt="페이지 요약 기능"><div style="margin: 10px 0;"><hr></div>단순한 요약 기능이 아닌, 해당 페이지에서 녹음된 음성을 토대로 요약 기능 제공 | + + + +# 🔗 링크 모음 + +### 앱 다운로드 +[앱 다운로드 링크](https://drive.google.com/file/d/1Pl3mzEKcpq2tKFsmI90nPUoJk-6doEOm/view?usp=sharing) + +### 소개 자료 (ppt) +[소개 자료 링크](https://www.canva.com/design/DAGWX39vH6w/nzAtcH09BaQlGldnBlVIfw/view?utm_content=DAGWX39vH6w&utm_campaign=designshare&utm_medium=link&utm_source=editor) + +### 프로젝트 관련 문서 +- **ERD 설계서**: [ERD 설계서 링크](https://www.erdcloud.com/d/Tndj8pDGQq5sokaLs) +- **Figma 기획 파일**: [Figma 기획 파일 링크](https://www.figma.com/design/Mq7XxiwzjEsm2HR0Z15lh/NOTAI_v2?node-id=1%3A8&t=4UGD4rPCtVzpqJa-1) + + +# 📁 파일구조 📁 + +## Android + +### 클린아키텍처 & MVVM & 멀티모듈 +- 클린 아키텍처를 통해 비즈니스 로직, 데이터 처리, ui 명확히 분리 +- 멀티모듈 구조를 통해 공통 기능을 별도의 모듈로 분리하여 각 부분의 독립성을 높임 +- MVVM을 통해 테스트와 유지보수가 용이해짐 +- 전체 모듈을 빌드할 필요가 없어 빌드시간을 줄이는데 용이해짐 +``` +📦 notai +├───📂app +│ └───📂src +│ └───📂main +│ ├───📂java/com/iguana/notai +│ │ └───📄NotaiApplication.kt +│ └───📂res +│ ├───📂layout +│ └───📂values +│ +├───📂build-logic (여러 모듈에서 공통적으로 사용되는 빌드 설정(플러그인 적용, 의존성 관리, 컴파일 옵션 등)을 중앙에서 관리) +│ +├───📂core +│ ├───📂data +│ │ ├───📂di (의존성 주입과 관련된 모듈) +│ │ ├───📂local (db 관련 모듈) +│ │ │ ├───📂dao +│ │ │ ├───📂db +│ │ │ ├───📂entity +│ │ │ └───📂files +│ │ ├───📂mapper (데이터 모델 분리 관련 모듈) +│ │ ├───📂remote +│ │ │ |───📂api (API 서비스 인터페이스 정의) +│ │ │ └───📂model (DTO 정의) +│ │ ├───📂repository (domain/repository에서 원격 API, 로컬 db에 대해 제공한 추상화 계층을 구체화) +│ │ └───📂utils (포매팅이나 확장 함수 관련) +│ │ +│ ├───📂domain +│ │ ├───📂model (비즈니스 로직에 사용되는 데이터 모델) +│ │ ├───📂repository +│ │ ├───📂usecase (도메인 로직을 처리하는 유스케이스) +│ │ └───📂utils +│ │ +│ ├───📂designsystem (앱 전반의 색상, 테마, 폰트 설정) +│ │ +│ └───📂ui +│ ├───📄BaseActivity.kt (사이드탭을 포함하는 공통 액티비티) +│ ├───📄SideTabLayoutFragment.kt (사이드탭은 공통적으로 사용되므로 따로 정의하여 재사용) +│ └───📄StatusBarManager.kt +│ +└───📂feature (각 기능들을 모듈로 분리) + ├───📂ai + ├───📂community + ├───📂dashBoard + ├───📂documents + ├───📂favorites + ├───📂login + ├───📂notetaking + ├───📂settings + └───📂userInfo +``` + +## Backend + +### CQRS 패턴 & Command 패턴 +- 데이터 변경과 조회 작업을 분리하여 최적화된 작업 수행 가능 +- 추후 데이터 저장소를 분리하여 효율을 높일 수 있음 +- presentation 계층과 application 계층의 요청을 분리하여 독립성 보장 +- 비즈니스 로직의 확장 및 변경이 유연 + +``` +📦notai +└── 📁src + ├── 📁main + │ ├── 📁java + │ │ └── 📁notai + │ │ ├── 📄BackendApplication.java + │ │ ├── 📁annotation + │ │ ├── 📁auth `사용자 로그인 관련 resolver 와 JWT 컴포넌트` + │ │ ├── 📁client `외부로의 API 요청 처리` + │ │ │ ├── 📄HttpInterfaceUtil.java + │ │ │ ├── 📁ai `AI 서버 API` + │ │ │ ├── 📁oauth `사용자 로그인 관련 OAuth API` + │ │ │ └── 📁slack `백엔드 서버 Slak Webhook` + │ │ ├── 📁comment + │ │ ├── 📁common + │ │ │ ├── 📁config `Swagger, QueryDSL 등의 애플리케이션 설정` + │ │ │ ├── 📁converter `JSON 직렬화/역직렬화 처리` + │ │ │ ├── 📁domain `RootEntity 등 공통 도메인 관련 폴더` + │ │ │ ├── 📁exception `전역 예외 처리` + │ │ │ │ ├── 📄ApplicationException.java + │ │ │ │ ├── 📄ErrorMessages.java + │ │ │ │ ├── 📄ExceptionControllerAdvice.java + │ │ │ │ ├── 📄ExceptionResponse.java + │ │ │ │ └── 📁type + │ │ │ └── 📁utils + │ │ ├── 📁document + │ │ │ ├── 📁application `비즈니스 로직 계층` + │ │ │ │ ├── 📄DocumentQueryService.java `C,U,D 전용 서비스 (CQRS 패턴)` + │ │ │ │ ├── 📄DocumentService.java `Read 전용 서비스 (CQRS 패턴)` + │ │ │ │ └── 📁result `application 계층의 응답 DTO` + │ │ │ │ ├── 📄DocumentFindResult.java + │ │ │ │ ├── 📄DocumentSaveResult.java + │ │ │ │ └── 📄DocumentUpdateResult.java + │ │ │ ├── 📁domain `도메인 모델 계층` + │ │ │ │ ├── 📄Document.java + │ │ │ │ └── 📄DocumentRepository.java `JPA 레포지토리 인터페이스` + │ │ │ ├── 📁presentation `프레젠테이션 계층` + │ │ │ │ ├── 📄DocumentController.java `API 엔드포인트` + │ │ │ │ ├── 📁request `API 요청 DTO` + │ │ │ │ │ ├── 📄DocumentSaveRequest.java + │ │ │ │ │ └── 📄DocumentUpdateRequest.java + │ │ │ │ └── 📁response `API 응답 DTO` + │ │ │ │ ├── 📄DocumentFindResponse.java + │ │ │ │ ├── 📄DocumentSaveResponse.java + │ │ │ │ └── 📄DocumentUpdateResponse.java + │ │ │ └── 📁query `조회 전용 쿼리 레포지토리 (CQRS 패턴)` + │ │ │ ├── 📄DocumentQueryRepository.java + │ │ │ └── 📄DocumentQueryRepositoryImpl.java + │ │ ├── 📁folder + │ │ ├── 📁llm + │ │ ├── 📁member + │ │ ├── 📁ocr + │ │ ├── 📁pageRecording + │ │ ├── 📁pdf + │ │ ├── 📁post + │ │ ├── 📁problem + │ │ ├── 📁recording + │ │ ├── 📁stt + │ │ ├── 📁sttTask + │ │ └── 📁summary + │ └── 📁resources + │ ├── 📄application-local.yml + │ └── 📄application.yml + └── 📁test + └── 📁java + └── 📁notai + ├── 📄BackendApplicationTests.java + ├── 📁annotation + ├── 📁client + ├── 📁folder + ├── 📁llm + ├── 📁ocr + ├── 📁pageRecording + ├── 📁recording + └── 📁stt +``` + +# 💠 ERD 💠 +![image](https://github.com/user-attachments/assets/e0e18ad0-c6f1-4514-bb49-8e75860d4259) + +# 👀 API 모아보기 + +### 회원 API + +| 기능 | URL | Method | Status | 설명 | +|------------------|--------------------------------------|--------|--------|------| +| 카카오 로그인 | `/api/members/oauth/login/{oauthProvider}` | POST | 완료 | | +| 토큰 리프레쉬 | `/api/members/token/refresh` | POST | 완료 | | +| 본인 프로필 조회 | `/api/members/me` | GET | 완료 | | + + +### Document API + +| 기능 | URL | Method | Status | 설명 | +|--------------------------|---------------------------------------------------------|--------|--------|------| +| 폴더에 Document 업로드 | `/api/folders/{folderId}/document` | POST | 완료 | | +| 폴더의 목록 조회 | `/api/folders/{folderId}` | GET | 완료 | | +| 여러 Document 조회 | `/api/folders/{folderId}/documents` | GET | 완료 | | +| Document 상세 조회 | `/api/folders/{folderId}/documents/{documentId}` | GET | 완료 | | +| Document 수정 | `/api/folders/{folderId}/documents/{documentId}` | PUT | 완료 | | +| Document 삭제 | `/api/folders/{folderId}/documents/{documentId}` | DELETE | 완료 | | +| 폴더 생성 | `/api/folders` | POST | 완료 | | +| 폴더 조회 | `/api/folders?parentFolderId={parentFolderId}` | GET | 완료 | | +| 폴더 삭제 | `/api/folders/{folderId}` | DELETE | 완료 | | +| 속해있는 폴더 변경(위치변경) | `/api/folders/{folderId}/move` | POST | 완료 | | + +### Annotation API + +| 기능 | URL | Method | Status | 설명 | +|----------------|-------------------------------------------------------|--------|--------|------| +| 주석 추가 | `/api/documents/{documentId}/annotations` | POST | 완료 | | +| 주석 목록 조회 | `/api/documents/{documentId}/annotations` | GET | 완료 | | +| 주석 수정 | `/api/documents/{documentId}/annotations/{annotationId}` | PUT | 완료 | | +| 주석 삭제 | `/api/documents/{documentId}/annotations/{annotationId}` | DELETE | 완료 | | + + + +### Record API + +| 기능 | URL | Method | Status | 설명 | +|------|-----|--------|--------|------| +| 페이지 넘김 이벤트 | `/api/documents/{documentId}/recordings/page-turns` | POST | 완료 | | +| 녹음 파일 업로드 | `/api/documents/{documentId}/recordings` | POST | 완료 | | +| STT 결과 업로드 X (서버에서 처리) | `/api/documents/{documentId}/recordings/{recordingId}/stt-results` | POST | 완료 | | + + +### Summarize API + +| 기능 | URL | Method | Status | 설명 | +|------|-----|--------|--------|------| +| STT결과 | `/api/ai/` | POST | 완료 | | +| 요약 정리 및 문제생성 (client → server) | `/api/ai/llm` | POST | 완료 | | +| OCR (server → AI server) | `/api/ai/ocr` | POST | 시작 전 | | +| 요약 정리 및 문제생성 결과 전달 (AI server → server) | `/api/ai/llm/callback` | POST | 완료 | 요약정리 페이지별로 완성될 때마다 AI서버에서 웹서버로 내용을 전달하는 API | +| 요약 정리 및 문제생성 상태 확인 (client → server) | `/api/ai/llm/status/{documentId}` | GET | 완료 | | +| 페이지별 요약 정리 및 문제생성 상태 확인 (client → server) | `/api/ai/llm/status/{documentId}/{pageNumber}` | GET | 완료 | | +| 생성된 요약 정리 결과 조회 (client → server) | `/api/ai/llm/results/{documentId}` | GET | 완료 | | +| 페이지별 생성된 요약 정리 및 문제 조회 (client → server) | `/api/ai/llm/results/{documentId}/{pageNumber}` | GET | 완료 | | +| task 상태 확인 | `/api/ai/tasks/{taskId}` | GET | 완료 | 우선은 존재하지 않는 task로 요청하더라도 PENDING입니다 | + + +# 🛠️ 기술스택 🛠️ +![image](https://github.com/user-attachments/assets/b001bb8b-950a-493a-900b-3e0094a60194) + + +# ☁️ 추후 개발예정 기능 ☁️ +1. 커뮤니티 기능 → 내가 만든 ai 문제를 공유하고 피드백 받을수 있게 ! ~ 금액과 연결지어서 사고파는 문제은행