본문으로 건너뛰기

오픈미션 주제 선정기

우아한테크코스 8기 오픈미션을 시작하면서 가장 먼저 마주한 질문은 "무엇을 만들 것인가"가 아니라 "어떻게 만들 것인가"였습니다.

포비님께서 제안하신 여러 방향 중 하나는 "낯선 도구 해커톤"이었습니다. 디스코드를 보니 많은 분들이 팀을 구성하고 계셨고, 익숙한 기술 스택으로 완성도 높은 프로젝트를 만들겠다는 분들도 많았습니다.

하지만 저는 고민 끝에 혼자 프로젝트를 진행하기로 했습니다.

혼자 진행하기로 한 이유

기존에 프로젝트를 진행하면서 항상 팀으로 일했지만, 프로젝트가 끝나고 나면 항상 찝찝했습니다.

팀 프로젝트에서는 역할이 나뉘다 보니 제가 맡은 부분 외에는 깊이 고민할 기회가 적었고, 주제 선정부터 설계, 배포까지 전체 과정을 스스로 경험해보지 못했다는 아쉬움이 있었습니다.

이번 기회에 처음부터 끝까지 모두 혼자 해보면, 나중에 협업할 때 더 도움이 되는 팀원이 될 수 있지 않을까 생각했습니다.

팀원들에게 배움을 줄 수 있는 팀원이 되고 싶었습니다

프레임워크 없이 도전하기로 한 이유

프리코스를 진행하면서 계속 느꼈던 것이 있습니다. 원리를 모르고 사용하고 있다는 것이었습니다.

Spring Boot를 사용하면 @RestController@GetMapping만 써도 HTTP 통신이 되지만, HTTP 요청이 어떻게 들어오는지, 응답은 어떻게 나가는지, 소켓이 무엇인지 정확히 이해하지 못하고 있었습니다.

그러던 중 프리코스에서 Value Object, 일급 컬렉션, 레이어 분리 같은 개념들을 배우면서 중요한 깨달음을 얻었습니다. 추상화 아래에 무엇이 있는지 알아야 제대로 사용할 수 있다는 것이었습니다.

예를 들어 Car 클래스를 만들 때 Position이라는 Value Object를 만드는 이유를 이해할 수 있었고, Cars라는 일급 컬렉션을 만드는 이유도 명확히 알 수 있었습니다. 그 아래에 무엇이 있는지 알게 되었기 때문입니다.

하지만 Spring Boot는 달랐습니다. 여전히 @RestController 아래에 무엇이 있는지, @GetMapping 아래에 무엇이 있는지 알지 못했습니다.

그래서 이번에는 Spring Boot 없이, ServerSocket으로 직접 HTTP 서버를 만들기로 했습니다.

프로젝트 선정

프리코스에서 만들었던 자동차 경주 게임을 멀티플레이 게임으로 만들기로 했습니다. 4명이 동시에 접속해서 1초마다 자동으로 라운드가 진행되고, 먼저 결승선에 도착하는 사람이 이기는 실시간 경주 게임입니다.

목표를 정리하면 이렇습니다.

첫째, ServerSocket으로 HTTP 서버를 직접 구현하고 HTML/CSS/JS 파일을 제공합니다.

둘째, WebSocket으로 실시간 통신을 구현해서 4명이 동시에 접속하고 게임 상태를 공유합니다.

셋째, 프레임워크 없이 끝까지 완성합니다.

예상되는 어려움

솔직히 어디서부터 시작해야 할지 막막했습니다.

HTTP 프로토콜을 파싱하는 방법도, WebSocket Handshake가 무엇인지도, 동시 접속을 어떻게 처리하는지도 전혀 알지 못했습니다. RFC 문서를 읽어야 한다는 것조차 이번에 처음 알았습니다.

주변을 둘러보니 디스코드에서 다른 분들은 익숙한 기술로 완성도 높은 프로젝트를 만들고 계셨고, 저는 Socket이 정확히 무엇인지도 모르는 상태였습니다.

그럼에도 시작할 수 있었던 이유는, 포비님이 말씀하신 것처럼 성장을 하드 스킬에만 한정시킬 필요는 없다고 생각했기 때문입니다. 결과물의 완성도보다 과정에서 배우는 것이 더 중요하다고 믿었습니다.

단계적 확장 전략

막막함을 줄이기 위해 단계적으로 접근하기로 했습니다.

1주차: HTTP 서버 구현

  • ServerSocket으로 요청 받기
  • 정적 파일 제공
  • 멀티스레드 처리

2주차: WebSocket + 게임 로직

  • WebSocket Handshake 구현
  • Frame 파싱
  • 세션 관리 및 브로드캐스트
  • 멀티플레이 레이싱 게임 구현

3주차: 아키텍처 개선 + 배포

  • 버그 수정
  • 레이어 분리 및 리팩토링
  • AWS EC2 배포

이렇게 Multi Racing Car 프로젝트를 시작했습니다.