문제
원인 파악
각 1:1 채팅방의 메시지를 통해 1:1 채팅방을 전체 조회했음.
1:1 채팅방이라면 경매게시글 작성자와 낙찰자 2명만 존재해야 되는데 게시자와 낙찰자를 따로 구분해놓지 않았음.
따라서 경매게시자 닉네임으로 따로 채팅목록이 만들어져야 되고 낙찰자 닉네임로도 따로 채팅목록이 만들어져야 했음.
결국 경매게시자, 낙찰자 닉네임으로 1:1채팅방을 조회하면 해당 1:1 채팅방의 room_Id에 해당하는 컬럼 전체를 조회해와서 room_id갯수만큼 채팅방 목록이 출력됨.
즉 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 쌍방간의 채팅방 목록이 잘 조회되었다.
{
"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
}
]
}
]
}