[Bitcamp] 자바 첫번째 프로젝트 회고록
비트캠프를 시작한 지 벌써 한 달 정도의 시간이 지났다.
한 달의 시간 동안 자바를 공부하고 바로 팀 별 자유주제로 프로젝트를 진행했었다.
학교를 다니면서 프로젝트를 해본 적은 있었지만 이렇게 제대로 된 프로젝트는 처음이라 더더욱 어렵게 느껴진 것 같다.
다른 분들은 어떻게 느꼈는지 모르겠지만 나는 개인적으로 너무나도 촉박하고 정신없는 일주일이었다..
1. 프로젝트 구조 선택
강사님께서 임의로 앉은자리별로 나눠서 6명 1팀으로 나눠주셨다.
프로젝트를 진행하는 방식으로는 위의 사진과 같이 1) App-DB, 2) App-Server-File, 3) Client-Server-DB구조 중에서 원하는 구조로 구성하는 것이었다. 프로젝트를 진행하게 됐을 때 소켓에 대한 수업은 자세하게 하지 않았기 때문에 우리 팀원들은 조금씩이라도 배운 기능들을 최대한 사용해보고 싶었기 때문에 3번 Client-Server-DB구조를 선택하게 되었다.
2. 주제 선정
우리 조는 6명에서 하나의 프로그램을 구성하게 된다면 프로젝트에 퀄리티는 높아지겠지만 각각 맡은 부분만 구현하고 다른 부분은 구성하지 못할거 같다고 판단하여 2인 1조로 미니 게임 3개를 만들기로 했다. 우리끼리 프로젝트를 할 때는 최대한 한달동안 배운 개념들을 사용하기로 약속했었고, 서로 궁금하거나 도움이 필요한 부분이 있으면 적극적으로 도와주기로 했었다.
게임은 3개지만 프로그램을 하나로 묶어야 하기에 3일차 까지만 각자 프로그램을 구성하고 이후에 DB를 같이 구성하기로 했었다..
이게 가장 큰 실수였다.
나와 같이 프로젝트를 진행하게 된 팀원은 프로젝트 경험이 없었기 때문에 프로젝트의 퀄리티가 떨어지더라도 완성하는데 의의를 두었다.
그래서 보다 복잡한 게임이 아닌 지하철 노선을 맞추는 게임을 하기로 했다.
3. 계획 하기
나와 팀원은 나름 자바 수업도 열심히 듣고 남아서 스터디도 하면서 나름 우리가 원하는 기능들을 구현할 수 있다고 생각했지만 너무
오만했다. 나와 팀원은 서로 멍만 때릴 것 같았기에 첫 번째로 팀원과 게임에 대한 규칙과 데이터베이스 구성 및 배운 개념들 중 어떤 것을
활용할 것인지 회의를 했다.
우리가 정한 게임은 App환경에서는 Clinet(유저)가 2명이 들어오게 되면 먼저 들어오는 사용자에게 게임을 진행할 호선을 입력받게 하고 사용자가 선택한 호선으로 게임이 진행되는데, 1번 사용자가 정답을 입력하면 턴이 바뀌어 2번 사용자에게 입력을 받게 하는 방식으로 서로 상호 작용이 되도록 계획을 짰다. 근데 이렇게 하면 사용자가 생각날 때까지 기다렸다가 입력할 수 도 있기 때문에 멀티 스레드의 Timer기능을 이용하여 5초 제한 시간을 부여하고, 만약 유저가 입력했던 값을 입력해도 안되기 때문에 중복 값을 체크해 주는 기능도 추가해 주었다.
마지막으로는 메인으로 사용할 클래스와 핵심적인 메서드의 기능 및 이름을 정해주었다.
4. 구현 시작!
팀원과 나는 프로젝트 경험을 키우기 위해 각자 프로그램을 구성을 해보고 하루에 2번씩 서로의 코드를 비교해 보면서 추가할 기능과 수정할 기능들에 대해 이야기를 나누면서 점점 우리가 원하는 기능을 구현하게 되었다.
4-1 (첫 번째 위기)
2일 차 까지는 프로그램의 틀을 짜면서 문제가 있던 부분이 없었는데, 멀티 스레드 기능을 구현하게 되면서 문제가 발생하였다...
멀티 스레드 기능으로 사용자가 특정 조건을 만족하면 턴을 넘겨주기도 하고, timer()를 활용하여 제한 시간도 걸어주기도 하고
각자의 스레드들을 켜주고 일시정지도 시켜주는 기능들을 넣게 되었는데 프로그램이 정상적으로 작동이 되지만 프로그램이 종료될 때
계속해서 스레드가 실행되고 있어서 프로그램이 완전한 종료되지 않았다..
시작점에서도 toggle을 찍어서 디버깅까지 해보았는데 대체 뭐가 문제인지 몰랐다. 그렇게 팀원분들한테도 여쭤보았지만 해결되지 않아
구글링도 해보고 Chat GPT도 활용해 보면서 문제첨을 찾을 수 있었다...
알고 보니 스레드를 일시 정지 해주는 부분에서 올바르지 않은 경로에서 Timer 초기화를 하고 있었기 때문에 스레드가 계속해서 살아있던 것이었다... 너무 허무......
4-2 (두 번째 위기)
이렇게 App은 간신히 구현하게 되었지만, 문제가 하나 더 발생했다. 우리 조의 다른 분들은 각자 턴제 게임과 마피아 게임을 하게 되었는데 사실상 각자 코드 짜는 것에 너무 몰두하게 되면서 서로의 프로그램 개발 상황이 안 맞게 되기도 했고, 각 팀마다 데이터베이스도 사용을 너무 많이 하기 때문에 합치다가 오류가 발생할 수 있기도 해서 결국은 각 미니 게임마다 데이터베이스를 따로 구현하기로 했다.
그렇게 우리는 App 구성 후 DB에 1~9호선 지하철역에 대한 호선과 역 이름을 넣게 되었고 소켓을 활용한 클라이언트, 서버 구조로 구현하게 되었다. 이때부터가 고난이었다...
기존에 구현한 기능들을 제대로 개념이 박히지 않은 소켓 방식으로 바꾸려니까 무수히 많은 오류들과 구현 한 기능들이 실행이 안 되는
오류의 늪에 빠져버린 것이다..
4-3 (소켓.. 너 뭐야..)
스레드 부분을 고치면 다른 기능들이 오류가 발생하는데 시간은 점점 흐르고... 프로젝트 발표일은 점점 다가오고....
정말 막막하던 찰나에 우리 반이 전체적으로 시간이 더 필요하다고 느끼셨는지 프로젝트 발표일은 금요일에서 그다음 주 월요일로 바꿔주셨다. 진짜 가뭄에 단비... 팀 PPT도 완성이 안 돼있어서 원래 일정대로 진행됐다면 정말 큰일이었다.
우선 점점 발표일이 다가오는데 2인용 게임 방식이 구현이 지속적으로 안되면서, 팀원과 나는 프로젝트 경험이 많은 팀원분에게 조언을 구했고, 다른 팀원분께서는 2인용 게임을 계속 구현하다 보면 시간이 부족할 것 같다고 하셔서 차선책으로 생각해 두었던 혼자서 게임을 진행하되 게임이 종료될 때 정답을 맞힌 개수를 출력하도록 급히 변경하게 되었다. 그렇게 토요일에 1인용 게임을 겨우 만들었지만, 내가 엄청난 고뇌와 뿌듯하게 만든 멀티 스레드 기능들을 사용을 안 하게 되니까, 너무 미련이 남아서 팀원에게 양해를 구하고 다시 한번 2인용 게임으로 만들어보기 시작했다.
4-4 (어쩌다 완성???)
급하게 구글링도 하고 GPT한테도 스레드 개념도 다시 물어보면서 2인용 게임으로 어찌어찌 수정했지만 2명의 플레이어가 들어오지만
게임을 시작하면 상호 작용하면서 플레이하는 게 아닌 각자 플레이를 하게 되었다...
멀티 스레드 기능도 수정해 보고 팀원분들께도 여쭤보았지만 상호 작용 기능은 시간 안에 구현이 힘들 것 같아 기존에 코드를 최대한 살려서 각자 게임을 진행하되 제한 시간 안에 입력을 받게 하고 중복값 확인과 게임이 종료되면 서버 측에서 각 플레이어가 맞춘 정답 개수를 확인할 수 있도록 수정하였다. 나도 어떻게 완성시킨 건지 모르겠다.. 하하하
5. 프로젝트 발표
프로그램을 일요일에 완성을 하고 팀원분들과 프로젝트 발표를 어떤 방식으로 진행할 것인지를 상의했다.
우선 팀장님이 저희 프로젝트를 어떻게 진행했는지 간략하게 설명하시고, 지하철 게임 -> 턴제 게임 -> 마피아 게임 순서로 발표하기로 했다. 팀 당 발표 시간은 10~20분 사이였기 때문에 각자 3분씩 발표하기로 했다.
나는 지하철 프로젝트에서 클라이언트 -> 서버로 들어온 값을 입력 제한 시간과 중복 검사와 같은 스레드 기능들을 구현하였기 때문에
해당 기능들을 소개하고 우리 프로그램의 개요와 진행 과정에 대해 발표하게 되었다.
6. 후기
우선 프로젝트를 처음 해보는 거라 정말 막막하게 느껴졌지만 처음엔 계획을 짜고 코드는 아무렇게나 끄적이다 보니까 어떻게든 잘 구현이 되는 것 같았다. 그리고 프로젝트 시간을 타이트하게 잘 짜고 진행했어야 하는데 너무 안일하게 계획한 것 같아서 아쉬웠다.
내가 현재 개념을 알고 있더라고 실제 코드에 사용하는 것이 부족하다고 느꼈고, 다른 팀들의 결과물을 보니 대단하다고 느껴서
다음 프로젝트에는 좀 더 열심히, 잘해서 다른 팀원들도 돕고 이번 프로젝트의 결과물과 다른 팀들보다 훨씬 뛰어난 결과물을 만들고 싶다고 느꼈다. 마지막으로 다음 프로젝트에서 강사님이 박수 치실 정도로 앞으로 더 열심히 공부해서 프로젝트 잘할 거다.
프로젝트 깃허브 주소 : https://github.com/maruduke/bitcamp-project1/tree/main/SubwayGame