개인
슬랙 API 클론 코딩
2022-03-25 — 2022-07-28
NestJS의 모듈 시스템과 DI/IoC 패턴을 학습하기 위해 Slack 백엔드를 클론 코딩한 프로젝트 — Socket.io 기반 실시간 메시징, Passport 세션 인증, TypeORM 관계형 데이터 모델링 구현
프로젝트 설명
Java Spring과 유사한 NestJS 프레임워크를 실무에 도입하기 위해 진행한 학습 프로젝트로, Slack 협업 도구의 핵심 백엔드를 클론 코딩했다. 6개의 NestJS 모듈(Users, Workspaces, Channels, DMs, Auth, Events)로 도메인을 분리하고, 8개의 TypeORM 엔티티 간 ManyToMany·ManyToOne 관계와 조인 테이블을 설계하여 Workspace-Channel-User 간 멤버십 구조를 구현했다. Socket.io 기반 WebSocket Gateway에서 동적 네임스페이스(/ws-.+/)와 룸 패턴으로 채널별 실시간 메시지 브로드캐스팅과 온라인 사용자 추적을 처리하며, Passport Local Strategy와 express-session으로 세션 기반 인증 체계를 구축했다.
주요 내용
- 6개 NestJS 모듈로 도메인 분리 (독립적 모듈·컨트롤러·서비스 구조)
- 8개 TypeORM 엔티티 관계형 모델링 (ManyToMany 멤버십 구조)
- Socket.io 동적 네임스페이스로 실시간 메시징 및 온라인 추적
- Passport + express-session 세션 인증, Guard로 라우트 보호
- QueryRunner 수동 트랜잭션으로 다중 엔티티 생성 원자성 보장
담당 기능
- 회원가입·로그인 — Passport Local Strategy + bcrypt 해싱, express-session 기반 세션 인증, Guard를 활용한 인증/비인증 라우트 분리
- Workspace 관리 — 생성 시 기본 채널·멤버 자동 생성, Owner 기반 소유권 구조, 멤버 초대 및 조회
- Channel 메시징 — 채널 생성·멤버 관리, 페이지네이션 기반 채팅 이력 조회, 이미지 파일 업로드(Multer), 읽지 않은 메시지 수 카운팅
- 실시간 통신 — Socket.io WebSocket Gateway, 동적 네임스페이스(/ws-.+/)로 워크스페이스 격리, 룸 기반 채널별 메시지 브로드캐스팅, 온라인 사용자 실시간 추적
- Swagger API 문서화 — @nestjs/swagger 데코레이터 기반 자동 API 문서 생성
깨달은 점
- 💡 NestJS의 모듈·프로바이더·컨트롤러 구조가 Spring의 IoC/DI 컨테이너와 동일한 설계 철학을 따르며, Java 백엔드 경험을 Node.js로 자연스럽게 전환할 수 있음을 확인
- 💡 TypeORM의 ManyToMany 관계에서 JoinTable과 중간 엔티티(WorkspaceMembers, ChannelMembers)를 활용한 멤버십 모델링 경험 — 단순 관계 매핑 대비 추가 메타데이터 관리의 유연성 확보
- 💡 Socket.io의 네임스페이스·룸 계층 구조를 활용하면 워크스페이스→채널 단위의 메시지 격리를 효율적으로 구현할 수 있으며, Gateway 라이프사이클 훅(OnInit/OnConnect/OnDisconnect)으로 연결 상태를 체계적으로 관리 가능
- 💡 QueryRunner를 활용한 수동 트랜잭션 관리로 회원가입 시 User·WorkspaceMember·ChannelMember 생성의 원자성을 보장하는 패턴 학습
기술 스택
TypeScript Node.js NestJS Socket.io MySQL TypeORM Passport Swagger Jest