Skip to content

feat: 채팅 WebSocket 실시간 이벤트 적용#20

Open
ho0010 wants to merge 23 commits into
mainfrom
feat/chat-socket
Open

feat: 채팅 WebSocket 실시간 이벤트 적용#20
ho0010 wants to merge 23 commits into
mainfrom
feat/chat-socket

Conversation

@ho0010

@ho0010 ho0010 commented Jun 7, 2026

Copy link
Copy Markdown
Collaborator

작업 내용

채팅 WebSocket 적용

  • Socket.IO 기반 채팅 WebSocket 게이트웨이를 추가했습니다.
  • /chats namespace에서 JWT 인증 후 회원별 room(member:{memberId})에 입장합니다.
  • 채팅방 입장/퇴장, 메시지 전송, 읽음 처리 이벤트를 지원합니다.
  • REST API로 발생하는 채팅방 생성/삭제, 메시지 생성, 읽음 처리, 상태 변경을 WebSocket 이벤트로 실시간 발행합니다.

WebSocket 응답/에러 형식 정리

  • 클라이언트 ack 응답을 { ok: true, event, data } / { ok: false, code, message } 형식으로 통일했습니다.
  • 처리 실패 시 chat:error 이벤트도 함께 발행하도록 정리했습니다.
  • WebSocket 이벤트명, room prefix, 에러 코드를 상수화했습니다.

CORS 및 환경변수 정리

  • HTTP CORS 허용 origin을 CORS_ORIGINS로 환경변수화했습니다.
  • WebSocket CORS 허용 origin을 CHAT_WS_CORS_ORIGINS로 분리했습니다.
  • CHAT_WS_CORS_ORIGINS가 비어 있으면 CORS_ORIGINS를 fallback으로 사용합니다.

문서/테스트 도구 보강

  • README.md에 WebSocket 연결 방법, 이벤트 계약, ack/error 형식, 테스트 기준을 추가했습니다.
  • public/chat-test.html을 WebSocket 테스트 페이지로 확장했습니다.
  • 불필요한 social-login-test.html과 미사용 PayChatDto를 제거했습니다.

Swagger/DTO 정리

  • 메시지 전송 DTO에서 클라이언트가 전송 가능한 타입을 TEXT, IMAGE로 제한했습니다.
  • SYSTEM 메시지는 서버 생성 전용으로 정리하고 DTO 테스트를 추가했습니다.
  • 읽음 처리 응답 DTO를 추가해 Swagger 응답 스키마를 명확히 했습니다.
  • 이미지 업로드 요청의 width, height를 선택 필드로 명확히 했습니다.
  • 결제 API가 request body를 사용하지 않는다는 설명을 보강했습니다.

테스트 보강

  • WebSocket 게이트웨이 단위 테스트를 추가했습니다.
  • 실제 Socket.IO 클라이언트로 연결하는 통합 테스트를 추가했습니다.
  • WebSocket room 발행 서비스, ack/error helper, CORS parser 테스트를 추가했습니다.
  • Jest 실행 시 watchman 이슈를 피하도록 테스트 스크립트에 --watchman=false를 적용했습니다.

ho0010 added 12 commits June 7, 2026 14:00
- Nest Socket.IO 웹소켓 의존성 추가
- JWT와 토큰 블랙리스트 기반 웹소켓 연결 인증 구현
- 회원 개인 room 및 채팅방 room 입장/퇴장 지원
- 게이트웨이 단위 테스트 추가
- message:send 및 message:read 웹소켓 이벤트 추가
- 메시지 전송 성공 시 message:created 및 chat:updated 이벤트 발행
- 읽음 처리 성공 시 message:read 및 chat:updated 이벤트 발행
- 채팅 게이트웨이와 서비스 테스트 보강
- 요청 수정과 견적 수정 시 시스템 메시지 및 채팅 갱신 이벤트 발행
- 요청 수락, 거절, 취소 시 상태 변경 이벤트 발행
- 시스템 메시지 생성 시 message:created 이벤트를 함께 발행
- 의뢰 상태 변경 실시간 이벤트 테스트 추가
- 결제 완료 시 시스템 메시지와 PAID 상태 변경 이벤트 발행
- 작업 시작, 그림 전송, 수정 요청, 최종 확인 상태 변경 이벤트 발행
- 그림 전송과 수정 요청 이벤트에 남은 수정 횟수 포함
- 결제 이후 작업 흐름 실시간 이벤트 테스트 추가
- 신규 채팅방 생성 시 chat:created 이벤트 발행
- 요청 카드 시스템 메시지를 message:created 이벤트로 발행
- 채팅방 삭제 시 chat:deleted 이벤트 발행
- 채팅방 생성 및 삭제 실시간 이벤트 테스트 추가
- 채팅 테스트 페이지에 Socket.IO 연결 상태 표시 추가
- A/B 사용자별 웹소켓 연결과 채팅방 입장/퇴장 지원
- 웹소켓 메시지 전송 및 읽음 처리 테스트 UI 추가
- 채팅/메시지 실시간 이벤트 로그 패널 추가
- 채팅 웹소켓 네임스페이스와 이벤트 이름 상수 추가
- 채팅방/회원 room prefix를 공통 상수로 관리
- 게이트웨이와 채팅 서비스의 실시간 이벤트 발행 문자열 정리
- 실시간 발행 서비스의 이벤트 이름 타입을 제한
- 채팅방과 회원 room 이름 생성 규칙 검증
- 서버 바인딩 전 이벤트 발행 안전성 확인
- 채팅방 room 이벤트 발행 동작 테스트
- 회원 개인 room 이벤트 발행 동작 테스트
- HTTP CORS origin을 CORS_ORIGINS 환경변수로 설정
- WebSocket CORS origin을 CHAT_WS_CORS_ORIGINS 환경변수로 설정
- Socket.IO CORS adapter 추가
- CORS origin 파서와 테스트 추가
- 환경변수 예시와 README 문서 갱신
- 웹소켓 성공 ack payload를 ok/event/data 형식으로 정리
- 웹소켓 실패 응답을 ok/code/message 형식으로 통일
- 이벤트 처리 실패 시 chat:error 이벤트와 ack로 같은 에러 payload 전달
- 연결 실패 connection:error 응답 형식 정리
- 웹소켓 응답 헬퍼와 게이트웨이 테스트 추가
@ho0010 ho0010 self-assigned this Jun 7, 2026
ho0010 added 3 commits June 14, 2026 16:43
- 라우팅되지 않는 소셜 로그인 테스트 HTML 삭제
- 채팅 결제 API의 미사용 PayChatDto 제거
- 채팅 결제 Swagger body 문서에서 deprecated 필드 제거
- 메시지 전송 요청 타입을 TEXT/IMAGE로 문서화하고 검증 제한
- SYSTEM 메시지를 클라이언트가 전송할 수 없도록 DTO 테스트 추가
- 이미지 업로드 요청의 width/height를 선택 필드로 명확화
- 읽음 처리 응답 DTO를 추가해 Swagger 응답 스키마 정리
- 채팅 결제 API가 요청 body를 사용하지 않도록 설명 보강
- socket.io-client dev dependency 추가
- 실제 Socket.IO 클라이언트로 인증 연결과 connection:ready 검증
- 채팅방 입장 후 room 브로드캐스트 수신과 메시지/읽음 ack 검증
- 잘못된 payload의 chat:error와 표준 error ack 검증
@ho0010 ho0010 changed the title Feat/chat socket feat: 채팅 WebSocket 실시간 이벤트 적용 Jun 14, 2026
ho0010 added 8 commits June 22, 2026 18:26
- DONE 웹훅 수신 시 대기중 코인 주문을 완료 처리하고 지갑 충전 반영
- 충전 거래내역이 이미 있으면 중복 충전을 방지
- CANCELED 웹훅 수신 시 완료 주문의 지갑 잔액과 환불 거래내역 보정
- 주문 paymentKey와 다른 웹훅은 무시하도록 방어
- 웹훅 주문 상태 처리를 트랜잭션과 row lock 기반으로 변경
- wallet_transaction에 member/type/source 조합 unique index 추가
- 동일 원천의 같은 거래 타입이 중복 저장되지 않도록 DB 제약 보강
- 운영 DB 적용용 migration 추가
- 거래원장 엔티티 인덱스 메타데이터 테스트 추가
- 관리자용 지갑 잔액/거래원장 불일치 조회 API 추가
- wallet.balance와 완료 거래내역 coinAmount 합계를 비교
- 불일치 회원의 잔액 차이를 페이지 응답 DTO로 반환
- 관리자 권한 검증과 불일치 조회 테스트 추가
- 관리자용 거래원장 원천 중복 조회 API 추가
- member/type/source 조합이 중복된 거래내역 그룹 조회
- 중복 건수와 코인 합계 및 생성 시각 범위 반환
- 관리자 권한 검증과 중복 조회 테스트 추가
- 프로젝트 구조 문서 추가
- 채팅 WebSocket 계약 문서 분리
- 운영/배포 체크리스트 문서 추가
- README 문서 목록 업데이트
- 결제/지갑 감사 API 경로 prefix 보정
- 변경 유형별 테스트 실행 기준 정리
- 커버리지 기준과 주요 테스트 명령 문서화
- 금액성 기능과 WebSocket 검증 기준 정리
- README 문서 목록에 테스트 가이드 링크 추가
- 코인 충전/환불 원장 생성 helper 추가
- 결제 승인과 Toss 웹훅 보정 경로의 원장 생성 방식 통일
- 코인 주문 source 중복 확인 로직 helper로 분리
- 기존 지갑 서비스 테스트와 빌드 검증
- FIREBASE_ENABLED=false 설정 시 Firebase Admin no-op 처리
- 로컬 채팅 테스트에서 Firebase credential 없이 부팅 가능하도록 수정
- Firebase 설정 테스트와 운영 문서 보강
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant