Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MERGE] dev-be to prod-be #298

Merged
merged 65 commits into from
Dec 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
82efd8a
docs: 3주차 리드미 업데이트
gominzip Nov 14, 2024
d2de961
docs: 이미지 추가
jsk3342 Nov 14, 2024
acb7b92
feat: API 서버에서 RDB 연동 코드 작성
i3kae Nov 26, 2024
e9dd264
feat: 서버 종료 시 자동으로 DB에 다시보기 데이터가 저장되도록 코드 수정
i3kae Nov 26, 2024
e809a15
refactor: 방송/다시보기 정보에 m3u8 URL을 추가해서 전달
i3kae Nov 27, 2024
f874ca8
refactor, feat: 기존 DB 연결을 TypeORM으로 변경, 서버 시작/종료 시 DB 관리 기능 구현
i3kae Nov 27, 2024
e69539a
feat: 개발용 memory 데이터 삭제 API
i3kae Nov 27, 2024
04a6e5e
feat: 개발용 memory 데이터 추가 API
i3kae Nov 27, 2024
be82409
Merge branch 'dev-be' into feature-be-#203-replay_info_save_db
i3kae Nov 27, 2024
1bb3002
fix: yarn.lock 재설치
i3kae Nov 27, 2024
3025f3a
fix: yarn 의존성 재설치
i3kae Nov 27, 2024
20bf3ef
chore: nms version 수정
hoeeeeeh Nov 28, 2024
daa79ca
Merge branch 'prod-be' into dev-be
hoeeeeeh Nov 28, 2024
bec306c
feat, chore: 치지직 데이터 mock으로 불러오기, 자잘한 데이터 수정
i3kae Nov 28, 2024
1930548
Merge pull request #227 from boostcampwm-2024/feature-be-#203-replay_…
i3kae Nov 28, 2024
cfe9dab
chore: nms version 수정
hoeeeeeh Nov 28, 2024
29e0a96
Merge pull request #229 from boostcampwm-2024/dev-be
i3kae Nov 28, 2024
8351320
[REFACTOR] 세그먼트 프레임 6초로 설정
i3kae Nov 28, 2024
01c67a8
[REFACTOR] 세그먼트 프레임 10초로 설정
i3kae Nov 28, 2024
4ed9782
refactor: 치지직 데이터를 위한 임시 inmemory db 추가
i3kae Nov 28, 2024
4bbfbde
feat: init 질문 리스트 reverse
hoeeeeeh Nov 28, 2024
b9c2308
Merge pull request #238 from boostcampwm-2024/dev-be
hoeeeeeh Nov 28, 2024
b3a98cf
refactor: 시작/종료 시간을 기준으로 만들던 다시보기 m3u8을 생방송 m3u8을 기준으로 생성
i3kae Nov 28, 2024
e7a3a41
typo: lint 규칙에 맞춰 코드 수정
i3kae Nov 28, 2024
afb6f71
feat: 다시보기 요청 시 조회수가 오르도록 코드 수정
i3kae Nov 28, 2024
6822842
Merge pull request #241 from boostcampwm-2024/feature-be-#234-chzzk_l…
i3kae Nov 28, 2024
47bdfd9
Merge pull request #242 from boostcampwm-2024/dev-be
i3kae Nov 28, 2024
32a78ee
docs: 4주차 진행상황 수정
gominzip Nov 28, 2024
deeff44
Update README.md
jsk3342 Nov 28, 2024
9af8f06
Update README.md
hoeeeeeh Nov 28, 2024
2ecde20
Merge pull request #245 from boostcampwm-2024/prod-be
hoeeeeeh Nov 28, 2024
5c049cf
Merge branch 'dev' into dev-be
hoeeeeeh Nov 28, 2024
8bb0700
feat: outgoing message 에 socket.id 추가
hoeeeeeh Nov 30, 2024
e94af4c
feat: question dto 에 socket.id 추가
hoeeeeeh Nov 30, 2024
299da5e
feat: user ip ban 로직 추가
hoeeeeeh Nov 30, 2024
86e9327
feat: 방송/다시보기 존재 여부에 대한 체크 api
i3kae Nov 30, 2024
d24e4af
Merge pull request #251 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Nov 30, 2024
e875777
Merge pull request #254 from boostcampwm-2024/feature-be-live_replay_…
i3kae Nov 30, 2024
73c706e
fix: init data 형식 수정
hoeeeeeh Dec 2, 2024
e2ab360
Merge pull request #257 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Dec 2, 2024
905c03a
fix: init data 형식 수정
hoeeeeeh Dec 2, 2024
cce1a34
Merge pull request #259 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Dec 2, 2024
8175734
refactor: ChatException throw 시, roomId 를 담아서 throw
hoeeeeeh Dec 2, 2024
6a45640
Merge pull request #261 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Dec 2, 2024
8fb89c6
feat: Chat Exception 세분화
hoeeeeeh Dec 2, 2024
a5068ab
feat: Chat Exception 세분화
hoeeeeeh Dec 2, 2024
aebfe14
Merge pull request #264 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Dec 2, 2024
b47e98c
refactor : user ban 을 x-forwarded 에서 userAgent 로 변경
hoeeeeeh Dec 2, 2024
c4cbf1b
Merge pull request #268 from boostcampwm-2024/feature-be-#250-ban_user
hoeeeeeh Dec 2, 2024
976ccff
chore: API reponse 변경 및 기본 공지 변경
i3kae Dec 2, 2024
583db30
fix: 치지직 mock 데이터에 맞게 세션 확인 api가 동작하도록 수정
i3kae Dec 2, 2024
5ea5ded
feat: 라이브 이미지 url을 방송 시작 시 삽입
i3kae Dec 3, 2024
ea72aa7
chore: 다시보기 영상이 등록 순으로 정렬되도록 수정
i3kae Dec 3, 2024
d173cc7
refactor: node-media-server 업데이트
i3kae Dec 3, 2024
4ab309e
refactor: node media server에 맞춰 타입 추가
i3kae Dec 3, 2024
0706388
Merge pull request #276 from boostcampwm-2024/feature-be-#231-live_th…
i3kae Dec 3, 2024
4321e2a
feat: 개발자용 데이터 수정 api 추가
i3kae Dec 3, 2024
e21bce2
Merge pull request #281 from boostcampwm-2024/feature-be-#231-live_th…
i3kae Dec 3, 2024
a410a7a
fix: rtmp 버그 수정
i3kae Dec 3, 2024
835058b
refactor: 라이브 / 다시보기가 각각 시작 날짜, 종료 날짜 순으로 정렬되도록 수정
i3kae Dec 3, 2024
ffc2156
refactor: chat server 의 User 를 redis 로 이동
hoeeeeeh Dec 4, 2024
92f5ea4
Merge remote-tracking branch 'refs/remotes/origin/dev-be' into dev-be
hoeeeeeh Dec 4, 2024
307832d
refactor: chat server blacklist 로직 수정
hoeeeeeh Dec 4, 2024
c1e14b4
feat: check heartbeat
hoeeeeeh Dec 4, 2024
962d868
Merge branch 'prod-be' into dev-be
hoeeeeeh Dec 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 113 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,56 +1,132 @@
<div align="center">
<h1> 라이부 LiBoo </h1>
<h3> 컨퍼런스를 더 가까이, LiBoo 에서 라이브로 🚀 </h3>
<br/>
<p align=center>
<a href="https://gominzip.notion.site/TEAM-127673f3719e803faf63c70322560d3b?pvs=4"> Notion </a> &nbsp; | &nbsp;
<a href="https://www.figma.com/design/op5Ui6oZ4Zx2D8VUgWOKM0/LiBoo-%F0%9F%9A%80?node-id=1-2&node-type=canvas&t=zcYYT1qCtckcUdcs-0"> Figma </a> &nbsp; | &nbsp;
<a href="https://github.com/boostcampwm-2024/web22-LiBoo/wiki"> Wiki </a> &nbsp; | &nbsp;
<a href="https://github.com/orgs/boostcampwm-2024/projects/17"> BackLog </a>
</p>
</div>

<br/>

<p align=center>
<a href="https://gominzip.notion.site/TEAM-127673f3719e803faf63c70322560d3b?pvs=4"> 팀 노션 </a> &nbsp; ╎ &nbsp;
<!-- <a href="https://github.com/orgs/boostcampwm2023/projects/80">백로그</a> &nbsp; ╎ &nbsp; -->
<!-- <a href="https://www.notion.so/04317c11a3d240408383dab9249527a2">기획서</a> &nbsp; ╎ &nbsp; -->
<a href="https://www.figma.com/design/op5Ui6oZ4Zx2D8VUgWOKM0/LiBoo-%F0%9F%9A%80?node-id=1-3&t=WOh9pRJjrJinyUFT-1"> Figma </a> &nbsp; ╎ &nbsp;
<a href="https://gominzip.notion.site/12d673f3719e8109b9d4d3d63f74a988?pvs=4"> 그라운드 룰 </a> &nbsp; ╎ &nbsp;
<a href="https://gominzip.notion.site/12d673f3719e8098ad94ed6b71b10ac0?pvs=4"> 기술 정리 노트 </a> &nbsp; ╎ &nbsp;
<a href="https://gominzip.notion.site/12d673f3719e8012b6a9fa08b8662ad3?pvs=4"> 회의록 </a>
</p>
## 프로젝트 개요

> 토스, 배달의 민족, 카카오 등 다양한 컨퍼런스들이 있지만 실제로 신청해서 당첨되는 것은 쉬운 일이 아닙니다.
> <br>저희는 이러한 컨퍼런스 문화가 더욱 활발해지고, 더 많은 사람들이 기회를 얻을 수 있기를 바라는 마음으로 LiBoo 프로젝트를 기획하게 되었습니다.
> <br>작게는 팀원 간 소규모 기술 공유부터, 크게는 네이버 부스트캠프 발표나 기업의 컨퍼런스과도 함께할 수 있는 서비스를 만들고자 합니다!

<br/>

<div align="center">
<h3> 🧡 팀원 소개 </h3>

| 김준서 | 김영길 | 고민지 | 김지수 | 홍창현 |
| :----------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | :--------------------------------------------------------------------------: |
| <img src="https://avatars.githubusercontent.com/u/45356754?v=4" width="120" /> | <img src="https://avatars.githubusercontent.com/u/46553489?v=4" width="120" /> | <img src="https://avatars.githubusercontent.com/u/101329724?v=4" width="120"> | <img src="https://avatars.githubusercontent.com/u/85912592?v=4" width="120"> | <img src="https://avatars.githubusercontent.com/u/48922050?v=4" width="120"> |
| **BE** | **BE** | **FE** | **FE** | **FE** |
| [@i3kae](https://github.com/i3kae) | [@hoeeeeeh](https://github.com/hoeeeeeh) | [@gominzip](https://github.com/gominzip) | [@jsk3342](https://github.com/jsk3342) | [@spearStr](https://github.com/spearStr) |
# 📺 핵심 기능

### 실시간 컨퍼런스 스트리밍

실시간 컨퍼런스를 시청하거나 호스트가 되어 컨퍼런스를 직접 스트리밍 할 수 있습니다.

### 실시간 채팅

컨퍼런스를 보며 채팅으로 소통할 수 있습니다. 질문이 있다면 질문 채팅으로 전송이 가능합니다.

### 메인 대시보드

동영상 미리보기, 카테고리 등을 통해 원하는 컨퍼런스를 탐색해 볼 수 있습니다.

### 컨퍼런스 다시보기

실시간으로 방송되었던 컨퍼런스를 다시 돌려볼 수 있습니다.

<br/>

# ⚙️ 서비스 아키텍처
![라이부아키텍처 drawio (1)](https://github.com/user-attachments/assets/8867cbf9-99b6-4b24-a02b-a35952c5bf0d)
![Streaming Data Architecture](https://github.com/user-attachments/assets/02e854c4-4512-482d-bda2-719b7ceabea6)
```mermaid
sequenceDiagram
participant H as Host/OBS
participant HP as Host Page
participant MS as Main Server
participant RTMP as RTMP Server
participant OS as Object Storage
participant V as Viewer

Note over H,V: 방송 시작 전 (OBS 시작됨)

HP->>MS: HTTP: Stream Key 요청
MS->>MS: Unique Stream Key 생성
MS->>HP: Stream Key 반환
HP->>H: Stream Key 전달

H->>RTMP: RTMP: 스트림 전송 (Stream Key 포함)

RTMP->>RTMP: HLS 변환 (m3u8, segment 생성)
RTMP->>H: HTTP: HLS 스트림 전송
Note right of H: 호스트가 자신의 방송을<br/>모니터링 할 수 있음

Note over H,V: 방송 시작 후 (호스트 페이지에서 시작 버튼 클릭)

HP->>MS: 방송 시작 신호
MS->>RTMP: 방송 시작 알림

loop HLS 스트리밍
RTMP->>OS: HLS 파일 업로드 (m3u8, segment)
end

V->>MS: 컨퍼런스 선택 (대시보드에서)
MS->>V: Object Storage URL 반환

loop 스트리밍 시청
V->>OS: m3u8 요청
OS->>V: m3u8 파일 전송
V->>OS: segment 요청
OS->>V: segment 파일 전송
end
```

<br/>

# 🛠️ 기술 스택

| Part | Stack |
| ---------- | ----------------------------------------------------------------------------------------------- |
| 공통 | ![fullstack 2](https://github.com/user-attachments/assets/1a7f6b03-9d59-4ecc-adc9-39ad17ac67a4) |
| 프론트엔드 | ![fullstack 1](https://github.com/user-attachments/assets/64fdaa86-289d-42f0-80ce-4f01df4bfe75) |
| 백엔드 | ![fullstack 3](https://github.com/user-attachments/assets/8a01cd0b-f324-4c6e-85f6-f75c74239bdb) |

<br/>

# 🏃 주차별 진행 상황

| 주차 | 내용 요약 | 발표자료 |
| ----- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| 1주차 | 기획 공유 및 팀 목표 설정 | [보러가기](https://gominzip.notion.site/Week1-Web22-LiBoo-56af3bb7b2314f878667bdbbf99e791f?pvs=4) |
| 2주차 | 백로그 작성, 퍼블리싱, 동영상 스트리밍 아키텍처 설계 | [보러가기](https://gominzip.notion.site/Week2-Web22-LiBoo-137673f3719e805baab4e0a9855ed885?pvs=4) |
| 3주차 | CI/CD, 메인 api 서버 개발, 플레이어 커스텀, 웹소켓 학습 | [보러가기](https://gominzip.notion.site/Week3-Web22-LiBoo-a09dcec3adea4b289d22603df59f24be?pvs=4) |
| 4주차 | 채팅 구현, 서비스 시연 | [보러가기](https://gominzip.notion.site/Week4-Web22-LiBoo-13e673f3719e80e2a6b0cf5fe10d603a) |
| 5주차 | 채팅 고도화, 플레이어 고도화, 다시보기 api 설계 | [보러가기](https://gominzip.notion.site/Week5-Web22-LiBoo-14c673f3719e80eeb14fe3f1f668e1fc?pvs=4) |

</div>
<br/>

# 프로젝트 개요
# 🔥 기술적 도전

## LiBoo를 만들게 된 계기
꾸준한 문서화를 통해 지식을 공유하고, 깊이 있는 기술적 도전을 이어나가고자 합니다.

토스, 배달의 민족, 카카오 등 다양한 컨퍼런스들이 있지만 실제로 신청해서 당첨되는 것은 쉬운 일이 아닙니다.
- [[학습] 동영상 스트리밍 처리 프로토콜을 알아보자](https://gominzip.notion.site/b987e92eb6c84eef9af1301877eb7c91?pvs=4)
- [[학습] 웹 소켓의 실시간 양방향 통신](https://gominzip.notion.site/13b673f3719e8037b430ff7b6af397b7?pvs=4)
- [[과정/근거] 패키지 매니저 및 모노레포 정하기](https://gominzip.notion.site/7677c9cf96464b1d9e9c1d8afd4ab0b6?pvs=4)
- [[트러블슈팅] 외부의 사용자가 Object Storage에 접근하지 못하는 권한 제어](https://gominzip.notion.site/Object-Storage-1cf0c1bde758437ea595c57cf704a029?pvs=4)
- [[트러블슈팅] Docker yarn-berry workspace 를 찾지 못하는 오류](https://gominzip.notion.site/docker-yarn-berry-workspace-eff32ce3f695470a8a2d9ef4d02be1e0?pvs=4)

저희는 이러한 컨퍼런스 문화가 더욱 활발해지고, 더 많은 사람들이 기회를 얻을 수 있기를 바라는 마음으로 LiBoo 프로젝트를 기획하게 되었습니다.
[더 많은 기술정리 보러 가기](https://gominzip.notion.site/12d673f3719e8098ad94ed6b71b10ac0?pvs=4)

작게는 팀원 간 소규모 기술 공유부터, 크게는 네이버 부스트캠프 발표나 기업의 컨퍼런스과도 함께할 수 있는 서비스를 만들고자 합니다!
<br/>

## 주요 기능
# TEAM 정권지르기 👊

- **실시간 컨퍼런스 스트리밍**
- **실시간 채팅 기능**
- 컨퍼런스 실시간 뒤로가기 / 다시보기
- 메인 대시 보드
- 실시간 영상 하나 크게
- 다시보기
- 다른 컨텐츠들
- Q&A 기능
- 채팅 시 질문 채팅으로 설정 가능
- 가장 좋아요 많은 질문 하나 상단에 고정
- 질문 영역 클릭시 질문 모아둔 영영 보이게
- 중간 광고 (다시보기 정적 영상에 한해서)
- 컨퍼런스 내용 정리 AI
| 김준서 | 김영길 | 고민지 | 김지수 | 홍창현 |
| :----------------------------------------------------------------------------: | :----------------------------------------------------------------------------: | :---------------------------------------------------------------------------: | :--------------------------------------------------------------------------: | :--------------------------------------------------------------------------: |
| <img src="https://avatars.githubusercontent.com/u/45356754?v=4" width="120" /> | <img src="https://avatars.githubusercontent.com/u/46553489?v=4" width="120" /> | <img src="https://avatars.githubusercontent.com/u/101329724?v=4" width="120"> | <img src="https://avatars.githubusercontent.com/u/85912592?v=4" width="120"> | <img src="https://avatars.githubusercontent.com/u/48922050?v=4" width="120"> |
| **BE** | **BE** | **FE** | **FE** | **FE** |
| [@i3kae](https://github.com/i3kae) | [@hoeeeeeh](https://github.com/hoeeeeeh) | [@gominzip](https://github.com/gominzip) | [@jsk3342](https://github.com/jsk3342) | [@spearStr](https://github.com/spearStr) |
64 changes: 64 additions & 0 deletions backend/chatServer/src/chat/chat.error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { HttpStatus } from '@nestjs/common';
import { WsException } from '@nestjs/websockets';

class ChatException extends WsException {
statusCode: number;
constructor({ statusCode, message } : ChatError , public roomId?: string) {
super({ statusCode, message, roomId });
this.statusCode = statusCode;
}

getError() {
return {
statusCode: this.statusCode,
msg: this.message,
roomId: this.roomId || null,
};
}
}

interface ChatError {
statusCode: number;
message: string;
}

const CHATTING_SOCKET_ERROR = {
ROOM_EMPTY: {
statusCode: HttpStatus.BAD_REQUEST,
message: '유저가 참여하고 있는 채팅방이 없습니다.'
},

ROOM_EXISTED: {
statusCode: HttpStatus.BAD_REQUEST,
message: '이미 존재하는 방입니다.'
},

INVALID_USER: {
statusCode: HttpStatus.UNAUTHORIZED,
message: '유효하지 않는 유저입니다.'
},

UNAUTHORIZED: {
statusCode: HttpStatus.UNAUTHORIZED,
message: '해당 명령에 대한 권한이 없습니다.'
},

QUESTION_EMPTY: {
statusCode: HttpStatus.BAD_REQUEST,
message: '유효하지 않은 질문입니다.'
},

BAN_USER: {
statusCode: HttpStatus.FORBIDDEN,
message: '호스트에 의해 밴 당한 유저입니다.'
},

MSG_TOO_LONG:{
statusCode: HttpStatus.NOT_ACCEPTABLE,
message: '메세지의 내용이 없거나, 길이가 150자를 초과했습니다.'
}


};
export { CHATTING_SOCKET_ERROR, ChatException };

Loading
Loading