1:1 채팅방 목록 조회 오류

SaGo_MunGcci·2022년 10월 5일
0

스프링

목록 보기
28/31

Trouble Shooting

  • 문제

    • 1:1 채팅시 해당 사용자의 채팅방 목록이 아닌 전체 1:1채팅 목록이 출력되는 오류가 발생
  • 원인 파악

    1. 각 1:1 채팅방의 메시지를 통해 1:1 채팅방을 전체 조회했음.

    2. 1:1 채팅방이라면 경매게시글 작성자와 낙찰자 2명만 존재해야 되는데 게시자와 낙찰자를 따로 구분해놓지 않았음.

    3. 따라서 경매게시자 닉네임으로 따로 채팅목록이 만들어져야 되고 낙찰자 닉네임로도 따로 채팅목록이 만들어져야 했음.

    4. 결국 경매게시자, 낙찰자 닉네임으로 1:1채팅방을 조회하면 해당 1:1 채팅방의 room_Id에 해당하는 컬럼 전체를 조회해와서 room_id갯수만큼 채팅방 목록이 출력됨.

    5. 즉 1:1 채팅방에 해당하는 메시지 갯수만큼 출력됨.

  • 선택지

    1. 기존의 메시지 테이블에 bidder와 seller라는 컬럼을 추가하는 방법
    2. 1:1 채팅 메시지만을 저장하는 bidder와 seller라는 컬럼을 추가하는 방법
  • 의사결정

    • 1번의 경우 1:1 채팅, 경매게시글별 전체채팅, 실시간 호가 등을 저장하는 테이블이라는 성격상 여기에 bidder와 seller라는 컬럼을 또 추가할 수 없다고 판단
    • 2번을 선택해야 경매 게시자 1:1 채팅 목록, 낙찰자 1:1 채팅 목록을 나눌 수 있다고 판단.
  • 결과

    • OnoChatMessage : 1:1 채팅 메시지만 저장하는 테이블을 만듦
package com.sparta.ddang.domain.chat.entity;

import com.sparta.ddang.util.TimestampedChat;
import lombok.Getter;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@Entity
public class OnoChatMessage extends TimestampedChat {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String roomId;

    @Column(nullable = false)
    private String roomName;

    @Column(nullable = false)
    private String lastSpeaker;

    @Column(nullable = false)
    private String seller;

    @Column(nullable = false)
    private String bidder;

    @Column(nullable = false)
    private String message;

    @Column
    private String profileImgUrl;

    @Column
    private LocalDateTime lastMessageTime;

    @Column
    private Long auctionId;

    public OnoChatMessage(){}
    public OnoChatMessage(String roomId, String roomName,String lastSpeaker,
                          String message,String profileImgUrl,Long auctionId,
                          String seller,String bidder,LocalDateTime lastMessageTime){

        this.roomId = roomId;
        this.roomName = roomName;
        this.lastSpeaker = lastSpeaker;
        this.message = message;
        this.profileImgUrl = profileImgUrl;
        this.auctionId = auctionId;
        this.seller = seller;
        this.bidder = bidder;
        this.lastMessageTime = lastMessageTime;

    }

    public void updateMessage(){

    }


}
//auction.getMember().getNickName() : 경매 게시자
//nickname : chatmessage에서 nickname을 검색한 채팅방에서
//nickname이 있는 채팅방에서 닉네임을 포함한
//onoChatMessage 새로 생성한후 저장
//그러면 만약 그채팅방에 메시지를 입력하면
//ChatMessage에 nickname에 해당하는
//채팅방Id가 있을 것이고
//nickname을 검색했을때 onoChatMessage에
//닉네임이 포함되어 저장되면서 해당 닉네임이 있는
//채팅방을 검색할 수 있다.
OnoChatMessage onoChatMessage
							= new OnoChatMessage(lastChat.getRoomId(), lastChat.getRoomName(),
    lastChat.getNickName(), lastChat.getMessage(),
    lastChat.getProfileImgUrl(), auction.getId(),
    auction.getMember().getNickName(), nickname, lastChat.getCreatedAt());

    onoChatMessageRepository.save(onoChatMessage);
    
    
    List<OnoChatMessage> onoChatMessages
                = onoChatMessageRepository.findAllByOrderByLastMessageTimeDesc();
        
        List<OnoChatMessageDto> onoChatMessageDtos = new ArrayList<>();

        for (OnoChatMessage onoChatMessage : onoChatMessages) {

            Auction auction
                    = auctionRepository.findById(onoChatMessage.getAuctionId()).orElseThrow(
                    () -> new IllegalArgumentException("해당 게시물 없음.")
            );

            if (onoChatMessage.getSeller().equals(nickname) ||
                    onoChatMessage.getBidder().equals(nickname)) {

                onoChatMessageDtos.add(

                        OnoChatMessageDto.builder()
                                .roomId(onoChatMessage.getRoomId())
                                .roomName(onoChatMessage.getRoomName())
                                .message(onoChatMessage.getMessage())
                                .profileImg(onoChatMessage.getProfileImgUrl())
                                .lastMessageTime(onoChatMessage.getLastMessageTime())
                                .auctionId(auction.getId())
                                .auctionTitle(auction.getTitle())
                                .multiImages(auction.getMultiImages())
                                .build()

                );

            }

        }

        return ResponseDto.success(onoChatMessageDtos);

    }
    

이렇게 하니 닉네임이 경메 게시자이면 seller를 검색해서 경매 게시자의 채팅 목록만 조회되고 닉네임이 낙찰자면 bidder를 검색하여 낙찰자의 채팅목록이 검색이 잘 되어서 1:1 쌍방간의 채팅방 목록이 잘 조회되었다.

  • 티키타카 및 위키미키의 각각의 1:1 채팅 목록
{
    "statusCode": 200,
    "msg": "OK",
    "data": [
        {
            "roomId": "4536de28-145b-4eb0-8880-7b2f90dd9989",
            "roomName": "경매1방 1:1 채팅방",
            "profileImg": null,
            "message": "일단 어떻게 하실래요?ㅎ",
            "lastMessageTime": "2022-10-03T13:29:03.043275",
            "auctionId": 1,
            "auctionTitle": "마법의 지팡이3",
            "multiImages": [
                {
                    "createdAt": "2022-10-03 10:24:35",
                    "modifiedAt": "2022-10-03 10:24:35",
                    "id": 1,
                    "imgUrl": "https://sysimagebucket.s3.ap-northeast-2.amazonaws.com/DdangDdang/auctionImg/1f507dfc-43cb-486f-abdc-268eda017f3dnapoleon.jpg",
                    "memberId": 1,
                    "auctionId": 1
                }
            ]
        },
        {
            "roomId": "c3f624e2-b693-4ab0-a7d2-124994ca4004",
            "roomName": "경매2방 1:1 채팅방",
            "profileImg": null,
            "message": "네네 제가 낙찰자입니다",
            "lastMessageTime": "2022-10-03T11:06:00.21382",
            "auctionId": 2,
            "auctionTitle": "마법의 지팡이3",
            "multiImages": [
                {
                    "createdAt": "2022-10-03 10:24:40",
                    "modifiedAt": "2022-10-03 10:24:40",
                    "id": 2,
                    "imgUrl": "https://sysimagebucket.s3.ap-northeast-2.amazonaws.com/DdangDdang/auctionImg/930a8b0c-be95-4edb-b9ed-d4645f27bd72napoleon.jpg",
                    "memberId": 2,
                    "auctionId": 1
                }
            ]
        }
    ]
}

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글