본문으로 건너뛰기

Multi Racing Car - 프레임워크 없이 만드는 멀티플레이 게임

"추상화된 것의 내부를 이해해야 제대로 사용할 수 있다"

프레임워크 없이 ServerSocket으로 HTTP 서버를 직접 구현하고, RFC 6455 문서를 읽으며 WebSocket을 바닥부터 구현한 실시간 멀티플레이 레이싱 게임입니다.

  • 핵심 도전: Spring Boot 없이 HTTP/WebSocket 직접 구현, 멀티스레드 동시성 제어, 아키텍처 설계 원칙 적용

🔗 링크

Multi Racing Car 게임 메인 화면

🎮 주요 기능

게임 모드

  • 멀티플레이: 4명 자동 매칭 실시간 대전
  • 싱글 플레이: 1 vs 3 AI 대전

게임 규칙

  • 5라운드 진행, 각 라운드마다 50% 확률로 0-1칸 이동
  • 최장거리 도달자 우승

4인 멀티플레이 레이싱 게임 실행 화면

🛠 기술 스택

Backend

  • 언어: Java 21
  • 빌드: Gradle 8.14
  • 서버: ServerSocket (HTTP 직접 구현)
  • 실시간 통신: WebSocket (RFC 6455 표준 구현)
  • 동시성: ConcurrentHashMap, Thread Pool

Frontend

  • HTML/CSS/JavaScript
  • WebSocket Client API

🔧 핵심 구현 내용

1. HTTP 서버 구현

  • ServerSocket을 사용한 HTTP/1.1 서버
  • 요청 라인, 헤더, 바디 파싱
  • MIME Type 자동 설정 및 정적 파일 서빙

2. WebSocket 프로토콜 구현

RFC 6455 표준에 따른 직접 구현

  • Handshake: Sec-WebSocket-Key SHA-1 해싱
  • Frame 파싱: 비트 연산으로 Opcode/Payload 추출
  • Masking: XOR 연산으로 메시지 디코딩

3. 멀티플레이 게임 로직

  • 4명 자동 매칭 시스템 및 대기열 관리
  • 게임룸 격리 (여러 게임 동시 진행)
  • 5라운드 자동 진행 및 우승자 결정
  • 싱글 플레이 AI 대전 모드

4. 멀티스레드 환경

  • Thread Pool로 동시 접속 처리
  • ConcurrentHashMap으로 Race Condition 방지
  • 세션/게임룸 생명주기 관리

5. 아키텍처 개선

  • SRP: God Object를 3개 서비스로 분리
  • DIP: GameEventPublisher 인터페이스 추상화
  • Value Object: Nickname, Position, Round 등

📚 개발 과정 상세 회고

프레임워크 없이 개발하며 겪은 시행착오와 해결 과정을 5편의 글로 정리했습니다:

1. 오픈미션 주제 선정: 프레임워크 없이 Multi Racing Car Game 만들기

  • 혼자 프로젝트를 진행한 이유
  • Spring Boot 대신 ServerSocket을 선택한 배경
  • 단계적 확장 전략 (3주 계획)

2. WebSocket을 바닥부터 구현하기

  • RFC 6455 문서 읽기
  • Handshake 및 Frame 파싱 구현 (3일간의 삽질)
  • 세션 관리 및 게임룸 격리

3. 멀티스레드 환경에서 살아남기

  • Thread로 동시 접속 해결
  • Race Condition과 ConcurrentHashMap
  • 메모리 누수 발견 및 해결

4. God Object를 해체하고 설계 개선하기

  • 500줄 GameService 분리
  • DIP 적용으로 도메인 순수성 유지
  • Singleton 제거 및 생성자 주입

5. 프레임워크 없이 개발하며 배운 것들

  • 프레임워크의 가치 이해
  • 원본 문서 읽기의 중요성
  • 모르는 것을 스스로 배우는 법

💡 배운 점

기술적 이해

  • HTTP/WebSocket 프로토콜 동작 원리
  • 멀티스레드 프로그래밍과 동시성 제어
  • 가비지 컬렉션의 한계와 명시적 리소스 관리

설계 원칙

  • SRP, DIP 등 객체지향 원칙의 실전 적용
  • 도메인과 인프라의 분리

🏷️ 기술 스택 태그

Java WebSocket HTTP ServerSocket RFC 6455 멀티스레드 ConcurrentHashMap SRP DIP 리팩토링