문제 정의
1대1 채팅을 구현할 때 읽음 처리를 진행하기 위해서 고려해야 할 부분은 다음과 같습니다.
- 상대방이 채팅방에 들어왔을 때 -> 읽지 않은 메시지 읽음 처리
- 상대방이 채팅방에 접속중일 때 -> 보낸 메시지 즉각 읽음처리
상대방이 채팅방에 들어왔을 때
- 저는 웹소켓을 STOMP기반으로 사용하고 있어 Header의 COMMAND에서 CONNECT메시지 구분이 가능했습니다.
- 이를 이용해 CONNECT시 모든 채팅을 읽음 처리했으며, 화면 단의 변경을 위해 웹소켓으로 Update요청을 보내 처리했습니다.
상대방이 채팅방에 접속중일 때
기존 해결책
제가 처음에 선택했던 방식은 아래 흐름과 같습니다.
문제점
- 상대방이 접속해 있는것을 확인하기 위해서는 매번 리콜 처리해야 하며 이 때 DB Update또한 발생합니다.
- 즉, 상대방이 채팅방에 접속해있다면 채팅 한 번 마다 소켓 요청 + DB업데이트의 오버헤드가 발생합니다.
- 또한, 저희 서비스에서는 채팅이 발생했을 때 알림을 전송하고 있는데 상대방이 채팅방에 접속해있음에도 불구하고 채팅이 발생했다는 알림을 보내야합니다.
해결책
저는 이러한 오버헤드와 불필요한 알림 전송을 제거하기 위해 아래와 같은 흐름을 선택했습니다.