Multi Racing Car - 프레임워크 없이 만드는 멀티플레이 게임
"추상화된 것의 내부를 이해해야 제대로 사용할 수 있다"
프레임워크 없이 ServerSocket으로 HTTP 서버를 직접 구현하고, RFC 6455 문서를 읽으며 WebSocket을 바닥부터 구현한 실시간 멀티플레이 레이싱 게임입니다.
- 핵심 도전: Spring Boot 없이 HTTP/WebSocket 직접 구현, 멀티스레드 동시성 제어, 아키텍처 설계 원칙 적용
🔗 링크
- 🎮 게임 플레이하기 - 실제 게임을 플레이해볼 수 있습니다
- GitHub Repository - 프로젝트 소스 코드

🎮 주요 기능
게임 모드
- 멀티플레이: 4명 자동 매칭 실시간 대전
- 싱글 플레이: 1 vs 3 AI 대전
게임 규칙
- 5라운드 진행, 각 라운드마다 50% 확률로 0-1칸 이동
- 최장거리 도달자 우승

🛠 기술 스택
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 리팩토링