Codestate 프로젝트 회고
프로젝트 소개
Right Now
기간 : 2021-12-27 ~ 2022-01-21
사용자의 현재 위치를 기반으로 주변의 같은 관심사의 다른 사용자들과
자동으로 모임을 매칭 시켜 주는 위치기반 서비스
왜 이 프로젝트 주제를 선택했나?
요즘 같은 모두 바쁜 시대에 특정인들과 약속을 잡기 쉽지 않고, 또 같은 취미를 가진 사람들을 찾기에는 더욱 쉽지 않습니다.
이러한 불편함을 해결하기 위해 시간을 절약하며 내 주변에 있는 나와 취미가 맞는 사람들과 빠르게 모임을 만들 수 있는 프로그램을 개발하면 어떨까 해서 이러한 프로젝트를 시작하게 되었습니다.
Right Now 만의 특징은?
rightnow 는 소모임 참가 시 다른 소모임 플랫폼들과는 다르게 유명 게임 '리그오브 레전드' 와 비슷한 매칭 시스템으로, 내 주변에 매칭 진행 중인 나와 취미가 같은 유저가 있다면 실시간으로 매칭을 진행시켜 주는 실시간 매칭 시스템을 적용하였습니다.
또한 한명한명의 유저가 현재 참가 중인 모임에 집중할 수 있도록 이미 모임 참가 중인 유저는 또 다른 모임에 참가할 수 없습니다.
Web Socket 통신을 적용한 이유가 있나?
rightnow는 실시간 매칭 , 채팅 서비스를 구현해야 했기 때문에 클라이언트들 간 실시간으로 상호작용 통해 서로의 요청이 또다른 클라이언트들에게 즉각 반영되게 구현해야 했습니다.
이러한 기능을 http 통신으로 구현할 경우 각각의 클라이언트 들에서 지속적으로 서버로 상태 체크 요청을 보내야 했기 때문에 이러한 방식은 서버에 부하도 많이 가면서 클라이언트들 간의 즉각적인 통신도 불가능 했습니다.
하지만 소켓 통신으로 구현 시 한번 접속하면 클라이언트와 서버 간 연결이 지속되기 때문에 하나의 클라이언트가 어떠한 상태의 변경을 요청하면 연결되어 있는 다른 클라이언트들에게 즉각적으로 반영되면서 클라이언트가 지속적으로 상태 변경 요청을 서버에 요청을 보내지 않고 변경 요청이 들어올 때만 서버에서 클라이언트들에게 요청을 보내주면 되니 서버의 부담도 줄어들었습니다.
이러한 이유들 때문에 실시간 서비스에 소켓 통신을 적용하게 되었습니다.
Web Socket 통신을 적용하면서 힘들었던 점은?
평소에 자주 사용하던 익숙한 통신 프로토콜인 http는 서버와 클라이언트의 연결이 지속되지 않는 stateless 방식인 데 비해, web socket 통신은 한번 클라이언트에서 요청하면 연결이 지속되는 stateful 방식이어서 서버의 부하를 신경 써야 했습니다.
게다가 매칭 시스템은 클라이언트와 서버가 서로 간에 지속적으로 요청을 보내줬어야 했는데 이러한 과정에서 서버에 과부하가 발생하게 되었습니다.
해결책을 찾던 도중 클라이언트에서 SetTimeout을 이용하여 지속적인 요청을 텀을 두고 스케줄링하였고, 그 결과 서버의 과부하 현상을 해결하게 되었습니다.
배포 과정에서 힘들었던 점은?
배포 과정에서 https를 적용하니 socket 서버와 클라이언트 간 연결이 끊기는 현상이 발생했습니다.
처음 socket 서버 배포를 진행하니 예상치 못한 오류를 맞이하였고, 이러한 문제를 해결하기 위해 비슷한 문제를 검색하여 자료들을 수집한 후 하나하나 분석하면서 문제를 해결해 나갔습니다.
먼저 소켓 서버를 안정화시키기 위해 프로젝트 API 서버와 Socket 서버의 인스턴스를 분리하였습니다.
또 브라우저의 네트워크를 확인해 보니 서버 부하가 심한 Poling방식으로 요청을 보내는 현상이 발생해 클라이언트 소켓 연결 시
Web socket 방식으로 연결을 보내게 요청하였습니다.
마지막으로 aws loadbalancer의 유휴시간 안에 요청을 처리하지 못하면 서버 - 클라이언트의 연결이 끊기게 되어 Loadbalacer 유휴 제한시간을 10초에서 60초로 늘렸습니다.
이러한 과정을 거치고 소켓 서버를 안정화 시킴으로서 클라이언트와 소켓 서버간 연결 끊김 현상을 방지하였습니다.
팀 프로젝트를 마치면서 느낀 점은?
팀 프로젝트를 시작할 때는 혼자서 모든 일을 해결할 수 있고, 어떠한 예외상황이 발생해도 빠른 시간 내에 쉽게 오류를 해결할 수 있을 것 같은 자신감에 차 있었습니다.
하지만 큰 오류에 부딪히면서 혼자 진행하면 더욱 시간이 걸리고 힘들었을 거 같은 문제도 팀원들과 협업을 통해 task를 분배해서 문제 해결을 하니 더욱 효율적이고 쉽게 해결할 수 있다는 것을 느꼈습니다.
그 전까지의 학습과 회사에서의 경험을 통해 개발자로서 스스로 문제 해결을 해 나가는 방법을 배웠다면, 이번 팀 프로젝트를 통해 팀원들 간 협업을 통해서 문제 해결을 더욱 빠르고 효율적으로 해결할 수 있는 방법을 배웠습니다.