Skip to content

채팅 읽음처리

namewhat99 edited this page Dec 12, 2023 · 1 revision

채팅 읽음 처리

  1. read 변수를 설정한다. read 변수는 해당 채팅이 몇 명에 의해 읽혔는지 나타내는 변수이다.

유저가 채팅방에 들어가면, 안 읽은 채팅들의 read 를 -1 처리한다

  • 이후 -1 된 채팅의 id 들을 클라이언트에서 서버로 넘겨주면 , 서버에서 해당 id 를 받아서 해당 채팅들의 read 를 -1 처리한다.
  • 그러면 여기서 발생하는 문제점이 어떻게 해당 채팅이 이전에 해당 유저에 의해 읽혔는지 안 읽혔는지 알 수 있을까?
  • 현재 서버에서 클라이언트로 전달해주는 채팅의 데이터는 다음과 같다
{
	"message" : "hello",
	"sender" : "qwe" , 
	"is_read" : false -> true,
	"create_time" : 
}

1. 채팅방에 접속한 순간 이전 채팅들의 read 값을 -1 처리

  • 내 채팅에 대해서 나는 항상 읽은 상태이므로 처리가 필요 없다. 읽음 처리는 내 채팅이 아닌 상대 채팅에 대해서만 하면 되기 때문에 간단히 내가 접속했을 때, 상대 채팅의 read 값을 -1 처리하는 방식으로 하면 될듯하다.
  • 그러면 모든 채팅들에 대해 매번 이 처리를 해야할까? 즉 매번 채팅방의 채팅 기록을 불러올 때 마다 이 처리가 필요한가? 그럴 필요는 없다. 채팅방의 채팅 로그들은 시간순으로 정렬된다. 그래서 클라이언트에서 read 가 0 인 채팅을 만나는 순간 이전 모든 채팅들은 이미 읽힌 채팅이다. 따라서 채팅을 최신순으로 읽다가 read 가 0 인 채팅을 만나는 순간 멈추면 된다.
  • 그리고 read 가 -1 된 채팅들을 서버로 보내면 서버에서 해당 채팅들의 read 값을 수정하고 다음번에 보내줄때는 0 인 상태로 보내주게 된다.

2. 채팅방 정보에 이전에 유저들이 언제 접속했는지 작성해놓는다.

  • 맨 처음 채팅방 목록을 전달 할 때, 이전에 해당 채팅방 유저들이 채팅방에 언제 마지막 접속했는지 전달한다.
  • 이후 채팅 목록을 받을 때, 두 유저의 마지막 접속 시간을 기준으로 읽음 처리를 한다. 마지막 접속시간 보다 해당 채팅이 이전에 이뤄졌으면 -1 , 이후에 채팅이 이뤄졌으면 그대로 띄운다.
  • 이 경우, 해당 클라이언트가 소켓 연결을 하고 해당 채팅방에서 나가는 순간 채팅방에 유저 접속 정보를 업데이트 해야한다. 다만 , 이 경우 서버에 read 횟수를 저장할 필요가 없다.

채택한 방식은 1번에 가깝다.

  • 현재 1 : 1 채팅방 밖에 존재하지 않기 때문에 결국 내가 접속을 하면, 이전에 있는 상대의 채팅은 모두 읽음 처리가 된다. 따라서 채팅방 목록을 불러올 때, 상대방의 채팅 중 읽음 처리가 되어있지 않은 채팅에 대해서 모두 읽음 처리를 해준다.

  • 일단 채팅방에 안에 현재 몇 개의 소켓이 존재하는지를 이용해 일차적으로 읽음 처리를 한다. 만약 현재 채팅방에 존재하는 소켓이 2개이면, 두 명 모두 채팅방에 있고 이는 상대방이 항상 내가 쓰는 채팅을 읽는다는 말이다. 만약 채팅방에 소켓이 1개이면, 즉 나만 채팅방에 존재하면 상대방은 채팅을 읽지 않는 상태이다. 따라서 나의 채팅에 대해서 안 읽음 처리를 하면 된다.

  • 그러면 여기서 문제가 생기는 점이 내가 채팅을 보내던 도중 상대가 나갔다가 다시 들어오는 경우이다. 내가 채팅방에 채팅을 하고 있다가 상대방이 채팅방에서 나가는 경우, 채팅의 읽음 처리 상태는 읽음 , ( 이 채팅 이후 나감) 안 읽음 , 안 읽음 일 것이다. 그런데 만약 여기서 상대방이 다시 들어오면, 해당 채팅들이 상대방의 화면에서는 모두 읽음 처리 되어있지만 내 화면에서는 업데이트가 되지 않고 읽음 , 안 읽음 , 안 읽음 , 읽음 이 상태가 될 것이다.

  • 이 점을 해결하기 위해 서버에서 상대방이 채팅방에 들어왔다는 이벤트를 보내준다. 그러면 클라이언트가 현재 내 화면에서 읽음 처리를 하는 방식으로 진행중이다.

Clone this wiki locally