자프실2 기말 프로젝트로 마피아 게임을 만들어 보았다. 시연 영상 및 프로젝트 설명은 깃허브 README에 업로드되어 있다.
길다면 길고, 짧다면 짧은 프로젝트가 완성되었다. 대략 3~4주라는 시간 동안 팀원들과 끊임없이 소통하며 프로젝트를 완성시켰다는 사실에 정말 벅차오른다. 지금까지는 소규모 기능 구현 위주의 학습만 해보았는데, 이번에 온전한 '게임'을 완성해보며 나 스스로 더 성장했음을 느낄 수 있었다.
프로젝트는 깃허브를 사용하여 진행하였는데, 초기에는 충돌 해결에 어려움을 겪었지만 이 과정에서 개발 환경의 중요성을 깨달았다.
초기에는 이클립스로 시작하였는데, git 충돌 해결과 터미널 기능의 한계를 느껴 IntelliJ로 전환했다. IDE를 변경하는 것만으로도 편의성이 정말 향상되었다.
그리고 아주 빈번하게 서로의 작업물을 합치고 에러를 경험하니 merge, conflict 해결, 브랜치 관리, 버전 롤백 등 실무적인 git 활용 능력을 키울 수 있었다. 전에는 add, commit, push 정도밖에 하지 못하던 내가 이제는 git을 능숙하게 다룰 수 있을 정도로 성장했다는게 스스로도 체감이 되었다.
내가 프로젝트에서 맡은 핵심 파트는 '서버'였다. 이번 학기 '컴퓨터 네트워크' 수업을 병행한 덕분에 이론을 실제 코드로 구현하는 귀중한 경험을 할 수 있었다.
이론으로만 접했던 TCP 소켓 통신(Connection setup -> Data transfer -> Termination)의 전 과정을 직접 코드로 구현하며 동작 원리를 깊이 있게 이해할 수 있었다. 특히 단순한 문자열 전송을 넘어, Message:(전체 채팅), Target:(능력 사용), Mafia_message:(마피아 채팅)와 같이 기능별로 고유한 헤더를 정의하여 통신 규약을 직접 설계했다. 서버가 이 헤더를 파싱하여 알맞은 로직으로 분기 처리하는 구조를 직접 구현해보면서, Application 계층에서의 프로토콜 설계가 왜 중요한지 몸소 체감하는 계기가 되었다.
가장 많은 시간을 쏟은 부분은 멀티 스레드 환경에서의 디버깅이었다. 채팅과 게임 로직이 동시에 돌아가다 보니 원인을 알 수 없는 오류들이 정말 빈번하게 발생했다. System.out.println()을 여기저기 적어 콘솔을 찍어보며 무엇이 원인인지 디버깅을 시도하였으나 끝내 스스로 원인을 찾지 못했다. 사실 멀티 스레드 관련 오류인지도 몰랐는데 GPT가 알려줬다... 원인 파악에만 2주가 걸릴 정도로 고생하며, 멀티 스레드의 타이밍이 어긋나면 원인 파악이 정말 어렵다는 것을 뼈저리게 느꼈다.
프로젝트가 완료된 후 지금 후기를 작성하면서 문득 현업에서는 이런 멀티 스레드 문제를 어떻게 디버깅하는지 궁금해졌다. 찾아보니 jstack [PID] 명령어나 IDE의 Thread Dump 기능을 활용해 스레드 스냅샷을 분석한다는 것을 알게 되었다. 이번 프로젝트에서는 늦게 알게 되어 아쉬웠지만, 다음 프로젝트부터는 적극 활용해봐야겠다!^^
사실 해결되지 않는 멀티 스레드 오류로 인해 팀원들 모두 지쳐가고 있었고, 나 또한 기한 내에 완성하지 못할까 봐 노심초사했다. 결국 원인을 찾아준 건 GPT였지만, 이번 프로젝트를 끝까지 완성시킬 수 있었던 것은 단연 팀원들과의 활발한 소통이었다고 생각한다. 서로의 진행 상황을 공유하고 에러를 함께 고민하는 과정에서 진정한 의미의 '협업'을 경험할 수 있었다. 끝까지 포기하지 않고 함께 달려준 팀원들에게 너무 고맙다😊.