From 898db48deb915ad225026d4303fb4a77d248f9b4 Mon Sep 17 00:00:00 2001 From: Jae-HyeokKim Date: Tue, 26 Aug 2025 16:20:27 +0900 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=20=EB=A1=9C=EC=A7=81=20=EB=94=94=EB=B2=84=EA=B9=85=20?= =?UTF-8?q?(#78)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/bus/ChatRedisPublisher.java | 2 +- .../domain/chat/bus/ChatRedisSubscriber.java | 2 +- .../domain/chat/bus/RedisPubSubConfig.java | 2 +- .../chat/controller/ChatMessagingController.java | 12 ++++++++---- .../chat/controller/ChatNotificationController.java | 10 ++++++---- .../service/Impl/ChatNotificationServiceImpl.java | 9 ++++++--- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisPublisher.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisPublisher.java index 97c6ab1..28164b1 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisPublisher.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisPublisher.java @@ -8,7 +8,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; -@Component +//@Component // Redis 방식 비활성화 @RequiredArgsConstructor public class ChatRedisPublisher { diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisSubscriber.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisSubscriber.java index 26b9c86..5de21cd 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisSubscriber.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/ChatRedisSubscriber.java @@ -9,7 +9,7 @@ import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; -@Component +//@Component // Redis 방식 비활성화 @RequiredArgsConstructor public class ChatRedisSubscriber implements MessageListener { diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/RedisPubSubConfig.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/RedisPubSubConfig.java index 955d43b..442bce9 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/RedisPubSubConfig.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/bus/RedisPubSubConfig.java @@ -7,7 +7,7 @@ import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -@Configuration +//@Configuration // Redis 방식 비활성화 @RequiredArgsConstructor public class RedisPubSubConfig { diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatMessagingController.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatMessagingController.java index c8cd91c..800c2eb 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatMessagingController.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatMessagingController.java @@ -4,7 +4,7 @@ import java.security.Principal; import java.util.Map; import java.util.UUID; -import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; +//import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; import likelion.mlb.backendProject.domain.chat.dto.ChatSendRequest; import likelion.mlb.backendProject.domain.chat.repository.ChatMembershipRepository; import lombok.RequiredArgsConstructor; @@ -23,7 +23,7 @@ public class ChatMessagingController { private final ChatMessageService chatMessageService; private final SimpMessagingTemplate messagingTemplate; private final ChatMembershipRepository membershipRepository; - private final ChatRedisPublisher chatRedisPublisher; + //private final ChatRedisPublisher chatRedisPublisher; @MessageMapping("/chat/{roomId}/send") @@ -55,7 +55,11 @@ public void send(@DestinationVariable UUID roomId, "createdAt", saved.getCreatedAt().toString() ); - - chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); + // Redis 대신 직접 WebSocket으로 전송 (즉시 전달) + String topic = "/topic/chat/" + roomId; + messagingTemplate.convertAndSend(topic, payload); + + // Redis 방식 (주석처리 - 지연 발생) + //chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); } } diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatNotificationController.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatNotificationController.java index d8cc8c4..e8e1481 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatNotificationController.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/controller/ChatNotificationController.java @@ -5,7 +5,7 @@ * */ import java.util.Map; import java.util.UUID; -import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; +//import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; import likelion.mlb.backendProject.domain.chat.service.ChatMessageService; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -21,7 +21,7 @@ public class ChatNotificationController { private final SimpMessagingTemplate messagingTemplate; - private final ChatRedisPublisher chatRedisPublisher; + //private final ChatRedisPublisher chatRedisPublisher; // Redis 방식 비활성화 private final ChatNotificationService notificationService; private final ChatMessageService chatMessageService; // 디버그용 @@ -41,7 +41,7 @@ public ResponseEntity> roomAlert( var saved = chatMessageService.saveSystemAlert(roomId, text); // DB 저장 - // ✅ STOMP 브로드캐스트 + Redis fan-out + // ✅ 직접 WebSocket으로 브로드캐스트 (즉시 전송) Map payload = Map.of( "id", saved.getId().toString(), "chatRoomId", roomId.toString(), @@ -50,7 +50,9 @@ public ResponseEntity> roomAlert( "createdAt", saved.getCreatedAt().toString() ); messagingTemplate.convertAndSend("/topic/chat/" + roomId, payload); - chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); + + // Redis 방식 (주석처리 - 지연 발생) + //chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); return ResponseEntity.ok(Map.of("ok", true, "id", saved.getId().toString())); } diff --git a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/service/Impl/ChatNotificationServiceImpl.java b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/service/Impl/ChatNotificationServiceImpl.java index 3a3832a..2ca18b2 100644 --- a/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/service/Impl/ChatNotificationServiceImpl.java +++ b/backendProject/src/main/java/likelion/mlb/backendProject/domain/chat/service/Impl/ChatNotificationServiceImpl.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.UUID; -import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; +//import likelion.mlb.backendProject.domain.chat.bus.ChatRedisPublisher; import likelion.mlb.backendProject.domain.chat.entity.ChatMessage; import likelion.mlb.backendProject.domain.chat.repository.AlertRoutingRepository; import likelion.mlb.backendProject.domain.chat.repository.ChatMessageRepository; @@ -28,7 +28,7 @@ public class ChatNotificationServiceImpl implements ChatNotificationService { private final ChatMessageRepository chatMessageRepository; private final ChatMessageService chatMessageService; private final SimpMessagingTemplate messagingTemplate; - private final ChatRedisPublisher chatRedisPublisher; + //private final ChatRedisPublisher chatRedisPublisher; // Redis 방식 비활성화 /** * LiveDataService에서 바로 호출 (현재 트랜잭션 커밋 후에 실행되도록 지연) @@ -77,6 +77,7 @@ protected void doDispatch(UUID playerId, // ✅ 서비스 경유 저장: AFTER_COMMIT 색인(ES)까지 자동 수행 var saved = chatMessageService.saveSystemAlert(roomId, msgText); + // ✅ 직접 WebSocket으로 전송 (즉시 전달) var payload = Map.of( "id", saved.getId().toString(), "chatRoomId", roomId.toString(), @@ -85,7 +86,9 @@ protected void doDispatch(UUID playerId, "createdAt", saved.getCreatedAt().toString() ); messagingTemplate.convertAndSend("/topic/chat/" + roomId, payload); - chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); + + // Redis 방식 (주석처리 - 지연 발생) + //chatRedisPublisher.publishToRoom(roomId, new java.util.HashMap<>(payload)); } }