칙칙퐁퐁

Backend

Nest.js와 Socket.io를 사용하여 실시간 채팅 및 게임 서버를 구축하고 인증 시스템을 설계했습니다.

Nest.jsSocket.ioPostgreSQLTypeORM

핵심 기여 사항

  • 채팅/게임 방 생성, 입장, 종료 등 실시간 이벤트 흐름 정의
  • OAuth2 + 2FA 기반의 토큰 인증 시스템 구현
  • PostgreSQL과 TypeORM을 이용한 DB 모델링 및 쿼리 설계

도전 과제: 안정적인 실시간 서버 및 보안 인증 시스템 구축

백엔드의 핵심 도전은 여러 사용자가 동시에 접속하여 게임을 플레이하고 채팅을 주고받는 상황에서 지연 시간 없는 안정적인 실시간 통신을 보장하는 것이었습니다. 동시에, 42 OAuth 인증을 도입하고 2단계 인증(2FA)을 구현하여 사용자의 계정을 안전하게 보호하는 강력한 보안 아키텍처를 설계해야 했습니다.

해결 전략: Nest.js 기반의 모듈형 아키텍처와 Socket.io Gateway

서버의 확장성과 유지보수성을 고려하여 `Nest.js` 프레임워크를 채택했습니다. 인증(Auth), 유저(User), 게임(Game) 등 각 도메인별로 모듈을 분리하여 개발했으며, 실시간 통신은 `Socket.io Gateway`를 통해 중앙에서 관리했습니다. 데이터베이스는 `PostgreSQL`과 `TypeORM`을 사용하여 타입 세이프(Type-safe)하게 데이터를 관리했으며, `OAuth2`와 `JWT`를 결합하여 안전한 인증 흐름을 구현했습니다.

다이어그램을 불러오는 중...

[그림 10] Nest.js 기반 백엔드 아키텍처

사용자가 42 OAuth를 통해 로그인하면, 서버는 JWT(Access/Refresh Token)를 발급합니다. 클라이언트는 이 JWT를 사용하여 웹소켓 연결을 인증합니다. `Socket.io Gateway`는 연결된 클라이언트의 이벤트를 수신하여, 해당 요청을 게임 또는 채팅 모듈로 라우팅하고, 처리 결과를 다시 클라이언트에 전송하는 역할을 합니다.

// 예시: Nest.js의 WebSocketGateway를 활용한 실시간 게임 이벤트 처리
import {
WebSocketGateway,
SubscribeMessage,
WebSocketServer,
OnGatewayConnection,
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { GameService } from './game.service';
@WebSocketGateway({ namespace: '/game' })
export class GameGateway implements OnGatewayConnection {
@WebSocketServer()
server: Server;
constructor(private readonly gameService: GameService) {}
// 클라이언트 연결 시 JWT 인증 로직 (예시)
handleConnection(client: Socket, ...args: any[]) {
const jwt = client.handshake.headers.authorization;
// ... JWT 검증 로직
console.log(`Client connected: ${client.id}`);
}
// 'joinRoom' 이벤트를 수신했을 때의 핸들러
@SubscribeMessage('joinRoom')
handleJoinRoom(client: Socket, roomUrl: string): void {
const room = this.gameService.joinRoom(client, roomUrl);
// 방에 있는 모든 클라이언트에게 업데이트된 방 정보 전송
this.server.to(roomUrl).emit('roomUpdate', room);
}
}

결과 및 성과

Nest.js의 모듈형 아키텍처를 통해 복잡한 실시간 서버의 관심사를 효과적으로 분리하고, 확장 가능한 백엔드 시스템을 성공적으로 구축했습니다. OAuth2와 2FA를 도입하여 높은 수준의 보안을 확보했으며, Docker를 이용한 배포 자동화로 안정적인 운영 환경을 마련했습니다. 이 프로젝트는 저의 풀스택 개발 역량을 크게 성장시키는 계기가 되었습니다.