Skip to content

Conversation

@dami0806
Copy link
Collaborator

@dami0806 dami0806 commented Jan 9, 2026

#️⃣ 연관된 이슈 번호

관련된 이슈 번호를 작성하고, 자동으로 이슈를 닫으려면 Closes #이슈번호 형식으로 작성해주세요.


⏰ 작업 시간

예상 작업 시간과 실제 작업 시간을 작성해주세요.
두 시간이 다를 경우, 그 이유를 함께 설명해주세요.

  • 예상 작업 시간 : 1h
  • 실제 작업 시간 : 1h

📝 작업 내용

이번 PR(작업)을 통해 수행한 주요 내용을 구체적으로 작성해주세요.


관련된 스크린샷이나 캡처 화면을 첨부해주세요.


🪏 주요 고민과 해결 과정

image

백엔드 node-exp 접근이 안되고 있었다.
방화벽 가능성이 높았고 확인해보니 백엔드 inbound 추가 문제인것을 확인했다.

image

백엔드 서버의 메트릭 정보가 수집이 안되고 있었다.
학습때 누락되었던 부분이였다.

애플리케이션 메트릭을 수집할때: prom-client / Redis Exporter이렇게 사용했었다.

서버별 구성으로

  • 모니터링 서버: Node Exporter만
  • 백엔드 서버: Node Exporter + prom-client ⭐
  • Redis 서버: Node Exporter + Redis Exporter 이렇게 사용되었는데

Node Exporter, Redis Exporter = 독립 실행 파일 → 그냥 실행이 가능했다.
prom-client = npm 라이브러리 → NestJS 통합 코드 필요

그래서 첫번째로 prom-client의 설치 위치를 백엔드 디렉토리에서 누락시켰고, metric에 대한 글로벌 인터셉터 설정이 필요했다.

작업 중 겪은 문제나 고민, 그리고 그에 대한 해결 과정을 정리해주세요.
관련 트러블슈팅 문서가 있다면 링크로 연결해주세요.

위 사항들이 모드 트러블 슈팅을 해결하기 위한 과정이였고, 배포가 되었을때
URL: http://211.188.50.8:9090/targets를 재 확인해야한다.

  • prom-client 설치 (package.json)
  • PrometheusController/Service로 (/metrics 엔드포인트)
  • MetricsInterceptor 생성 (자동 메트릭 수집)
  • 로컬 테스트 성공
image

배포 환경도 수정 완료 했습니다

image

프로메테우스에서 node-exporter를 인식하지 못했던 문제 해결

image

promtail-client cd.yml 파일세팅 추가 -> 정상적인 loki 로그 수집 확인


💬 리뷰 요구사항

리뷰어가 중점적으로 확인해주길 바라는 부분이 있다면 작성해주세요.


📘 참고 자료

참고한 문서, 링크, 또는 외부 리소스를 작성해주세요.

@dami0806 dami0806 self-assigned this Jan 9, 2026
@dami0806 dami0806 added BE 서버, API, 비즈니스 로직 등 서버 사이드 작업 fix 기능 결함이나 예기치 않은 오류를 수정하는 작업 deploy CI/CD 설정 및 배포 관련 작업 labels Jan 9, 2026
Copy link
Collaborator

@KimDongGyun23 KimDongGyun23 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! any 타입은 수정해두면 좋을 것 같아요!

@YunDo-Gi YunDo-Gi self-requested a review January 9, 2026 07:58
Copy link
Collaborator

@YunDo-Gi YunDo-Gi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제가 발생한 원인을 찾고 해결하는 과정이 빠르네요! 고생하셨어요 👏👏

@dami0806
Copy link
Collaborator Author

dami0806 commented Jan 9, 2026

good idea!!

@dami0806 dami0806 merged commit 93417cd into develop Jan 9, 2026
1 check passed
@dami0806 dami0806 deleted the chore/#65-trubleshooting-backend-service branch January 20, 2026 06:09
dami0806 added a commit that referenced this pull request Jan 23, 2026
* setting: Update issue templates

이슈템플릿 생성

* Update issue templates

- 템플릿 title 수정

* merge: Be/Fe 기본 환경설정 세팅

* chore: pacakge 및 turborepo 설정

- package.json
- pnpm-workspace.yaml : workspace 설정
- .gitignore
- turbo.json : Turborepo 파이프라인 설정
- .prettierrc : prettier 설정

* chore: husky 세팅 및 테스트

- .husky/pre-commit: pre-commit hook 설정
- .lintstagedrc.json: lint-staged 설정
- package.json: prepare 스크립트 추가

* chore: shared-interfaces/nestJS/vite+ React 기본 세팅

- src/index.ts: 공통 타입/인터페이스 (빈 파일)
- package.json: @plum/shared-interfaces 패키지 설정
- pnpm build: 3개 패키지 모두 빌드 성공
- pnpm lint: 3개 패키지 모두 lint 통과

* chore: pacakge 및 turborepo 설정

- package.json
- pnpm-workspace.yaml : workspace 설정
- .gitignore
- turbo.json : Turborepo 파이프라인 설정
- .prettierrc : prettier 설정

* chore: husky 세팅 및 테스트

- .husky/pre-commit: pre-commit hook 설정
- .lintstagedrc.json: lint-staged 설정
- package.json: prepare 스크립트 추가

* chore: shared-interfaces/nestJS/vite+ React 기본 세팅

- src/index.ts: 공통 타입/인터페이스 (빈 파일)
- package.json: @plum/shared-interfaces 패키지 설정
- pnpm build: 3개 패키지 모두 빌드 성공
- pnpm lint: 3개 패키지 모두 lint 통과

* chore: PR 템플릿 세팅

* chore: pnpm format실행으로 코드와 문서 포맷 정리

* chore: 미비된 프로젝트 설정 추가 (#4)

* chore: 누락된 prettier 설정 추가

- 객체 선언 시 중괄호와 요소 사이의 공백 허용 옵션 추가
- jsx 내 따음표 방식을 쌍따음표로 고정
- jsx 나 html 요소 속성이 여러개일 때 한줄에 하나씩 배치하도록 설정

* chore: tailwindcss 설정 추가

- `tailwindcss`, `@tailwindcss/vite` 라이브러리 의존성 추가
- tsconfig 파일 설정이 vite.config.ts 파일을 검증하지 않는 오류 해결
- css 파일 import를 위해 vite-env.d.ts 파일 추가

* chore: 공용 라이브러리를 cjs, esm에서 모두 사용할 수 있도록 변경

- 두개의 tsconfig를 사용하지 않고도 build를 할 수 있도록 tsup 라이브러리 의존성 추가
- package.json에 main, module export 접근 수정

* chore: import 별칭 추가

- 백엔드에 import 경로 '@'을 추가하여 path 단순화
- 프론트엔드에 import 경로 '@'을 추가하여 path 단순화

* chore: auto assign 등록 기능 추가

* chore: 프론트엔드 cd 스크립트 추가 (#6)

* chore: 프론트엔드 cd 스크립트 추가

- vercel을 통한 배포 스크립트 작성
- vercel.json을 추가하여 배포 타겟 설정

* chore: 프론트엔드 모니터링 도구 추가 (#15)

- 개발 환경에서 vercel analytics + sentry 모니터링 추가
- 운영 환경에서 vercel analytics + vercel speed insights + sentry 모니터링 추가
- 빌드 시 sentry에 source map 전송

* chore: 폰트 및 글로벌 스타일 설정

- .editorconfig 및 .gitattributes 파일 추가로 기본 에디터 및 Git 설정 정리
- CSS 및 TTF 파일을 대상으로 lint-staged 처리 범위 확장
- 기본 폰트 추가 및 글로벌 스타일 엔트리 파일을 index.css로 통합

* chore: 프론트 백엔드 테스트 전략 및 CI (#8)

* test:backend Unit test 설정

- unit test setup and health module

* test: backend E2E Test 설정

- Supertest를 이용한 unit test setup

* chore: backend ESM 변환

- ESM으로 변경

* chore: frontend Unit Test 설정

- Vitest로 frontend unit test setup

* chore: frontend E2E Test 설정

- Playwright를 통한  frontend e2e test setup

* test: Turbo & Root 설정

- e2e task 추가 및 update

* chore: CI 워크플로우 설정

- e2e task 추가 및 update
- 추후 도커사용 예정으로 미리 husky git hook는 없어도 가능할 스크립트 추가하기

* fix:  빌드 시 테스트 파일의 tsc 처리 방지

* fix:  Vitest가 playwright의 test파일 탐색에 대한 exclude 세팅

* fix:  esm 수정후 경로명 파일 fullname으로 수정 필요

* fix:   frontend E2E 테스트 실행 시 Frontend 자체빌드 문제 수정

* Update apps/backend/src/health/health.controller.spec.ts

엇 혹시 확장자를 없애신 이유가 있을까요?? ESM에서는 확장자를 명시하지 않으면 오류가 납니다..!

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>

* chore: 프론트엔드 모니터링 도구 추가 (#15)

- 개발 환경에서 vercel analytics + sentry 모니터링 추가
- 운영 환경에서 vercel analytics + vercel speed insights + sentry 모니터링 추가
- 빌드 시 sentry에 source map 전송

* chore: 폰트 및 글로벌 스타일 설정

- .editorconfig 및 .gitattributes 파일 추가로 기본 에디터 및 Git 설정 정리
- CSS 및 TTF 파일을 대상으로 lint-staged 처리 범위 확장
- 기본 폰트 추가 및 글로벌 스타일 엔트리 파일을 index.css로 통합

---------

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>
Co-authored-by: 김동균 <wooheuy5752@gmail.com>

* chore: 커스텀 컬러 추가 (#18)

chore: 커스터 컬러 추가

- @theme 블록 내에 커스텀 컬러 정의

* chore: 아이콘 추가 및 vite-plugin-svgr 설정

- vite-plugin-svgr 설치 및 설정 적용
- SVG 아이콘 등록
- iconMap.ts에 아이콘 이름과 React 컴포넌트 매핑, IconName, IconComponent 타입을 정의

* chore: prettier-plugin-tailwindcss 플러그인 추가

* feat: 공통 아이콘 컴포넌트 구현

- 일부 아이콘명을 스네이크케이스에서 케밥케이스로 변경
- 아이콘 컴포넌트 추가
- 아이콘 컴포넌트에 대한 테스트 추가

* fix: sentry에 source map 자동 배포가 되도록 수정 (#26)

* chore: backend test서버와 prod서버에 자동CD 파이프라인 구축 (#28)

* test:backend Unit test 설정

- unit test setup and health module

* test: backend E2E Test 설정

- Supertest를 이용한 unit test setup

* chore: backend ESM 변환

- ESM으로 변경

* chore: frontend Unit Test 설정

- Vitest로 frontend unit test setup

* chore: frontend E2E Test 설정

- Playwright를 통한  frontend e2e test setup

* test: Turbo & Root 설정

- e2e task 추가 및 update

* chore: CI 워크플로우 설정

- e2e task 추가 및 update
- 추후 도커사용 예정으로 미리 husky git hook는 없어도 가능할 스크립트 추가하기

* fix:  빌드 시 테스트 파일의 tsc 처리 방지

* fix:  Vitest가 playwright의 test파일 탐색에 대한 exclude 세팅

* fix:  esm 수정후 경로명 파일 fullname으로 수정 필요

* fix:   frontend E2E 테스트 실행 시 Frontend 자체빌드 문제 수정

* Update apps/backend/src/health/health.controller.spec.ts

엇 혹시 확장자를 없애신 이유가 있을까요?? ESM에서는 확장자를 명시하지 않으면 오류가 납니다..!

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>

* chore: 프론트엔드 모니터링 도구 추가 (#15)

- 개발 환경에서 vercel analytics + sentry 모니터링 추가
- 운영 환경에서 vercel analytics + vercel speed insights + sentry 모니터링 추가
- 빌드 시 sentry에 source map 전송

* chore: 폰트 및 글로벌 스타일 설정

- .editorconfig 및 .gitattributes 파일 추가로 기본 에디터 및 Git 설정 정리
- CSS 및 TTF 파일을 대상으로 lint-staged 처리 범위 확장
- 기본 폰트 추가 및 글로벌 스타일 엔트리 파일을 index.css로 통합

* chore: backend CD 설정 완료 - Docker 기반 이중 서버 배포

* chore: CD 임시 설정 - develop PR도 prod 배포

* fix: 이름 불일치 문제를 CD 브랜치 동적 결정 및 저장소 이름 자동화로 수정

* fix: 머지 전에 배포 테스트로 인한 오류해결 PR 시 head_ref로 소스 브랜치 체크아웃

* fix: deploy-prod에 git remote URL 수정 추가

* chore: 백엔드 푸시 기반 CD 파이프라인 최종 구축

---------

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>
Co-authored-by: 김동균 <wooheuy5752@gmail.com>

* feat: 공용 버튼 컴포넌트 구현 (#29)

* chore: tailwind 클래스 관리 라이브러리 추가

- 'clsx', 'tailwind-merge', 'cva' 추가
- 클래스 병합을 위한 cn 유틸리티 함수 추가 (clsx + tailwind-merge)

* feat: 버튼 기본 레이아웃 구성

- 기본 스타일 적용

* chore: cva, cn, clsx 함수 내부에도 정렬 적용

* feat: variant 타입 추가

- default: solid 버튼 (bg-primary)
- ghost: 투명 배경 (text-primary)
- icon: 아이콘 전용 버튼 (p-1)

* feat: iconSize prop 추가

- iconSize prop: xs (12px), sm (16px), md (20px), lg (24px)
- 각 아이콘 크기에 맞는 strokeWidth 적용

* feat: 상호작용에 따른 스타일 추가

- 각 variant 타입에 대해서 hover, pressed(active), disabled 스타일 추가

* feat: 툴팁 컴포넌트 추가

- children 호버 시 툴팁 표시
- 표시 위치 선택 가능

* feat: 버튼 컴포넌트에 툴팁 적용

- 버튼 컴포넌트에 tooltip props 넣을 시 적용

* feat: 접근성 추가

- 키보드 접근성 스타일 추가
- 아이콘만 있으면 → tooltip 값을 aria-label로 사용

* refactor: Button 컴포넌트가 Icon 컴포넌트를 사용하도록 수정

- iconMap 대신 Icon 컴포넌트 사용

* test: 버튼 컴포넌트 테스트 작성

- 기본적인 버튼 기능에 대해서만 작성

* feat: 버튼 컴포넌트 type prop 추가

* refactore: HTMLAttributes를 ComponentProps로 변경

* test: Tooltip 컴포넌트 테스트 추가

* feat: 버튼 컴포넌트 icon 관리 제외

* test: 버튼 컴포넌트 수정에 따른 테스트 변경

* test: 부하 테스트를 위한 기본 구조 세팅 (#39)

- artillery 도구 기본 설정 추가
- k6 도구 기본 설정 추가
- playwright 도구 기본 설정 추가

* feat: 공통 모달 컴포넌트 구현

- Modal 컴포넌트 구현
- ESC 키 닫기 및 body 스크롤 잠금 기능을 커스텀 훅으로 분리
- Modal 컴포넌트에 대한 테스트 추가

* feat: 발표 자료 업로드 구현

- 발표 자료 파일 업로드를 위한 상수 추가
- 드래그 앤 드롭 기능을 제공하는 커스텀 훅 추가
- 파일 업로드 유효성 검사 함수 구현
- 발표 자료 파일 업로드 컴포넌트 구현
- 발표 자료 파일 업로드 컴포넌트에 대한 테스트 추가
- 파일 업로드 유효성 검사를 위한 테스트 추가
- 버튼 컴포넌트 유닛 테스트 파일명을 Button.test.tsx에서 Button.spec.tsx로 변경

* feat: Input 관련 컴포넌트 구현 (#42)

* feat: input 컴포넌트 추가

- 2가지 기본 사이즈 제공

* feat: label 컴포넌트 추가

- 기본 스타일 적용
- 2가지 사이즈 (input과 사이즈 통일)

* feat: required 인디케이터 추가

* feat: input 컴포넌트 disabled 상태 스타일 추가

* test: input 컴포넌트 테스트 코드 추가

* test: label 컴포넌트 테스트 코드 추가

* feat: helptext 컴포넌트 추가

* test: helptext 컴포넌트 테스트 추가

* chore: 폴더 구조 변경

- 컴포넌트 단위로 묶은 폴더 제거

* feat: 프론트엔드 커스텀 로거 구현

- 커스텀 로거 구현
- 커스텀 로거 테스트 케이스 추가

* feat: 헤더 및 푸터 컴포넌트 구현

- 애플리케이션 라우트 경로 정의
- SVG 로고 추가 및 헤더 컴포넌트 구현
- 푸터 컴포넌트 구현
- devDependencies에서 불필요한 패키지 제거

* chore 로깅과 모니터링 시스템 도입 및 Redis 서버 자동 시스템 구축 (#54)

* chore: winston 라이브러리 설치 및 설정

* fix: 400 log를 기록하기 위한 Interceptor의 한계 해결

* feat: Redis 서버 자동 배포 설정 추가

- Redis, Redis Exporter, Node Exporter compose 파일 추가
- CD 워크플로우에 배포 job 추가 (deploy-dev-redis, deploy-prod-redis)

* feat: Loki 설정

* feat: backend 서버에 exporter/ promtail 추가

* feat: monitoring 도커 컴포즈 설정

* feat: promtail yml파일 설정 완료

* feat: prometheus dev, prod yml설정

* fix: Winston logger dependency 모킹 추가

* test: dev에 pr을 통한 배포 테스트 진행

* fix: clone하기 위한 빈 환경으로 세팅로직 추가

* fix: Git clone 시 SSH 키 인증 추가

- git clone 명령어에 GIT_SSH_COMMAND 누락 문제 해결
- redis, monitoring 배포 모두 수정

* refactor: CD 워크플로우 완전 개선

- 트리거를 push 전용으로 변경 (PR 제거)
  - develop push → dev 배포
  - main push → prod 배포

- SSH 호스트 키 검증 문제 완전 해결
  - UserKnownHostsFile=/dev/null 추가
  - export GIT_SSH_COMMAND 사용
  - Dev/Prod 모든 배포에 적용

* fix:추적중인 log 제거 및 ignore 등록

* fix: grafana 환경변수 수정 및 하드코드 제거

* fix: 플레이스홀더/환경변수/OKI_HOST 주입 로직 추가로 ip변환

* refactor: 프론트엔드 import/export 컨벤션 통일

- 함수 선언 방식으로 변경하여 일관성 유지
- ComponentProps를 React에서 직접 가져오도록 수정

* feat: 강의실 하단 메뉴바 구현 (#53)

* feat: RoomButton 기본 스타일 적용

- 기존 Button 컴포넌트를 랩핑하는 방식

* feat: 알람 인디케이터 추가

- 'hasAlarm = true' 인 경우 인디케이터 표시

* feat: variant 타입 추가

- ghost: bg-transparent (active 일 때 primary)

* test: RoomButton 테스트 추가

* chore: 파일 위치 이동

* feat: RoomMenuBar 컴포넌트 추가

* refactor: room 타입 분리

- 변수명 변경 (Overlay -> Dialog)

* feat: useRoomMenuBar 훅 추가

- 미디어 (마이크, 카메라, 화면 공유), 다이얼로그,  사이드 패널 상태 관리

* test: RoomMenuBar 테스트 코드 추가

* chore: zustand 추가

* feat: 미디어 상태 관리 스토어 추가

- 카메라, 마이크, 화면 공유 상태 관리

* feat: UI 상태 관리 스토어 추가

- 다이얼로그, 사이드패널 상태 관리
- 기존 커스터 훅 제거

* feat: useMediaStore의 initialState에 타입 명시

* refactor: RoomMenuBar가 스토어를 사용하도록 변경

* test: 컴포넌트 리팩토링에 따른 테스트 코드 변경

* refactor: 컨벤션 반영

- ComponentProps를 React에서 직접 가져오도록 수정
- export 시 default 제외

* refactor: 타입 위치 이동 및 미사용 타입 제거

* fix: CI 에러 해결

- export 형식

* feat: 웹 소켓 게이트웨이 설정 추가 (#63)

* feat: 웹 소켓 게이트웨이 설정 추가

- FE_URL 환경 변수 추가
- cors 설정 변수 추가
- socket.io 기본 설정 변수 추가
- socket.io 기본 연결을 위한 room, media, intercation 구조 설정
- socket.io 전역 에러처리를 위한 filter 추가

* feat: Prometheus metrics endpoint 추가 (#66)

* feat: Prometheus metrics endpoint 추가

* feat: 로컬 개발용 세잍 추가

- 백엔드는 로컬에서 실행
-나머지 서비스는 도커 실행

* fix: 배포 환경 Loki 설정에 타임스탬프 관련 설정추가

* chore: cd 트리거 변환 및 test

* fix: Loki 로그 수집 및 Node Exporter 배포 수정

- 배포 시 모든 서비스 시작 (backend, node-exporter, promtail)
- 로그 쿼리를 위한 static labels 유지 (job, env, filename)

* fix: Promtail이 환경변수를 못 읽어서 Loki 주소를 몰라서 로그 전송 실패수정

* fix: Loki 로그 수집 및 CD 워크플로우 Promtail 추가 수정

* fix: CD 워크플로우에 Promtail 설정 파일 복사 추가

* fix: Promtail 설정에서 기본값 문법 제거

* fix: 브랜치 트리거 되돌리기 및 any타입 제너릭 변환

* feat: 사전 투표 선택지 추가 및 제거 UI 구현

- 투표 선택지 개수 제한 상수 추가
- 투표 선택지 타입 인터페이스 추가
- 선택지 고유 ID 및 빈 선택지 배열 생성 함수 추가
- 투표 선택지 상태 관리 커스텀 훅 구현
- 투표 선택지 목록 및 아이템 컴포넌트 구현
- 투표 생성 모달 컴포넌트 추가
- PollOptionListSection 및 usePollOptions, 유틸리티 함수에 대한 테스트 추가

* feat: 제한 시간 드롭다운 구현

- ESC 키로 모달 닫기 기능을 제공하는 커스텀 훅 구현
- 특정 요소 외부 클릭을 감지하는 커스텀 훅 구현
- 시간 제한 옵션 및 기본 값 상수 추가
- 시간 제한 드롭다운 컴포넌트 및 섹션 추가
- TimeLimitDropdown 컴포넌트에 대한 테스트 추가

* feat: 투표 모달 구현

- 투표 생성/수정 모달 구현
- react-hook-form + zod 기반 폼 유효성 검사 및 제출 플로우 추가
- 모달 레이아웃과 접근성 개선
- 공용 FormField 컴포넌트 도입
- 모달 닫기 및 제출 시 폼 상태를 초기화하도록 처리해 투표 생성/수정 UX 개선

* feat: 강의실 캠 관련 컴포넌트 구현 (#71)

* feat: 참가자 비디오 컴포넌트 추가

- 최소화, PIP, 사이드탭 모드 지원
- 모드에 따른 호버 UI

* feat: useItemsPerPage 훅 추가

- 화면 높이에 따른 최대 캠 개수 계산
- 반응형 페이지네이션 지원

* feat: usePagination hook 추가

- 현재 페이지, 현재 아이템 목록, 이전/이후 페이지 이동, 페이지 존재 여부 제공

* feat: 참가자 타입 추가

* feat: ParticipantGrid 컴포넌트 추가

* refactor: 변수 명 변경

- onCurrentUserModeChange -> onModeChange

* refactor: 애니메이션 적용을 위해 단일 return으로 변경

- minimize <-> pip 애니메이션 적용

* feat: useDraggable 훅 및 Draggable 컴포넌트 추가추가

- 드래그앤드롭 지원
- 부모 컨테이너 내부에서만 이동 가능하도록 경계 지정

* refactor: useDraggable 훅 최적화

- rAF를 적용하여 이벤트 최적화
- 사용되지 않는 isDragging 상태 제거
- getBoundingClientRect() 같은 수치 계산을 handleMove가 아닌 handleMouseDown에서 한 번만 수행

* feat: 드롭 시 코너로 스냅되는 로직 추가

- 사분면 기준으로 위치에 따라 스냅

* feat: 스냅 시 애니메이션 추가

* refactor: 호버 동작방식 변경

- 호버 상태 제거
- css group-hover 적용

* test: ParticipantVideo 컴포넌트 테스트 추가

* test: ParticipantGrid 컴포넌트 테스트 추가

* test: Draggable 컴포넌트 테스트 추가

* refactor: 컨벤션에 어긋난 부분 수정

- React.ReactNode -> ReactNode

* chore: motion 패키지 추가

* feat: 레이아웃 및 호버 애니메이션 추가

- 기존 css 호버 애니메이션을 모션으로 대체

* fix: 버튼 disable 전환 시 번쩍이는 문제 수정

* test: 컴포넌트 수정에 따른 테스트 코드 수정

* feat: QnA 질문 폼 및 모달 구현

- QnA 폼 유효성 검사 및 스키마 추가
- FormFieldCheckboxInput 컴포넌트 추가
- 공통 QnA 모달 컴포넌트 구현

* refactor: 기존 feature 내부에 있던 투표 모달 부분을 공통 컴포넌트로 분리

- 투표 옵션 리스트, 투표 모달, 투표 폼을 하나의 파일에 병합
- 상수 및 스키마는 shared/constants에 위치

* feat: 강의실 생성 페이지 UI 구현

- 전역 윈도우 스타일 추가
- 강의 자료 업로드 컴포넌트를 create-lecture 내에 선언
- 기존 커스텀 훅 및 상수 파일 shared로 분리
- 활동(투표/Q&A) 상태 및 제어 함수들 관리 컨텍스트 및 훅 구현
- 강의 생성 폼 스키마 및 기본 값 정의
- 페이지 서브 헤더 컴포넌트, 강의 생성 폼 및 페이지 구현
- 커스텀 훅, 컴포넌트에 대한 테스트 추가

* feat: 강의실 기본 레이아웃 구현 (#78)

* feat: Dialog 컴포넌트 추가

* feat: ScreenShareBanner 컴포넌트 추가

* feat: SidePanel 컴포넌트 추가

- SidePanel, SidePanelHeader, SidePanelContent

* test: Dialog 컴포넌트 테스트 추가

* test: SidePanel 컴포넌트 테스트 추가

* feat: ParticipantGrid과 RoomMenuBar 레이아웃 수정

- ParticipantGrid 왼쪽 마진 추가
- RoomMenuBar에서 h1에  truncate 적용되도록 수정

* feat: 단일 화면 패널 컴포넌트 추가

- 채팅과 강의 정보에 대한 패널

* feat: 서브페이지를 가지는 메뉴 패널 컴포넌트 추가

* feat: 강의실 페이지 추가

- 섹션 단위로 컴포넌트 묶기
- 관련 상태 및 로직 훅으로 분리

* feat: 강의실 입장 전 대기 화면 레이아웃 구현

- 강의실 입장 섹션 컴포넌트 추가
- FormField에 ToggleInput 추가 및 강의 생성/입장 폼 스키마, 기본값 정의
- 강의실 입장 폼 컴포넌트/섹션 분리
- 강의실 입장 폼에 zodResolver 적용 및 버튼 스타일 수정
- 강의실 입장 폼 테스트 케이스 추가

* feat: 카메라/마이크 On/Off 토글 및 초기 상태 반영

- logger에 media 카테고리 추가
- 전역 미디어 스트림 상태 관리 스토어 구현
- 로컬 미디어 스트림 확인 컴포넌트 구현
- 강의 입장 폼과 로컬 미디어 미리보기 컴포넌트를 연결
- 라우팅 설정 및 임시 메인페이지 구현
- App.tsx 단위 테스트 파일 제거 및 e2e 테스트 파일 수정

* chore: Redis, Mediasoup, Socket.IO Redis Adapter 초기 설정 (#85)

* chore: 필요 의존성 패키지 설치하기

* feat: Redis 모듈 구현

* feat: Mediasoup 모듈 구현

* feat: Socket.IO Redis Adapter 설정

* feat: 공유 타입 정의

* feat: redis와 mediasoup 서버 배포

* fix: gateway 주입DI Mock사용

* fix: 프론트 측 e2e playwright오류 임시 파일 삭제

* Merge branch 'develop' into chore/#81-mediasoup-redisio-init

* fix: Dockerfile에 Mediasoup 빌드 도구 추가 (#89)

* chore: 필요 의존성 패키지 설치하기

* feat: Redis 모듈 구현

* feat: Mediasoup 모듈 구현

* feat: Socket.IO Redis Adapter 설정

* feat: 공유 타입 정의

* feat: redis와 mediasoup 서버 배포

* fix: gateway 주입DI Mock사용

* fix: 프론트 측 e2e playwright오류 임시 파일 삭제

* Merge branch 'develop' into chore/#81-mediasoup-redisio-init

* fix: Mediasoup postinstall 중 에러해결

- Prebuilt binary 실행 실패 (Alpine Linux 호환 문제)
- 로컬 빌드 시도 → Python 없음 → 실패

* fix: docker build오류를 CI 단계에서 발견하기

* fix: Dockerfile에 py3-pip 추가 (Mediasoup 빌드용)

* fix: Dockerfile에 linux-headers 추가 (Mediasoup liburing 빌드용)

* fix: 호환성 문제로 Alpine -> Debian변환

* fix: --prod로 재 수정

* feat: 강의실 생성 api 구현 (#86)

* feat: 질문 및 투표 생성 서비스 로직 추가

- mock repository를 추가하여 생성 로직 모킹
- 질문, 투표 생성 스키마를 shared-interfaces로 이동
- 질문, 투표 생성 로직을 interaction 도메인 하위에 생성

* feat: s3를 이용한 업로드 로직 구현

- s3 env 값 추가
- s3 bucket을 이용한 업로드 로직 추가

* feat: 강의실 생성 api 구현

- 질문, 투표 타입 정의
- 참가자 생성 로직 추가
- 강의실 생성 로직 추가
- 강의실 생성 api를 추가하여 해당 로직과 연결

* refactor: 데이터 형태 통일시키기

- 프론트와 백엔드 타입 일치시키기

* test: 구현된 로직에 대한 테스트 코드 추가

- 질문, 투표 생성 테스트 코드 추가
- 발표자료 업로드 로직 테스트 코드 추가
- 참가자 생성 테스트 코드 추가
- multipart로 인한 string 타입 데이터 검증 로직 추가

* chore: 환경변수 속성 값을 ci, cd 과정에 추가

- ci 과정에서 더미 환경변수 추가
- cd 과정에서 실제 환경변수 추가

* feat: 기존 로직에 redis 로직 추가

- redis에 데이터 저장을 위한 모듈 매니저 추가
- 모듈 매니저에서 기본적인 CRUD를 위한 베이스 매니저 추가
- 기존 로직에 실제로 redis 저장 로직 추가

* feat: mediasoup 로직 연결 추가

- 강의실 생성 시 mediasoup router 생성 로직 추가
- 강의실 생성 후 발표자가 바로 강의실 입장을 할 수 있도록 응답 payload 수정
- 테스트 코드 업데이트

* fix: e2e 테스트가 ci 에서 에러나는 문제 해결

- e2e 테스트환경에서 redis가 없어 redis를 mocking하여 해결합니다.

* feat: 강의실 입장 API 구현 (#91)

* feat: 강의실 id 점검 API 추가

- 강의실 id 점검 로직 추가
- 강의실 id 점검 endpoint 추가
- 강의실 id 점검 response, request 추가
- 공용 에러 response 타입 추가
- ulid 검증 pipe 추가

* feat: 닉네임 중복 검증 API 추가

- 닉네임 중복 로직 추가
- 중복 로직에 대한 테스트 코드 추가

* feat: 강의실 입장 API 구현

- 강의실 입장 로직을 위한 타입 정의
- 강의실 입장 로직 추가
- 강의실 입장 로직 테스트 코드 추가

* feat: 공용 api 클라이언트 구현 및 강의 생성 api 연동 (#93)

* feat: API 클라이언트 기본 구조 추가

- Fetch 기반 API 클라이언트 구현
- 에러 핸들링
- HTTP 메서드 지원 (GET, POST, PUT, DELETE, PATCH, postFormData)

* feat: Room API 엔드포인트 추가

- createRoom API 구현
- FormData로 파일 업로드 지원

* feat: 강의실 생성 커스텀 훅 추가

- useCreateRoom 훅 구현
- 제출중(isSubmitting) 상태 관리

* feat: 강의 생성 폼에 API 연동

- 제출중(isSubmitting == true)인 경우에 로딩 상태 표시 (버튼 비활성화, 버튼 텍스트 변경)
- 성공/실패 시 alert 표시 (추후 변경)

* feat: 요청/성공 로그 추가

* fix: CreateRoomResponse 타입 변경에 따른 수정

* refactor: 응답 타입 수정

- 성공 | ErrorResponse 유니온 -> 성공

* feat: 소켓 연결 및 상태 관리 스토어 구현

- 소켓 연결 및 상태 관리 스토어 구현
- useSocketStore에 대한 테스트 케이스 추가

* Feat/#92 mediasoup signaling channel (#98)

* feat: 강의실 id 점검 API 추가

- 강의실 id 점검 로직 추가
- 강의실 id 점검 endpoint 추가
- 강의실 id 점검 response, request 추가
- 공용 에러 response 타입 추가
- ulid 검증 pipe 추가

* feat: 닉네임 중복 API 추가

- 닉네임 중복 로직 추가
- 중복 로직에 대한 테스트 코드 추가

* feat: 강의실 입장 API 구현

- 강의실 입장 로직을 위한 타입 정의
- 강의실 입장 로직 추가
- 강의실 입장 로직 테스트 코드 추가

* feat: 강의실 입장 소켓 이벤트 구현

* feat: Transport 생성/연결 구현

* feat: 강의실 퇴장 처리 구현

* fix: backend 테스트 코드 추가 및 프론트 엔드 충돌 재 해결

* fix: 충돌로 코드위치 이동 해결

---------

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>

* feat: mediasoup 공용 device 스토어 구현

- Mediasoup Device 관리 전역 스토어 구현
- useMediaDeviceStore에 대한 테스트 케이스 추가

* feat: 미디어 스트림 송수신을 위한 이벤트 추가 (#107)

* feat: 미디어 스트림 송수신을 위한 이벤트 추가

- 이벤트에 대한 타입 정의 추가
- 미디어 스트림 송수신에 필요한 로직 추가
- 미디어 스트림 송수신에 필요한 이벤트 추가

* feat: 미디어 전송/수신을 위한 Transport 생성 및 관리 훅 구현

- 미디어 전송/수신을 위한 Transport 생성 및 관리 훅 구현
- useMediaTransport 훅에 대한 테스트 케이스 추가
- `packages/shared-interfaces/src/socket.ts` 의 BaseResponse 인터페이스를 export로 변경

* feat: mediasoup Producer 커스텀 훅 구현

- 로컬 미디어 송출 관리 훅(useMediaProducer) 구현
- useMediaProducer 훅에 대한 테스트 추가
- initDevice 메서드의 반환 타입을 Promise<Device>로 변경
- Device 인스턴스를 useMediaTransport 훅의 매개변수로 전달하도록 변경

* feat: 미디어 수신 Consumer 훅 구현

- 미디어 수신 Consumer 훅 구현

* feat: 강의실 입장 API 연동 및 mediasoup 관련 상태 초기화

- 강의실/닉네임 검증 API 및 EnterLecture 입장 폼 연동
- 닉네임 중복 확인 및 중복 확인 완료 시에만 제출 가능 로직 추가
- 입장 응답 기반으로 참여자 정보와 mediasoup device 초기화 및 세션스토리지에 저장
​- mediaStore와 localStream 동기화, 새로고침 시 미디어/사용자 상태 복구 처리
- Room 관련 컴포넌트/훅/레이아웃 리팩터링 및 관련 테스트/목 수정

* feat: CORS 설정에 새 도메인 추가 (#115)

* feat: CORS 설정에 새 도메인 추가

* fix: mediasoup 패키지 설치 삭제

* fix: CI에서 테스트한 그 이미지로 배포하도록 수정

* feat: 강의실 투표 및 Q&A UI 구현 (#117)

* feat: 투표 다이얼로그 컴포넌트 추가

* test: PollDialog 테스트 추가

* feat: Q&A 다이얼로그 컴포넌트 추가

* test: QnADialog 테스트 추가

* feat: TimeLeft 컴포넌트 추가

- props로 전달받은 시작 시간 기준 남은 시간 계산

* test: TimeLeft 테스트 추가 및 기존 테스트 수정

- 컴포넌트 수정에 따른 PollDialog, QnADialog테스트 수정

* feat: 선택 변경 불가 안내 메세지 추가

* refactor: Mediasoup Producer/Consumer 시그널링 분리 및 훅 구조 개선

- Mediasoup Transport 관련 시그널링 처리부분을 useMediaTransport에서 별도로 분리
- Mediasoup Producer 관련 시그널링 처리부분을 useMediaProducer에서 별도로 분리
- Mediasoup Consumer 관련 시그널링 처리부분을 useMediaConsumer에서 별도로 분리
- feature/room/mediasoup내부로 파일 이동

* feat: 강의실 미디어 스토어에 원격 스트림 관리 기능 추가

- useMediaStore에서 액션을 분리하여 상태 관리 개선
- 원격 스트림 관리 기능 추가 (추가, 제거, 가져오기, 초기화)

* 강의실 스토어에 참가자 관리 정보 추가

- routerRtpCapabilities 추가 및 setter 액션 추가
- 참가자 관리 기능 추가 및 상태 업데이트

* feat: gesture backend (#144)

* feat: socket-interfaces의 gestureType추가

* feat: socket.ts에 인터페이스 및 속성 추가

- ActionGestureRequest 인터페이스 추가
- UpdateGestureStatusPayload 인터페이스 추가
- ClientToServerEvents에 action_gesture 추가
- ServerToClientEvents에 update_gesture_status 추가

* feat: RoomGateway에만 있는 소켓 메타데이터 공용으로 분리

* feat: InteractionGateway에 action_gesture 핸들러 구현

* fix: provider로 공통 서비스 접근에서 글로벌 모듈로 분리

* fix: SocketMetadataService를 글로벌 모듈로 분리 test코드 업데이트

* fix: Server인스턴스로 본인 포함 모두에게 전달 로직으로 수정

* feat: Mediasoup 미디어 제어 고수준 API 설계

- 원격 스트림 관리 기능 및 화면 공유 상태 설정 추가
- 고수준 미디어 연결 관리를 담당하는 전역 컨텍스트 생성
- Room 페이지 컴포넌트를 MediaConnectionProvider로 감싸서 사용

* feat: 강의실 정보 UI 구현 (#148)

* chore: 복사 아이콘 추가

* refactor: 버튼이 <a>로도 렌더링 가능하도록 수정

- as prop을 통해 설정 가능 (default: button)

* feat: 강의 정보 컴포넌트 추가

* feat: url로부터 참여 링크 생성

* fix: 타입 에러 수정

- button과 a 태그 분기 렌더링으로 분리

* refactor: 공통 로직으로 buildJoinLink 분리

* feat: 강의실 페이지 입장 시, mediasoup 초기화

- 기존 useRoom 훅에서 관리되었던 모든 상태를 사용되는 컴포넌트에서 직접 선언
- 소켓 스토어에 이벤트 핸들러 등록/해제 기능 추가
- 방 입장 및 미디어 설정을 위한 초기화 훅 구현
- 훅 언마운트 시, 미디어 자원 정리 및 소켓 이벤트 핸들러 해제 기능 추가
- 방 콘텐츠 초기화 훅 추가 및 로딩/에러 처리

* feat: 투표 관리 UI 구현 (#155)

* feat: Tabs 컴포넌트 추가

* feat: ScheduledCard 컴포넌트 추가

* refactor: TimeLeft 컴포넌트 스타일 클래스와 아이콘 사이즈 받도록 수정

* feat: PollManagementTabs 컴포넌트 추가

- 예정, 진행중, 완료에 따른 렌더링

* feat: 투표 추가 버튼 클릭 시 투표 생성 모달 열기

* test: PollManagementTabs 테스트 추가

* test: 테스트 에러 수정

- 렌더 타이밍 이슈 해결

* feat: 투표자 표시 높이 제한 및 스크롤 커스텀 디자인 적용

* feat: 화면 공유 기능 연결

- 화면 공유 중지 및 버튼 클릭 핸들러를 ScreenShareBanner 컴포넌트 내부 선언
- MyVideo 및 ParticipantGridSection 컴포넌트 분리
- ParticipantGridSection 컴포넌트를 ParticipantGrid로 통합
- ScreenShareBanner에서 화면 공유 중지 시, useMediaConnectionContext에서 액션 실행
- RoomMenuBar의 MainMenu에서 화면 공유 토글 연결
- ScreenShareVideo에 화면 공유 상태에 따라 비디오 혹은 빈 화면 출력

* feat: 강의실 종료 기능 추가 (#149)

* feat: 강의실 종료 기능 추가

- 강의실 종료 이벤트에 대한 데이터 타입 정의 추가
- 강의실 종료 로직 추가

* fix: CI 오류 해결

* fix: 리뷰 반영

- 라우터를 닫기 전에 먼저 이벤트 브로드캐스팅

* docs: 프로젝트 소개 및 상세 아키텍처를 포함한 README 작성 (#158)

dosc: 프로젝트 소개 및 상세 아키텍처를 포함한 README 작성

- background & problem 섹션 추가
- 서비스 핵심 가치 섹션 추가
- 시스템 구조도 추가
- 퀵스타트 및 팀원 소개 업데이트

* feat: 강의실 재입장 기능 추가 (#146)

* feat: 강의실 재입장 기능 추가

- 강의실 재입장을 위해 기존 비정상 퇴장에 유예시간을 추가
- 입장 시 재입장/신규 입장 구분 로직 추가
- 유예시간 동안 다시 입장 요청이 오는 경우 기존 참가자 정보 활용
- join_room 이벤트에서 mediasoup 데이터를 반환할 수 있도록 수정

* fix: 재입장시 participant mediasoup 데이터 초기화 로직 추가

* fix: 소켓 이벤트 성공 타입 판별자 추가

- 소켓 이벤트 타입을 확실하게 하기 위해 성공/실패 타입 가드 추가

* 강의실 내부 카메라 및 오디오 토글 버튼 기능 연결

- 마이크는 하드웨어 점유 유지, 카메라는 하드웨어 점유 해제 전략 사용
- 변경된 useStreamStore에 맞게 로컬 미디어 스트림 관리 수정
- 변경된 컴포넌트 내용에 맞게 RoomMenuBar 테스트 수정

* fix: 배포 환경에서 redis 객체 수정이 안되는 문제 해결 (#163)

* 강의실 내부 다른 사용자 카메라 불러오기

- 참가자 목록 관리 및 비디오 스트림 처리
- 카메라를 켠 참가자를 위로 정렬
- 최대 아이템 수 설정 기능 추가 및 계산 로직 수정
- 비디오 스트림 관리 로직 개선 및 카메라 꺼짐 처리 추가
- 소켓 이벤트 핸들러에 media_state_changed 추가
- ProducerSignaling 모듈에 미디어 상태 변경 알림 기능 추가

* feat: 강의실 입장 시 기존에 입장해 있는 참가자 정보 반환 (#165)

- 강의실 입장/참가, join_room 이벤트에 기존 참가자 정보 반환 추가

* feat: 투표 관련 기능 추가 (#167)

* feat: 기존 웹소켓 이벤트 error 응답 방식으로 데이터 수정

- 웹소켓에서 예외처리시 ACK 방식으로 응답을 하도록 수정

* feat: 강의실 내부에서 투표 생성 이벤트 추가 (#128)

- create_poll 이벤트 처리 추가
- create_poll 요청/응답 타입 정의
- zod-validation api/socket 용으로 구분

* feat: 투표 생성시 관리 방법 변경

- 투표 생성후 room 객체 리스트로 넣는 것이 아니라 listKey로 관리
- 기존 테스트 코드 수정

* feat: 투표 조회 기능 추가 (#132)

- 강의실 id 기반 투표 조회 로직 추가
- 투표 조회 socket event 구현

* feat: 투표 시작 로직 구현 (#133)

- redis TTL 을 이용해 구현
- 투표 시작시 투표 시작을 참가자들에게 브로드캐스팅

* feat: 투표 답변 기능 추가 (#135)

- 투표에 답변할 수 있는 기능을 추가합니다.
- 투표 관리를 redis에게 위임하여 atomic을 보장합니다.
- 투표 답변 후 최신화된 정보를 브로드캐스트해서 알립니다.

* feat: 투표 종료 기능 추가 (#138)

- 클라이언트측에서 break_poll 이벤트 발생시 투표 종료 기능 추가
- 투표 집계를 위해 투표자 정보 저장하게끔 수정
- 투표 집계 정보를 역할에 따라 다르게 전달하게 수정
- 투표 종료시 총 결과를 반환할 수 있게끔 추가
- pollOption 데이터에 투표자 리스트 정보 추가

* feat: 투표 자동 종료 기능 추가

- redis ttl 만료 이벤트를 통한 자동 종료 기능 추가
- 이벤트 emitter 추가

* fix: zod-validation.pipe 에러 해결

- zod-validation.pipe에서 데이터를 반환하지 않아 e2e테스트 오류 해결

* feat: 프론트 제스처 인식 기능 구현 (#147)

* chore: mediapipe 패키지 추가

* feat: 랜드마크 감지 유틸 추가

- ok 사인 인식

* feat: 제스처 인식 훅 추가

- Mediapipe GestureRecognizer 활용
- 제스처 인식에 따른 소켓 이벤트 송수신

* chore: 제스처용 아이콘 추가

* feat: 제스처 인식 진행도 표시용 스토어 추가

* feat: 인식 진행도 표시 컴포넌트 추가

* fix: 타입 변경에 따른 에러 수정

* chore: 핸드 제스처 아이콘 추가

- 손들기, 1, 2, 3, 4

* feat: 1, 2, 3, 4 제스처 인식 기능 추가

* chore: 포즈 제스처 아이콘 추가

* feat: O, X 포즈 제스처 인식 기능 추가

* refactor: mediapipe 동적 임포트 적용

* feat: 제스처 인식 훅 연결

* feat: 제스처 인식 로직 web worker에서 수행

* chore: toast용 아이콘 추가

* feat: 토스트 컴포넌트 및 스토어 추가

- TTL 이후 토스트 자동 제거

* refactor: ToastItem 컴포넌트 분리

- Motion layout 적용을 위해 ref 전달

* feat: 제스처 알림 토스트 표시

- update_gesture_status 이벤트 수신 시 제스처 알림 토스트로 표시

* refactor: 제스처 스토어 구독 GestureProgressOverlay 내부로 이동

- ParticipantVideo의 불필요한 리렌더 제거

* feat: 제스처 토스트 스타일 변경

- 제스처에 따른 아이콘 및 배경색 설정

* refactor: 비정상퇴장 및 재입장 로직 변경 (#169)

- setTimout 대신 redis EX를 활용
- event Emiiter를 이용해 redis EX 이벤트에 따라 함수 실행

* 강의실 입장 로직 개선 및 참여자 원격 스트림 연동

- 세션스토리지에서 routerRtpCapabilities, role 제거
- 방 입장 및 세션 관리를 담당하는 RoomSignaling 모듈 추가
- 소켓 이벤트 핸들러 통합 및 초기화 파이프라인 개선
- 참가자 비디오 수신 로직 개선 및 미디어 연결 관리 기능 추가
- 참가자 페이지네이션 훅 추가 및 비디오 송출 참가자 정렬 기능 구현
- 기존 참가자 정보 불러올 때 및 새로운 참가자 입장 시 오디오는 즉시 consume, 비디오는 페이지네이션에 의해 consume

* feat: update_gesture 이벤트 ACK 반환값 수정 (#172)

- 반환시 이벤트를 발생시킨 참가자의 이름 반환

* feat: monitoring stress test (#174)

* feat: PrometheusService에 Mediasoup 및 Socket.IO 메트릭 추가

* feat: MediasoupService에 PrometheusService 연동 및 메트릭 업데이트 로직 추가

* test: 소켓 50개 연결 테스트 with grafana

- 30개 소켓 연결후 60초 후 삭제

* test: Artilleryfh 소켓 입장테스트 진행

* test: 60명 인원 발표자의 카메라/오디오 송출되는것 수신받기 테스트

* feat: Phase 1 부하테스트 Playwright + Artillery 하이브리드 구현

- 발표자: Playwright로 3개 Producer 송출 (video+audio+screen)
- 청중: Artillery로 Socket.IO만 연결 (설정 파일로 인원 조절)
- 60,150,200 명 동시 접속 테스트 완료

* fix: Prometheus mediasoup 메트릭 초기화 추가 및 부하테스트 WebRTC 지원

1. Prometheus 메트릭 초기화
   - mediasoup 메트릭이 서버 시작 시 0으로 초기화되도록 수정
   - 메트릭이 설정되기 전에도 /metrics 엔드포인트에 노출되도록 개선

2. Artillery 부하테스트 WebRTC Transport 추가
   - 청중이 실제 WebRTC Transport 및 Consumer 생성
   - mediasoup-client를 사용한 실제 미디어 수신 구현
   - 청중 수 60명 → 20명 조정 (정확한 부하 측정)
- Grafana 대시보드에서 mediasoup 메트릭 시각화
- 실제 WebRTC 패킷 처리 부하 측정
- Worker 분산 효율성 검증을 위한 기반 마련

* fix:  부하테스트 수정및 Docker에 WebRTC 포트(40000-49999) 매핑 추가

* fix: mock test누락 수정

* fix: PrometheusService 의존성 주입 문제 해결

* fix: prometheusService 의존성 중복 제거

* fix: 사용자 참가자시 룸 상태 변경하도록 수정 (#178)

- join_room 이벤트 발생시 룸상태 변경 로직 추가

* chore: 컨테이너 수동 삭제 및 이전 바인드 포트 제거 (#184)

* feat: PrometheusService에 Mediasoup 및 Socket.IO 메트릭 추가

* feat: MediasoupService에 PrometheusService 연동 및 메트릭 업데이트 로직 추가

* test: 소켓 50개 연결 테스트 with grafana

- 30개 소켓 연결후 60초 후 삭제

* test: Artilleryfh 소켓 입장테스트 진행

* test: 60명 인원 발표자의 카메라/오디오 송출되는것 수신받기 테스트

* feat: Phase 1 부하테스트 Playwright + Artillery 하이브리드 구현

- 발표자: Playwright로 3개 Producer 송출 (video+audio+screen)
- 청중: Artillery로 Socket.IO만 연결 (설정 파일로 인원 조절)
- 60,150,200 명 동시 접속 테스트 완료

* fix: Prometheus mediasoup 메트릭 초기화 추가 및 부하테스트 WebRTC 지원

1. Prometheus 메트릭 초기화
   - mediasoup 메트릭이 서버 시작 시 0으로 초기화되도록 수정
   - 메트릭이 설정되기 전에도 /metrics 엔드포인트에 노출되도록 개선

2. Artillery 부하테스트 WebRTC Transport 추가
   - 청중이 실제 WebRTC Transport 및 Consumer 생성
   - mediasoup-client를 사용한 실제 미디어 수신 구현
   - 청중 수 60명 → 20명 조정 (정확한 부하 측정)
- Grafana 대시보드에서 mediasoup 메트릭 시각화
- 실제 WebRTC 패킷 처리 부하 측정
- Worker 분산 효율성 검증을 위한 기반 마련

* fix:  부하테스트 수정및 Docker에 WebRTC 포트(40000-49999) 매핑 추가

* fix: mock test누락 수정

* fix: PrometheusService 의존성 주입 문제 해결

* fix: prometheusService 의존성 중복 제거

* fix: 포트 바인딩 수정 취소

* Merge branch 'develop' into feat/#113-monitoring-stress-test

* fix: mediapipe 관련 에러 해결 (#176)

* chore: vite preview CORS 허용

* fix: mediapipe 타입 에러 해결

* fix: importScript 에러 해결

- 번들 로드 CDN 변경: jsdelivr -> unpkg

* refactor: 스트림 변경을 알려주도록 변경

* fix: 서빙 방식 변경

* feat: 운영환경에서 logger와 sentry 연결

- 운영환경에서 logger와 sentry 연결
- Sentry에 로그 메시지 추가 및 Breadcrumb 기능 구현

* Feat#185 consumer trouble (#188)

* feat: PrometheusService에 Mediasoup 및 Socket.IO 메트릭 추가

* feat: MediasoupService에 PrometheusService 연동 및 메트릭 업데이트 로직 추가

* test: 소켓 50개 연결 테스트 with grafana

- 30개 소켓 연결후 60초 후 삭제

* test: Artilleryfh 소켓 입장테스트 진행

* test: 60명 인원 발표자의 카메라/오디오 송출되는것 수신받기 테스트

* feat: Phase 1 부하테스트 Playwright + Artillery 하이브리드 구현

- 발표자: Playwright로 3개 Producer 송출 (video+audio+screen)
- 청중: Artillery로 Socket.IO만 연결 (설정 파일로 인원 조절)
- 60,150,200 명 동시 접속 테스트 완료

* fix: Prometheus mediasoup 메트릭 초기화 추가 및 부하테스트 WebRTC 지원

1. Prometheus 메트릭 초기화
   - mediasoup 메트릭이 서버 시작 시 0으로 초기화되도록 수정
   - 메트릭이 설정되기 전에도 /metrics 엔드포인트에 노출되도록 개선

2. Artillery 부하테스트 WebRTC Transport 추가
   - 청중이 실제 WebRTC Transport 및 Consumer 생성
   - mediasoup-client를 사용한 실제 미디어 수신 구현
   - 청중 수 60명 → 20명 조정 (정확한 부하 측정)
- Grafana 대시보드에서 mediasoup 메트릭 시각화
- 실제 WebRTC 패킷 처리 부하 측정
- Worker 분산 효율성 검증을 위한 기반 마련

* fix:  부하테스트 수정및 Docker에 WebRTC 포트(40000-49999) 매핑 추가

* fix: mock test누락 수정

* fix: PrometheusService 의존성 주입 문제 해결

* fix: prometheusService 의존성 중복 제거

* fix: 포트 바인딩 수정 취소

* Merge branch 'develop' into feat/#113-monitoring-stress-test

* fix: docker mode 변경

* feat: 질문 관리 로직 구현 (#180)

* feat: 강의실에서 질문 생성 기능 추가 (#129)

- 강의실에서 질문 생성 기능 추가
- 질문 추가 로직을 위한 qna-manager 기능 추가

* feat: 질문 조회 기능 추가 (#132)

- 투표 조회와 같은 로직으로 질문 조회 로직 구현
- 질문 조회에 따라 타입 정의 추가

* feat: 질문 시작 기능 추가 (#134)

- redis EX를 이용한 질문 시작 기능 추가
- 질문 시작 이벤트 및 브로드캐스트 타입 정의 추가

* feat: 질문 답변 제출 구현 (#136)

- 질문 답변 제출 추가
- 질문 답변에 대한 타입 추가
- 질문 답변 완료 시 브로드캐스트 이벤트 구현

* feat: 질문 종료 기능 추가

- 질문 수동 종료 기능 추가
- 질문 자동 종료 기능 추가

* feat: 소켓 이벤트에 성공 로그 추가

* fix: get_qna 이벤트 반환 타입 추가

* fix: 문서와 잘못된 정보를 반환하는 문제 해결

- 질문 답변/질문 종료 시 반환 값 수정
- 오타 수정

* feat: 질문 종료시 질문 제목 함께 전송하도록 수정

* feat: Q&A 관리 UI 구현 (#187)

* feat: QnaManagementTabs 컴포넌트 추가

* feat: 메뉴 패널 내 페이지 이동 버튼 추가

* feat: 투표 기능 소켓 이벤트 연결 (#186)

* feat: InteractionSignaling 모듈 추가

- 역할(발표자/참여자)별 이벤트 리스너 등록

* feat: 투표 관리용 스토어 추가

- ensureVoters로 voters 받기 전에 미리 빈 배열로 설정

* feat: InteractionSignaling 초기화

* feat: 참여자 관련 투표 컴포넌트에 투표 스토어 연결

- 진행중인 투표 다이얼로그에 표시
- 진행중인 투표가 있는 경우 알람 인디케이터 표시

* feat: 호스트 관련 투표 컴포넌트에 투표 스토어 연결

- 탭별로 투표 상태에 따라 투표 표시

* refactor: 오탈자 수정 및 키값 매칭

* test: 컴포넌트 구조 변경에 따른 테스트 코드 수정

* feat: 투표 관리 이벤트 실행 실패 시, 토스트 메세지 표시

* feat: 투표 시작 혹은 종료 시 다음 탭으로 전환

* feat: role에 따라 메뉴바 버튼 숨김

* refactor: end_poll에 대한 action 변경

* test: 키값 수정에 따른 변경

* refactor: end_poll 페이로드에 title 추가

* feat: 투표 결과 토스트로 표시

* fix: QnaManagementTabs 타입 오류 수정

* 강의실 나가기 구현

- 방 퇴장을 처리하는 소켓 이벤트 구현
- 강의실 퇴장 버튼 컴포넌트 추가 및 메뉴바에서 분리

* feat: 화면 공유 consume 연결 추가

- 화면 공유 시, 기존 및 신규 참가자들이 consume하도록 구현
- 화면 공유 중지 시 서버에 알림 전송 기능 추가

* fix: event emitter 이벤트 와일드 카드 문제 해결 (#198)

- event emitter에서 구분자로 마지막에 있는 이벤트에 대해서 와일드 카드
  사용 해제
- event emitter 이벤트를 prefix 값으로 변경해 와일드 카드 없이
  매핑되도록 수정

* fix: 데이터 유실 방지를 위해 퇴출 정책 변경 (#199)

- 기존 allkeys-lru 정책에서 메모리 압박 시 TTL 없는 강의실 데이터 삭제
  문제 해결
- redis 데이터 퇴출 정책을 volatile-lru로 변경

* fix: 질문/투표 시간제한이 무제한인 경우 오류 해결 (#201)

- timeLimit이 0 인경우 EX 등록이 되지 않아 오류 발생 해결
- 질문 시작 시점에 종료 시간이 미정인 경우 추가
- 종료 시점에 실제 종료 시간을 기록하도록 수정

* feat: 청중이 화면 공유를 하지 못하도록 제한 (#203)

- 청중이 화면 공유를 하지 못하도록 제한합니다.
- 클라이언트측에서도 막을 수 있도록 join_room 응답에 역할을 포함합니다.

* chore: Sentry 소스맵 업로드 후 삭제 로직 추가 (#206)

- 소스맵 업로드 후 삭제 로직 추가
- 빌드 난독화 설정 명시

* feat: 입장 페이지 예외 처리

- roomId를 가져오는 커스텀 훅 구현
- 강의실 입장 페이지에서 roomId 처리 로직 개선 및 로딩 컴포넌트 추가
- 강의실 입장 폼 제출 로직 개선 및 에러 처리 추가
- ToastStack을 포함한 임시 Layout 컴포넌트 추가 및 라우트 구조 개선
- 강의실 입장 폼 및 닉네임 검증 로직 개선

* fix: UI 렌더링 관련 문제 해결 (#209)

* refactor: 화면 공유 섹션 레이아웃 구조 변경

* fix: 제스처 인식으로 리렌더링되는 문제 해결

- 제스처 스토어 변경이 있을때만 업데이트

* feat: 자동 완성 비활성화

* feat: 사용자 닉네임 뒤 배경 추가

* feat: 새로고침 시 내 정보 업데이트

* feat: 제한 시간이 없는 경우에 대한 처리 추가

* chore: 파비콘 등록

* Feat/194 consumer producer monitoring (#207)

* fix: 로컬- 배포 테스트 환경을 상수화 및 수집 데이터 추가

* fix: 배포 서버용 부하 테스트 설정 수정

* fix: InteractionGateway의존성 추가 테스트 오류 해결

* feat: Load-Test 컨테이너 추가

* fix: 서버 크기 문제로 복구

* feat: QnA 기능 소켓 이벤트 연결 (#211)

* feat: qna 관련 소켓 이벤트 등록/해제

* feat: qna 관리용 스토어 추가

* feat: 참여자 관련 투표 컴포넌트에 투표 스토어 연결

- 진행중인 qna 다이얼로그에 표시
- 진행중인 qna가 있는 경우 알람 인디케이터 표시
- qna 응답 성공/실패 여부에 따른 토스트 표시

* @YunDo-Gi feat: 호스트 관련 투표 컴포넌트에 투표 스토어 연결

* fix: qna 종료가 poll 핸들러로 잘못 전달되는 문제 해결

* feat: qna 이벤트 핸들러 등록

* feat: 성공 시 다이얼로그 영역 내에 안내 문구 표시

- 기존 성공 토스트 메세지 제거

* feat: 진행중인 qna 존재 시 버튼에 알람 인디케이터 표시

* test: 코드 수정에 따른 테스트 코드 수정

---------

Co-authored-by: Jaehyun Yoon <yuchem2@gmail.com>
Co-authored-by: 김동균 <wooheuy5752@gmail.com>
Co-authored-by: Yuncheol Kwak <lvbhkwak@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BE 서버, API, 비즈니스 로직 등 서버 사이드 작업 deploy CI/CD 설정 및 배포 관련 작업 fix 기능 결함이나 예기치 않은 오류를 수정하는 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

트러블 슈팅 - 백엔드 prom-client

4 participants