싸피 2학기 특화 프로젝트(Dropzone)

김헌규·2024년 12월 7일
1
post-thumbnail

프롤로그 - 특화 프로젝트를 시작하며

최근까지 하던 공통 프로젝트를 마무리하고 드디어 2학기의 특화 프로젝트를 시작하게 되었다. 공통 프로젝트가 끝나갈 무렵 특화 프로젝트를 위해 팀원들을 구하는 주변 싸피생들이 보였고 그때 나도 특화 팀에 대해 고민하게 되었다. 사실 이번 프로젝트에서는 백엔드 개발자를 지망하는 사람으로써 프론트엔드는 가급적이면 하고 싶지 않았다. 그래서 많은 팀들을 고심해서 둘러 보았는데 보통 싸피에서는 전공자들이 주로 백엔드를 맡는데 솔직히 말해서 아직 Java도 제대로 모르고 spring도 모르는 나의 입장에서는 백엔드를 희망하는 전공자 사이에서 백엔드를 하고 싶다는 의견을 쉽사리 내지 못할뿐더러 의견을 낸다고 해도 팀을 위해 기각당할 확률이 높았기 때문에 최대한 백엔드를 맡을 확률이 높은 팀을 찾아다녔고 그 중 메타버스 게임 팀에서 백엔드 개발자를 필요로 했고 게임 프로젝트 특성상 spring 백엔드가 구현할 기능들이 많지는 않았기 때문에 메타버스 게임 팀에 들어가는 것을 결정하게 되었다.

본론 - 싸피 2학기 특화 프로젝트 (Dropzone)

👾Dropzone


🕹️ 프로젝트 주제

싸피생들끼리 친목을 위해 제작한 6인 배틀로얄 게임.

📅 개발 기간

8월 26일 ~ 10월 11일

📋 기획 배경

싸피 2학기에는 총 3번의 프로젝트를 진행하는데 친한 사람들하고 팀을 짜는 경우도 있지만 그렇지 않은 경우가 있는데 그럴때 어색한 팀원들과 친해지기 위해 다양한 컨텐츠를 생각하는 팀장들이 있다는 것을 알게 됨.

🎯 목적

싸피에서 어색한 팀원들 또는 일상 생활에서 어색한 사람들과 친목도모를 위해 게임을 제작하여 제공하면 어떨까해서 기획을 하게 되었고 다양한 게임 장르들을 생각하다가 팀원들과 상의한 결과 6인 배틀로얄 게임을 기획하게 되었으며 즉, 목적으로는 싸피의 팀장들이 팀원들과 좀 더 친목도모를 수월하게 할 수 있도록 게임 컨텐츠를 제공하는 것이다.

📊 ERD

🛠️ 사용 기술

  • 클라이언트 : Unity, Photon pun2
  • 서버 : Spring boot, Spring security
  • 데이터베이스 : mySQL, mongoDB
  • 인프라 : AmazoneEC2, Docker, Jenkins, NGINX
  • 협업툴 : JIRA
  • 형상관리 : Gitlab, PlasticSCM

🏗️ 시스템 아키텍처

👨‍👩‍👧‍👦 팀원 정보 및 업무 담당 내역


팀 구성

황준(팀장 - 클라이언트), 김동준(팀원 - 클라이언트), 손동희(팀원 - 클라이언트), 박재영(팀원 - 클라이언트, 서버), 차상곤(팀원 - 서버), 김헌규(팀원 - 서버)

내가 담당한 업무 내역

  • Spring boot 서버 CI/CD 파이프 라인 구축
  • Spring STOMP를 사용한 로비 채팅 구현
  • 친구 추가 기능 구현

✨ 주요 컨텐츠


최후의 1인

6명의 플레이어가 참여하는 배틀 로얄 게임으로, 최후의 1인이 남을 때까지 싸우고 생존하는 것이 목표이다.

떨어지는 섬

일정 시간마다 맵이 떨어지면서 맵이 랜덤한 한 점으로 점점 줄어들게 된다. 각 플레이어는 점점 좁아지는 맵에서 생존하기 위해 떨어지는 구역을 피하며 싸워야 한다.

4명의 캐릭터

게임에는 4명의 캐릭터가 등장한다. 근접 캐릭터 2명, 원거리 캐릭터 2명으로 구성하였는데 근접 캐릭터로는 복서와 펑크 캐릭터가 있으며 원거리 캐릭터로는 솔저, 아처가 있다. 복서 캐릭터는 이름 그대로 복서의 외형을 갖춘 캐릭터이며 체력 110, 공격력 5, 스피드 7, 스킬 쿨타임 7의 스펙을 갖추고 있다. 스킬로는 슈퍼아머를 가지고 있으며 모든 상태이상을 해제할 수 있는 스킬을 가지고 있다. 펑크 캐릭터는 방망이를 든 불량배의 외형을 갖추고 있으며 체력 120, 공격력 15, 스피드 6, 스킬쿨타임 5의 스펙을 갖추고 있다. 스킬로는 방망이를 크게 휘둘러 적을 밀치며 밀쳐지는 적이 벽에 부딪히면 기절 상태에 빠진다. 솔저 캐릭터는 군인의 외형을 갖춘 캐릭터이며 체력 100, 공격력 10, 이동속도 5, 스킬 쿨타임 5의 스펙을 갖추고 있다. 스킬로는 플레이어와 오브젝트들을 관통하는 관통탄을 쏜다. 아처 캐릭터는 마치 툼레이더의 캐릭터와 닮은 외형을 갖추고 있으며 체력 100, 공격력 15, 스피드 5, 스킬 쿨타임은 6의 스펙을 갖추고 있다. 스킬로는 차징샷을 쏜다.

미니 게임

본게임에 들어가기 전, 5단계로 구성된 미니 게임을 플레이하게 된다. 각 스테이지에는 총 4개의 포탈이 배치되어 있으며, 다른 유저들보다 빠르게 포탈을 이용해 다음 스테이지로 이동해야 한다. 가장 먼저 5스테이지에 도달한 플레이어는 본게임에서 사용할 수 있는 아이템을 보상으로 받는다.

🎮 게임 이용 화면


회원 가입

로그인

캐릭터 선택

게임 매칭

아이템 파밍

무기 업그레이드

배틀

😫 트러블 슈팅

문제 1

  • 문제 : Jenkins Script를 작성할 때 블로그를 참고하여 작성을 하였는데 Git Clone 단계에서 특정 파일을 찾을 수 없다는 에러가 계속 발생하였다.
  • 원인 : 블로그를 참고할 때 폴더 구조를 우리 프로젝트의 폴더 구조를 기준으로 spring boot를 clone 했어야 했는데 이것을 신경쓰지 않아서 발생한 문제였다.
  • 해결 방법 : 폴더 구조에 맞게 Script를 작성하였으며 Clone 이후 단계에서도 디테일하게 신경을 써줘서 무사히 CI/CD 파이프 라인을 구축할 수 있었다. 이러한 과정을 통해 Jenkins Script 작성법에 대해서 감을 잡게 되었다.

문제 2

  • 문제 : 친구 기능을 구현할 때 어떤 방식으로 구현할지 고민이었다.
  • 원인 : Spring을 처음 접하면서 친구 기능을 구현하게 되었는데 처음 구현하다 보니 살짝 고민이 있었다.
  • 해결 방법 : Friend Ship 테이블을 두고 테이블에 친구 관계가 될 2명의 user 행을 두었고 추가로 is_from이라는 행을 두어서 누가 보냈는지에 대한 여부를 두어 친구 요청을 보내고 받는 기능을 구현하였으며 거절을 할 경우 그 정보를 삭제하는 방식으로 친구 기능을 구현하였다.

문제 3

  • 문제 : Unity를 담당한 팀원과 STOMP를 사용한 로비 채팅 기능을 Unity와 채팅 연결 작업을 하면서 채팅 연결이 안되는 현상이 발생하였다.
  • 원인 : Unity를 담당한 팀원이 연결을 하면서 제가 작성한 STOMP의 기능을 완벽히 이해하지 못했고 또한 Security와 JWT를 활용한 인증 인가 방식으로 회원 시스템을 구축하였기 때문에 토큰 처리를 하지 않았어서 발생했다.
  • 해결 방법 : Unity를 담당한 팀원에게 STOMP의 작동 원리를 쉽게 설명을 해주었고 또한 토큰 처리에 대한 것도 알려주었습니다. 이렇게 팀원에게 관련 지식을 공유함으로써 문제를 빠르게 해결하였습니다.

🌟 프로젝트 진행 중 잘한 점

  • CI/CD 구축의 성공적인 완료 : Docker와 Jenkins, Nginx를 활용하여 Spring Boot 서버의 CI/CD 파이프라인을 성공적으로 구축한 것은 프로젝트의 안정성과 생산성을 크게 향상시켰다.
  • 협업을 통한 성과 달성 : Unity 팀원과의 협업을 통해 서로의 코드를 공유하여 효율적인 문제 해결을 하여 실시간 로비 채팅 기능을 성공적으로 구현하였고, 이렇게 구현한 채팅 기능으로 인해 실시간 통신이 게임 사용자 경험에 미치는 영향을 체감하였으며 이를 통해 협업의 중요성을 깨달았다.
  • 새로운 기술 습득 후 프로젝트에 적용 : Spring Boot, JPA, STOMP, Docker, Jenkins 등 다양한 기술을 처음 사용하면서도 프로젝트의 요구사항에 맞게 실질적으로 적용하고 성공적인 결과를 만들어냈다.

🤔 프로젝트 진행 중 못한 점

  • nginx를 굳이 사용했어야 하는 점 : 사실 nginx를 학습의 목적으로 사용한 점이 컸다. Spring boot만 ec2에 띄워 놓기 때문에 https를 설정했다는 것 이외에는 nginx를 사용해야 할 이유가 없었는 점 때문이다.(하지만 학습용으로는 완전 좋았음...)

📚 프로젝트 진행 중 배운 점

  • Spring의 기본 구조와 개념
  • Spring boot와 JPA를 사용한 CRUD
  • Spring STOMP를 사용한 간단한 채팅 구축
  • Docker의 개념 및 구조
  • Docker로 EC2에 컨테이너 구축
  • Jenkins를 사용한 CI/CD 스크립트 작성법
  • 팀원과의 협업 및 소통 능력 향상

결론

😊 후기

이번에 게임 프로젝트에 참여를 하였는데 웹 개발자를 지망하는 만큼 특화 프로젝트에서 다른 도메인들에 비해서는 별로 영양가는 없는 도메인이지만 이제껏 한 프로젝트 중에서는 개발 도중에 가장 재미있었고 팀 분위기도 제일 좋았던 프로젝트여서 정말 만족스러웠다.

또한 Java, Spring, Spring STOMP, Docker, Jenkins, nginx에 대해서 학습을 하면서 백엔드에서는 간단하게 나마 배포까지 구축할 수 있을 만큼 역량을 성장 시킬 수 있어서 얻을 것도 많았고 단순히 기능 구현을 넘어서, 처음 접하는 기술들을 학습하고 이를 실질적으로 프로젝트에 적용하는 과정에서 배우는 재미와 성취감을 느꼈다. 간단한 규모의 프로젝트였지만, 개발 중 겪은 어려움을 해결하고 팀과 함께 결과물을 만들어냈다는 점에서 매우 보람 있었다.

이번 프로젝트는 단순히 기술적으로 성장한 것뿐만 아니라 개발자로서의 즐거움과 협업의 중요성을 깨닫게 해준 값진 경험이었다. 앞으로도 이번 프로젝트를 통해 얻은 배움과 동기부여를 바탕으로, 더욱 깊이 있는 역량을 갖춘 웹 개발자가 되기 위해 노력하겠으며 이번에 즐겁게 같이 프로젝트를 진행한 팀원들에게 고생했다고 한마디 남기겠다.

profile
Happiness is not a destination, it's a way of life.

0개의 댓글