실시간 채팅 기능에 웹소켓을 적용한 경험
팀 프로젝트에서 실시간 채팅 기능을 맡았을 때 처음에는 1초마다 서버에 polling하는 방식으로 구현하였습니다. 동작은 했지만 사용자가 늘어날수록 서버 요청이 폭발적으로 증가하는 문제가 발생하였습니다.
웹소켓으로 전환하기로 하고, Node.js와 Socket.io를 사용하여 다시 구현하였습니다. 연결을 한 번 맺으면 이후 메시지는 서버 push로 받는 구조로, polling 대비 서버 요청이 90% 이상 줄어들었습니다. 전환 과정에서 연결이 끊겼을 때 재연결 처리를 하지 않아 새로고침하면 채팅이 안 되는 버그가 발생하였고, reconnect 옵션을 추가하여 이를 해결하였습니다.
그 경험에서 실시간 기능은 어떤 방식으로 통신하느냐에 따라 서버 부하가 완전히 달라진다는 것을 배웠습니다. 기능이 동작한다고 해서 모든 것이 해결되는 것이 아니라, 얼마나 효율적으로 동작하는지가 운영에서 중요하다는 것을 느꼈습니다. 그 실패가 통신 방식을 신중하게 선택하는 습관을 만들어주었습니다.