Skip to content

NestJS와 Redis Cluster로 구현한 고성능 확장형 실시간 채팅 서버

Notifications You must be signed in to change notification settings

jihwankim97/scalable-chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

scalable-chat

NestJS 기반 인증/인가 + 실시간 채팅 서버 스켈레톤입니다. 새 프로젝트에서 그대로 복사해 쓸 수 있는 수준의 기본 아키텍처를 목표로 설계했습니다.


요약

  • 인증/인가 레이어: Basic 로그인 → JWT 발급, Access/Refresh 분리, 토큰 블랙리스트, 역할 기반 권한 제어까지 한 흐름으로 설계했습니다.
  • 데이터/ORM 레이어: Prisma 최신 버전 기준으로 User, Role 모델을 정리하고, 비밀번호 필드 보호 / 에러 핸들링을 공통 레이어로 캡슐화했습니다.
  • 실시간 채팅 골격: WebSocket 게이트웨이와 서비스 레이어를 분리해, 채팅 도메인을 얹기만 하면 되는 상태로 만들어 두었습니다.
  • 운영 도구: 응답 시간 로깅, DB 에러 변환 등 운영·디버깅에 바로 쓸 수 있는 기본 도구들을 포함했습니다.

설계 포인트

인증/인가

  • JWT 구조: access / refresh 타입을 명시한 페이로드를 정의하고, 토큰 유형을 잘못 사용하면 바로 예외를 던지도록 했습니다.
  • 토큰 처리 흐름: HTTP 미들웨어에서 Bearer 토큰을 파싱·검증하고, 가드에서 @Public / RBAC 메타데이터를 보고 접근을 제어하는 2단 구조입니다.
  • 캐시 활용: 토큰 블랙리스트와 검증된 페이로드를 캐시에 담아 두고, 같은 토큰에 대해서는 재검증 비용을 최소화했습니다.

데이터/ORM

  • Prisma 기반 설계: User 모델과 Role enum을 Prisma 스키마로 정의하고, omit 설정으로 비밀번호 컬럼을 기본 응답에서 제거했습니다.
  • 에러 핸들링 공통화: 고유 키 충돌, 존재하지 않는 레코드 조회 등은 Prisma 에러 코드를 공통 서비스에서 HTTP 예외로 변환해, 도메인 레이어에는 성공/실패만 남도록 정리했습니다.
  • 버전 업그레이드 고려: ORM 버전을 올리면서 breaking change(예: omit 옵션, preview feature)들을 체크하고, 서비스 코드 수정 범위를 최소화하는 방향으로 반영했습니다.

실시간 채팅

  • 게이트웨이와 도메인 분리: 게이트웨이는 연결/이벤트 라우팅만 담당하고, 실제 채팅 도메인 로직은 서비스 레이어에 두는 구조를 기본값으로 뒀습니다.
  • HTTP와의 일관성: 인증/인가 레이어를 HTTP와 WebSocket 모두에서 재사용할 수 있도록, 토큰 기반 인증을 전제로 설계했습니다.

운영/품질

  • 관측 가능성: 요청 처리 시간을 인터셉터에서 공통으로 로깅해, 느린 엔드포인트를 쉽게 찾을 수 있게 했습니다.
  • 에러 응답 통일: 권한 부족, DB 에러 등의 응답 포맷을 필터·핸들러에서 통일해, 클라이언트 입장에서는 일관된 에러 모델만 보도록 했습니다.

기술 스택 (선택 이유)

  • NestJS + TypeScript: DI/모듈 시스템 덕분에 인증, 유저, 채팅, 공통 레이어를 깔끔하게 분리할 수 있고, 타입으로 도메인 모델을 강제할 수 있습니다.
  • Prisma + PostgreSQL: 스키마 우선 설계, 타입 세이프한 쿼리, 마이그레이션 관리가 편해서 작은 개인 프로젝트에도 투자 대비 효과가 좋다고 판단했습니다.
  • socket.io + WebSocket 게이트웨이: 브라우저 호환성과 재연결 전략이 검증돼 있고, NestJS의 WebSocket 지원과 자연스럽게 맞물립니다.
  • 테스트·품질 도구: Jest, ESLint, Prettier를 사용해 최소한의 코드 품질 가드를 걸어 두었습니다.

실행 방법

  • 환경 변수 예시

    • DB_URL: PostgreSQL 연결 문자열
    • ACCESS_TOKEN_SECRET: Access 토큰 서명 키
    • REFRESH_TOKEN_SECRET: Refresh 토큰 서명 키
    • HASH_ROUNDS: 비밀번호 해시에 사용할 라운드 수 (예: 10)
  • 개발 환경 실행

pnpm install
pnpm run start:dev

이후 확장 아이디어

  • 채팅방·메시지 영속화, 알림, 읽음 상태 등을 얹어서 메신저에 가까운 기능까지 확장
  • 요청/이벤트 로그를 APM 또는 중앙 로그 시스템과 연동해 모니터링 강화
  • 간단한 레이트 리미트(요청 수 제한)와 IP 기반 보호 장치 추가

About

NestJS와 Redis Cluster로 구현한 고성능 확장형 실시간 채팅 서버

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published