https://hoho-thinking.tistory.com/199
웹 소켓이란?
웹 소켓 프로토콜 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜. TCP 접속이란, 클라이언트 소켓 주소와 서버 소켓 주소를 연결시켜 클라이언트에 TCP 소켓을 생성시키는
hoho-thinking.tistory.com
채팅 기능을 구현하기 위해서 웹 소켓을 사용하 기로 했다.
개념적 데이터 모델링
- 회원들은 여러 개의 채팅방을 가진다.
- 채팅방은 여러 개의 메시지를 가진다.
논리적 데이터 모델링
- 구매자가 판매자에게 채팅방을 생성을 하는 것을 기준으로 1 대 1 채팅을 한다.
- 유저 - 채팅방 : 1 대 N 관계로 판매자를 대상으로 여러 개의 채팅방을 생성할 예정이다.
- 채팅방 - 메시지 : 1 대 N 관계로 채팅방에 여러 메시지를 보낼 수 있도록 한다.
엔티티
채팅방
@Entity
@Getter
@NoArgsConstructor
public class ChattingRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "seller_id")
private User seller;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "buyer_id")
private User buyer;
private boolean state = true;
@OneToMany(mappedBy = "chattingRoom")
private List<ChattingMessage> chattingMessage = new ArrayList<>();
public ChattingRoom(User seller, User buyer) {
this.seller = seller;
this.buyer = buyer;
}
public void addMessage(ChattingMessage message) {
this.chattingMessage.add(message);
}
public void changeState() {
this.state = !this.state;
}
}
채팅 메시지
@Entity
@Getter
@NoArgsConstructor
public class ChattingMessage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "room_id")
private ChattingRoom chattingRoom;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
private LocalDateTime time;
private String content;
public ChattingMessage(User user, ChatRequestDto requestDto) {
this.user = user;
this.time = requestDto.getTime();
this.content = requestDto.getMessage();
}
public void addChattingRoom(ChattingRoom chattingRoom) {
this.chattingRoom = chattingRoom;
chattingRoom.addMessage(this);
}
}
엔티티 생성 중 ERD 변경점
기존의 생각으로는 채팅방을 만들 때, 구매자가 판매자에게 신청을 걸어서 채팅을 할 수 있게 할 생각으로 채팅방에 판매자 아이디만 있고 메시지에서 판매자와 발신자 아이디를 가지고 메시지를 누가 전송하는지 구분을 두고 구현을 생각이었다.
하지만, 구현을 하다 보니 채팅방을 가져와서 사용자를 확인하려고 했을 때 채팅방을 사용하고 있는 구매자를 알 수가 없는 부분이 있어 메시지에서 채팅방으로 구매자를 옮기고 메시지를 작성자만 있게 해 프론트에서 구분을 줄 수 있도록 변경하였다.
물론 또 구현을 하다가 설계적으로 막히는 부분이 있으면 또 수정을 하게 되겠지만, 이러한 문제들을 통해 나중에 처음부터 설계가 좋은 ERD를 작성할 수 있지 않을까 생각을 한다.
참고한 사이트
https://velog.io/@hiy7030/TIL-%EC%B1%84%ED%8C%85-%EA%B8%B0%EB%8A%A5-ERD-%EC%84%A4%EA%B3%84
'생각정리 > 사이드 프로젝트' 카테고리의 다른 글
사이드 프로젝트 : 중고 거래 플랫폼 - 웹 소켓 프론트엔드 설정 (0) | 2024.01.28 |
---|---|
사이드 프로젝트 : 중고 거래 플랫폼 - 웹 소켓 백엔드 설정 (0) | 2024.01.26 |
사이드 프로젝트 : 중고 거래 플랫폼 - 리엑트 로그인, 회원가입 (0) | 2024.01.19 |
사이드 프로젝트 : 중고 거래 플랫폼 - 게시글 (0) | 2024.01.18 |
사이드 프로젝트 : 중고 거래 플랫폼 - 회원가입 , 로그인 구현 (0) | 2024.01.17 |