Skip to content

Commit

Permalink
Merge branch 'release/0.0.3' of https://github.com/29ana-notai/Team29_BE
Browse files Browse the repository at this point in the history
 into release/0.0.3
  • Loading branch information
yugyeom-ghim committed Nov 15, 2024
2 parents 4332347 + adc67e4 commit ceaf1c3
Showing 1 changed file with 307 additions and 14 deletions.
321 changes: 307 additions & 14 deletions README.md
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
│   │   ├── 📁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 문제를 공유하고 피드백 받을수 있게 ! ~ 금액과 연결지어서 사고파는 문제은행

0 comments on commit ceaf1c3

Please sign in to comment.