daangn-daangn / daangn-server

🥕당근 서버 리포지토리🥕
4 stars 2 forks source link

채팅 API 개발 #31

Closed cotchan closed 2 years ago

cotchan commented 2 years ago

채팅 API 개발

목차

  1. 이슈1: 채팅 DB 설계
    • chat_rooms 도메인
    • participants 도메인
  2. 이슈2: 채팅방 메시지 보내기/받기
    • WebSocketConfig
    • MessageSender
  3. 이슈3: 채팅메시지로 이미지 보낼 수 있도록 하기

이슈1: 채팅 DB 설계

스크린샷 2022-07-26 오후 6 10 01

chat_rooms 도메인

{
  "_id": {},
  "product_id": 3,
  "product_image": "c14sdf2d-0c8c-44fb-a87e-8a7afe4fbb27product1.jpg",
  "first_user_id": 3,
  "second_user_id": 6,
  "identifier": "1-6",
  "chat_messages": [
    {
      "senderId": 1,
      "messageType": 1,
      "message": "테스트 메시지 입니다",
      "createdAt": 1656320454630
    },
    {
      "senderId": 6,
      "messageType": 3,
      "imgUrls": [
        "c16de0a7-0c8c-44fb-a87e-8a7afe4fbb27test1.jpg",
        "fc0a2cf6-2c88-4fae-bf1b-0f96481606dftest2.png",
        "6b06d600-52a8-40f1-a328-4f6cb3df615dtest3.jpg",
        "3d6e58d2-ff68-40e0-81f0-c5df4c2aeb37하이.jpg",
        "21debba4-d5a5-4f4a-a9a9-4c17bbab4ce5바이.png"
      ],
      "createdAt": 1656319631641
    },
    {
      "senderId": 1,
      "messageType": 2,
      "message": "123,456",
      "createdAt": 1656321431112
    }
  ],
  "created_at": 1656319631641,
  "updated_at": 1656321433608
}

participants 도메인

{
  "_id": {},
  "user_id": 3,
  "chat_room_id": "62b96d2844b3907e8fb28a2d",
  "read_message_size": 10,
  "out": false,
  "created_at": 1656319272618,
  "updated_at": 1656321433608
}

이슈2: 채팅방 메시지 보내기/받기

또한 아래 링크를 참고하여 React의 SockJsClient를 사용해서 React와 연동할 수 있는 방법 리서치

그래서 chat-server에 WebSocketConfig, MessageSender를 정의하고 Spring Data Mongo를 사용하여 '채팅방 메시지 보내기/받기' 기능 완성

WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-chat")
                .setAllowedOrigins("http://localhost:3000")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic");
    }
}

MessageSender

@Slf4j
@Service
@RequiredArgsConstructor
public class MessageSender {

    private final SimpMessagingTemplate template;

    public void send(CreateRequest message) {
        try {
            template.convertAndSend("/topic/chat/" + message.getRoomId(), message);
        } catch (MessagingException e) {
            log.warn("MessageSender send error occurred with roomId: {}", message.getRoomId(), e);
        }
    }
}

이슈3: 채팅메시지로 이미지 보낼 수 있도록 하기

해당 이슈는 아래에 정리하였습니다 :)