Spring/채팅앱

채팅 ERD 설계

wans10 2023. 6. 30. 21:27

이번에는 채팅앱 프로젝트를 시작해보겠습니다.

 

이번 프로젝트에서는 ERD를 먼저 설계해놓고 체계적으로 해보려 합니다.

채팅은 1:1 채팅부터 단체채팅방을 구현해 보겠습니다.

 

먼저 고려해야될 사항

  • 회원은 여러개의 채팅방을 가질 수 있다.
  • 채팅방에는 여러 회원이 들어있다.

회원과 채팅방은 N:M 관계를 가지게 됩니다.

그렇다면 두 테이블을 다대다로 묶는다? 이건 안된다.

연관 테이블을 추가하여 1:N:1로 풀어줍니다.

 

이렇게 하면 한 채팅방에 참여한 회원들과 한 회원이 참여한 채팅방목록을 조회 가능합니다.

 

여기까지 되었다면 채팅 메세지는 어디에 매칭시켜야할까

 

만약 채팅방테이블에 추가한다면 중복되는 행이 무한히 늘어나서 안된다.

따라서 메세지라는 테이블을 따로 만들어 연관관계를 설정해야 한다.

 

메세지 고려사항

  • 메세지를 보내는 회원의 정보
  • 메세지를 보낸 채팅방의 정보

두 사항을 모두 가지고 있는 채팅참여에 연관시키면 해결이 됩니다!!

 

여기에 채팅방 아이디에 종속적인 채팅 메세지 아이디로 만들어 봅시다.

1번채팅방의 3번 메세지, 2번 채팅방의 5번메세지.. 이런식으로 말이죠

 

문제점

채팅방 아이디에 종속적인 채팅 메세지 아이디로 만들면서 문제가 생겼습니다.

메세지 번호가 자동으로 부여되지 않아 최종 메세지순서를 얻기 위해 DB를 조회해야한다는 문제가 생깁니다.

@Query("select max(m.messageSequence) from Message m where m.chattingRoomId = :roomId")

해당 쿼리가 메세지가 들어올 때 마다 실행되어야 합니다.

 

어짜피 PK @GeneratedValue 자동번호부여로 메세지의 순서는 보장 되기에 시스템적으로 쓸모가 없어 빼버립니다.

 

여기에 회원과 1:N 인 친구테이블을 추가하면 기본적인 채팅 ERD가 완성됩니다.