1. 프로젝트 소개
싸피 2학기 첫 프로젝트인 공통 프로젝트를 시작했다. 우리 팀은 총 6명이었고, 전부 초면인 사람들이었다. 내가 팀장을 맡았고, WebRTC를 필수로 사용해야 하는 웹기술 프로젝트였다. 인프라 1명, 백엔드 2명, 프론트엔트 3명으로 이뤄졌다. 처음에 아이디어톤을 했었는데, 총 10팀이었던 4반에서 우리가 1등을 차지했다🎉
그리고 최종 3등으로 🏆우수상🏆까지 탔다!
‘모꼬지’는 놀이·잔치 그 밖의 다른 일로 여러 사람이 모이는 것을 뜻하는 순우리말이다. 우리의 아이디어는 결혼식, 졸업식, 입학식 등과 같은 중요한 행사에 참여하지 못하는 사람들을 위한 비대면 행사 플랫폼이다. 그래서 모꼬지라는 이름으로 짓게 되었다.
기존의 비대면 결혼식을 생각해보면 유튜브 라이브처럼 일방향 소통이지만, 우리의 프로젝트는 양방향 소통은 물론, 참석자끼리 소통이 가능하다는 차별점을 가지고 있다. 그리고 행사가 끝나면 롤링페이퍼와 포토모자이크로 추억을 만들어주는 기능도 추가를 했다.
2. 프로젝트 진행과정
2-1. 아이디어 선정
공식적으로 프로젝트가 시작하기 전에 비대면으로 아이디어 회의를 간단하게 했다. 좋은 주제들이 나왔지만 아쉽게도 여기서는 선정된 아이디어는 없다. 실제로 정해진 아이디어는 아이디어 해커톤 때 나왔다.
아이디어 해커톤 기록
아이디어는 무난하게 정해졌기 때문에 기획으로 빠르게 넘어갈 수 있었다. 문제는 기획이었다. 기획이 다들 처음이라 뭐를 먼저 해야 할지 알지 못해서 우왕좌왕했었다. 피그마도 6명이서 다같이 만들어보다가 3명이서 만들고, 기획서도 3명이서 작성하다가 일을 분담하는 식으로 점차 발전했다. 그리고 컨설턴트님께 서비스 소개를 드렸더니 볼륨이 꽤 크다는 말을 들었다. 그 말씀을 듣고 몇몇 기능을 쳐낸 후 개발에 들어갔다.
2-2. 서비스 내용 정리
회원
💡 회원 관리는 기본적으로 Spring Security, JWT와 OAUTH2를 활용
- 회원 가입
- 로그인 / 로그아웃
- 마이페이지
- 회원 정보 수정
행사
💡 화상 회의는 OpenVidu를 활용
행사 별 소그룹 리스트는 Redis를 이용해 관리
- 호스트 메인 행사 생성 및 참여자들 입장
- 참여자들 소그룹 생성
- 회의 정보 조회
- 개인 & 소그룹 사진 촬영
- 롤링페이퍼 메시지 입력 후 저장
결과물
💡 사진, 음성, 영상 파일은 S3 에 업로드
사진 리스트는 Redis Cache를 이용해 조회 속도 개선
포토모자이크는 OpenCv 라이브러리를 활용
- 기억
- 롤링페이퍼 편집
- 대표이미지 설정
- 사진 추가
- 포토모자이크 생성
- 추억으로 변경
- 추억
3. 프로젝트 후기
🔅 프로젝트를 통해 얻은 것
- 리더십
국비 프로젝트를 할 때 팀장아닌 팀장을 맡았었지만, 그 때는 나도 팀원들도 다 프로젝트에 대해 잘 모르는 상태라 팀장으로서 발전한 점이 크게는 있다고 생각하지 않았다. 그러나 이번에는 6명 중 3명이 전공자, 3명이 비전공자였고 다들 최소한 한번씩은 프로젝트를 해봤기 때문에 어느정도 개발에 대한 지식이 있는 사람들 사이에서 팀장을 맡았다. 팀장으로서 했던 일 중 내게 발전적이었던 부분은 소통법이었다. 원래는 말을 할 때 확신이 떨어지는 말투로 말을 했었는데, 말을 하면 할수록 팀장으로서 자신감이 떨어져보인다는 느낌을 나 스스로 받으며 더 자신감있는 말투를 사용해 팀원들과 소통할 때 신뢰할 수 있는 사람으로 성장했다. 또한, 여러 성향의 팀원들과 함께하며 각자의 개발스타일과 대화스타일에 맞게 유연한 소통하는 능력이 발전했다. 그리고 당연하게도 팀장으로서 책임감이 생겨 끝까지 우리 프로젝트를 응원했다.
- REDIS 사용법
이번에 NoSQL은 처음 써봤는데, Redis가 속도가 굉장히 빠르다는 것을 보고 도입했다. 우리는 사진, 영상, 그리고 음성파일을 S3에 저장하고 Key값을 MySQL에 저장하고 그것을 조회하는 로직이 있다. 이 리스트가 많은 양이기 때문에 매번 DB에서 불러오기 보다는 캐시에서 가져오는 것이 성능향상에 많은 도움이 됐다.
처음에 세팅을 할 때, 캐싱 방식, 동시성 처리 등 Redis를 사용하기 위해 공부를 할 때 계속해서 에러가 나고 또 가끔 성공을 하는 동안 NoSQL과 캐싱에 대한 많은 지식이 머리속으로 정리가 됐다.
- JPA 사용법
김영한 선생님의 강의를 공부한 후 처음으로 실제 프로젝트에서 사용해봤다. 직접 쿼리를 작성하지 않아도 돼서 매우 편리했다. 처음에 엔티티를 만들 때 연관관계를 이상하게 설정해서 오류가 났었다. 계속 공부하며 해결하고, 또 캐싱을 할 때 연관관계 때문에 StackOverFlow가 나는 경험도 해봤다. 그리고 QueryDsl도 함께 사용을 해봤는데, 김영한 선생님께서 말씀하신 대로 매우 편리했다. 딱 한번만 사용해봐서 아쉽지만 더 공부해서 다음 프로젝트 때 자유자재로 사용해보고 싶었다.
🔅 잘한 점
- OpenVidu 커스텀
OpenVidu CE버전에서는 소그룹이 지원되지 않는다. 때문에 우리가 직접 만들었어야 했다. 우리가 해결한 방식은 메인 세션의 ID를 넘겨 Redis의 counter를 사용해 세션 ID에 순서를 추가해 세션을 생성하고, 그 소그룹 세션에 대한 정보는 Redis에만 남겼다. 그리고 세션ID를 프론트에 넘겨주는 방식으로 해결했다.
- 다양한 미디어 기능
그저 화상회의만 여는 사이트만이 아닌, 화상회의가 일어나는 동안 사진을 촬영하고 편지를 보내는 기능을 추가했다. 촬영한 사진들은 OpenCV 라이브러리를 활용한 포토모자이크를 생성한다. 생각보다 결과물이 잘 나와서 만족스러웠다. 그리고 편지를 보낼 때는 텍스트, 음성녹음, 그리고 영상파일 첨부가 가능하다. 이것들은 화상회의가 종료된 후 롤링페이퍼를 볼 때 확인할 수 있다.
🔅 아쉬운 점
- 중요도에 따라서 일을 처리했어야 했는데, 그러지 못해 마지막에 롤링페이퍼와 포토모자이크 기능을 급하게 했다.
- 기획 때 시간을 들인 것에 비해 기획 결과물의 퀄리티가 높지 않다.
- 백엔드 코드 스타일을 맞추지 못했고, 후반부에는 커밋 메시지 규칙도 잘 지켜지지 않았다.
- 코드 리뷰를 하지 않았다.