채팅 기능 구현 시 다음과 같이 메시지를 안 읽은 사람의 수가 메시지 옆에 작게 숫자로 표시되도록 하고 싶었다.

image.png

그렇게 하려면 각각의 메시지를 안 읽은 사람의 수를 알아야 했고, 한 사람이 동일한 메시지를 두 번 읽었을 때 카운트되지 않도록 하려면 누가 어떤 메시지를 읽었는지도 DB에 저장해놓아야 했다.

🤔 어떤 유저가 어떤 메시지를 읽었는지 어떻게 알 수 있을까?

1️⃣ 각각의 메시지에 해당 메시지를 읽은 유저의 id 를 저장하는 방식

User1, User2, User3 이 한 채팅방에 접속해있다고 가정해보자.

image.png

어떤 유저가 어떤 메시지를 읽었는지 판별할 수 있도록 서버 측에서는 다음과 같이 테이블을 구성한다. (설명의 편의를 위해 단순화한 테이블입니다.)

image.png

만약 이 상태에서 누군가 메시지를 보내면 채팅방에 접속해있는 인원들은 즉시 메시지를 읽으므로 다음과 같이 테이블에 레코드가 추가된다.

image.png

User3 이 여기서 채팅방의 접속을 끊고 다른 걸 하러 갔다고 해보자.

image.png

이 상태에서 누군가 메시지를 보내면 User3 은 채팅방에 접속해있지 않기 때문에 다음과 같이 User1 과 User2만 읽음 처리를 한다.

image.png

image.png

User3이 다시 채팅방에 접속하면 User3 안 읽은 메시지를 찾아서 read_user 필드에 User3 을 추가해줘야 한다.

image.png

그러기 위해선 다음과 같이 모든 메시지를 읽어서 read_user 필드에 자신이 포함되어 있는지 확인하는 과정이 필요하다.

image.png