
현재 진행하고 있는 프로젝트에서,
채팅방 생성자는 방장이 아닌 관전자의 역할을 수행해야 한다고 생각했다.
그래서 채팅방 생성자일 경우 채팅을 금지하는 기능을 구현했다.
@ManyToOne
@JoinColumn(name = "owner_id")
private User owner;
채팅방 도메인에 채팅방 생성자를 저장한다.
public User findOwnerById(String id) {
return findRoomById(id).getOwner();
}
public boolean isUserOwner(String id, String userName) {
return findOwnerById(id).getNickName().equals(userName);
}
채팅방의 id를 이용해 채팅방 소유자를 찾고, 이 소유자와 보내는 사람의 닉네임이 일치하는지 판단한다.
@MessageMapping("/chat/message/whisper")
public void messageToOne(WhisperDto whisperDto) {
if (chatService.isUserOwner(whisperDto.getRoomId(), whisperDto.getSender())) {
return;
}
... // 생략
}
해당 기능이 필요한 @MessageMapping 메서드에서 메시지를 보낸 사람이 채팅방 생성자라면 메서드를 종료시켜 메시지를 보내지 못하도록 한다.
사용자 A가 채팅방 생성자일 경우 A가 메시지를 보냈을 때 동작이다.
// A -> 모두에게 : 오늘 날씨가 좋네요.
{
"type" : "TALK",
"roomId" : 1,
"sender" : A,
"message", "오늘 날씨가 좋네요."
}
해당 메시지를 보냈을 때, @MessageMapping 메서드에서 해당 DTO에서 sender 정보를 가져와 채팅방 owner 정보와 비교한다.
이때 owner == sender라면 메시지를 전송하지 않고 메서드를 종료시킨다.
만약 A가 채팅방 생성자가 아닐 경우 해당 메시지는 모두에게 전달된다.
이제 채팅방 생성자가 자신의 채팅방에서 채팅할 수 없다!
이제 채팅과 관련된 다른 기능에 대해 고민해보는 시간을 가질 것이다. ᐝ҉*(ˆ. ̫ . ˆ)