-
Notifications
You must be signed in to change notification settings - Fork 0
feat: Prometheus metrics endpoint 추가 #66
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
Merged
Merged
Conversation
This file contains hidden or 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
KimDongGyun23
approved these changes
Jan 9, 2026
Collaborator
KimDongGyun23
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다! any 타입은 수정해두면 좋을 것 같아요!
YunDo-Gi
approved these changes
Jan 9, 2026
Collaborator
YunDo-Gi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
문제가 발생한 원인을 찾고 해결하는 과정이 빠르네요! 고생하셨어요 👏👏
- 백엔드는 로컬에서 실행 -나머지 서비스는 도커 실행
- 배포 시 모든 서비스 시작 (backend, node-exporter, promtail) - 로그 쿼리를 위한 static labels 유지 (job, env, filename)
Collaborator
Author
|
good idea!! |
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
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
#️⃣ 연관된 이슈 번호
⏰ 작업 시간
📝 작업 내용
주요 고민과 해결 과정
백엔드 node-exp 접근이 안되고 있었다.
방화벽 가능성이 높았고 확인해보니 백엔드 inbound 추가 문제인것을 확인했다.
백엔드 서버의 메트릭 정보가 수집이 안되고 있었다.
학습때 누락되었던 부분이였다.
애플리케이션 메트릭을 수집할때: prom-client / Redis Exporter이렇게 사용했었다.
서버별 구성으로
Node Exporter, Redis Exporter = 독립 실행 파일 → 그냥 실행이 가능했다.
prom-client = npm 라이브러리 → NestJS 통합 코드 필요
그래서 첫번째로 prom-client의 설치 위치를 백엔드 디렉토리에서 누락시켰고, metric에 대한 글로벌 인터셉터 설정이 필요했다.
위 사항들이 모드 트러블 슈팅을 해결하기 위한 과정이였고, 배포가 되었을때
URL: http://211.188.50.8:9090/targets를 재 확인해야한다.
배포 환경도 수정 완료 했습니다
프로메테우스에서 node-exporter를 인식하지 못했던 문제 해결
promtail-client cd.yml 파일세팅 추가 -> 정상적인 loki 로그 수집 확인
💬 리뷰 요구사항
📘 참고 자료