생각정리/사이드 프로젝트

사이드 프로젝트 : 중고 거래 플랫폼 - 채팅

생각중임 2024. 1. 24. 18:08

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

https://great-park.tistory.com/140

https://dev-gorany.tistory.com/212