기본 서비스 구조
- 관리자와 회원(구매자, 판매자)만 채팅할 수 있다.
- 회원은 1개의 채팅방만 가질 수 있다.
기존 ERD
문제상황
- chat_room 에서 회원은 1개의 채팅방을 가질 수 있으니 PK로 가지면 되지 않을까?
- 그럼 채팅 상세에서도 회원ID를 fk로 가져야하는데 어차피 보낸사람 1개의 컬럼만 있으면 되므로 필요없다. 회원이 아니면 admin으로 짜도 되긴하겠지만 ..?
- chat_room 에서 채팅룸 번호를 Sequence로 가지고 채팅상세에서 채팅룸으로 구분한다 치면 채팅번호가 너무 늘어나지 않을까?
답변
- chat_room 에서 채팅룸 번호를 Sequence로 가지고 채팅상세에서 채팅룸으로 구분한다 치면 채팅번호가 너무 늘어나지 않을까?
➡︎ 그래서 일정 기간이 지나면 채팅이 삭제됩니다.
라는 알림을 띄우고 DB를 삭제해야 한다. 아니면 관리할 수가 없다.
➡︎➡︎ 삭제방법은 scheduler와 batch 이용!
➡︎➡︎➡︎ 스케줄러를 새벽4시 이렇게 설정하는게, 가장 이용자가 적은 새벽시간을 틈타서 대용량 처리를 하는 것이다!
➡︎ 아니면 파일로 기록을 관리할 수도 있겠지만 파일로 관리하는 것은 temporary한 기록들을 위주로 하고, 중요한 기록이 남아야 하는 것들은 DB에 저장해야 관리하기 좋다.
➡︎ 채팅룸번호를 chat_message에서 PK로 사용하고, 일련번호를 따로 둬라. sequence말고 MAX 함수 사용하자. select MAX(일련번호, 0) + 1 FROM chat_message
이런식으로.
➡︎➡︎ 채팅룸마다 일련번호 증가 (1번룸의 1~ 시작, 9번룸도 1부터 시작)
➡︎➡︎➡︎ 일련번호 말고 생성일자를 복합키로 가져가기로 했음
그대신 초단위까지 확인해야하므로 TimeStamped 이용하기
💡 다른 대안
- 채팅 기본 방(chat_room) 테이블은 두고, 회원마다 테이블을 하나씩 증가시켜라 (DDL 의 create 이용) -> 프랜차이즈 대기업에서 가맹점들을 이렇게 관리한다.
➡︎ 처음 해보는 방법이지만 시도해보면 좋을 것 같다.
➡︎➡︎ DDL이므로 JPA를 사용할 수 없다. Mybatis를 이용해야하는데 Mybatis를 이용해서 _1, _2 처럼 만든 테이블의 이름을 JPA를 이용해서 둘다 한번에 사용해야하는데 이건 어렵다.
그래서?
- 채팅룸번호와 생성일자를 복합키로 사용해서 만들어보기로!