240306 TIL - 2차 프로젝트(고도화 | DTO 사용, 송신자와 수신자 UI 구분)

jkeum·2024년 3월 6일
0

TECHIT-BackendSchool

목록 보기
49/50
post-thumbnail

웹소켓 연결이 2번?

메시지를 전송하면 화면에 2개씩 뜬다.
내가 뭔가 잘못 설정한 게 있는지 어제 한참 찾아봤었는데, 개발 환경에서는 원래 그런 것이었다.
useEffect를 쓰면 개발 환경에서는 자동으로 2번 호출된다고 한다.
개발자의 실수를 막기 위해 그렇게 설정되어 있고, 설정을 끌 수도 있다고는 한다.

메시지 송수신 시 DTO 사용

프론트엔드에서 보내는 chatMessage 객체와 백엔드의 Message 엔티티 간 필드가 일치하지 않을 수 있다.
그런 경우가 아니더라도 DTO를 사용하면 좋을 것 같기도 하다.
아무튼 이럴 때 형식에 맞게 처리하기 위해 DTO를 사용할 수 있다.
DTO로 받은 데이터를 백엔드에서 적절히 처리해서 Message 데이터를 저장하면 된다.
프론트엔드에 데이터를 전송할 때도 DTO를 사용한다.
필요한 정보만 포함해서 구성할 수 있다.

@Getter
@AllArgsConstructor
@NoArgsConstructor(access = PRIVATE)
public class ChatMessageRequest {
	private String content;
	private String sender;
}
@Getter
@RequiredArgsConstructor(access = PRIVATE)
public class ChatMessageResponse {
	private final String content;
	private final String sender;
	private final LocalDateTime timestamp;

	public static ChatMessageResponse of(final Message message) {
		return new ChatMessageResponse(
				message.getMessageText(),
				message.getSender().getNickname(),
				message.getCreatedAt()
		);
	}
}
@Transactional
public ChatMessageResponse saveMessage(final Long roomId, final ChatMessageRequest chatMessageRequest) {
	ChatRoom chatRoom = chatRoomRepository.findById(roomId).orElseThrow(() -> new ChatException(NOT_FOUND_CHATROOM_ID));

	Member sender = memberRepository.findByNickname(chatMessageRequest.getSender()).orElseThrow(() -> new AuthException(INVALID_AUTHORITY));

	Message message = new Message(
			chatRoom,
			sender,
			chatMessageRequest.getContent()
	);

	Message messageResult = messageRepository.save(message);

	return ChatMessageResponse.of(messageResult);
}

송신자와 수신자 메시지 구분

연락하는 상대 정보 가져오기

현재 채팅방 정보를 불러와서 현재 유저 정보와 비교하면 연락하는 상대를 알 수 있다.
현재 채팅방 데이터를 가져오기 위해 사용자 정의 훅을 생성했다.

메시지 전송 시간

메시지 전송 시간을 표시하기 위해 메시지가 저장된 후 생성되는 createdAt 필드를 사용하기로 했다.
따라서 메시지를 전송하는 함수(sendMessage)에 있는 setMessages를 제거했다.
서버로부터 메시지를 수신하는 부분에서만 setMessages를 사용해서 메시지 상태를 업데이트하게 변경했다.

profile
It's me, jkeum!

0개의 댓글

관련 채용 정보