forked from kakao-tech-campus-2nd-step3/Team29_BE
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'release/0.0.3' of https://github.com/29ana-notai/Team29_BE
- Loading branch information
Showing
1 changed file
with
307 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
│ │ ├── 📁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 문제를 공유하고 피드백 받을수 있게 ! ~ 금액과 연결지어서 사고파는 문제은행 |