diff --git a/src/main/java/org/swyp/linkit/domain/chat/service/ChatRoomService.java b/src/main/java/org/swyp/linkit/domain/chat/service/ChatRoomService.java index 1ba82847..0f5fcb49 100644 --- a/src/main/java/org/swyp/linkit/domain/chat/service/ChatRoomService.java +++ b/src/main/java/org/swyp/linkit/domain/chat/service/ChatRoomService.java @@ -9,6 +9,7 @@ import org.swyp.linkit.domain.chat.entity.ChatRoom; import org.swyp.linkit.domain.chat.entity.ChatRoomDelete; import org.swyp.linkit.domain.chat.entity.ChatRoomStatus; +import org.swyp.linkit.domain.chat.entity.MessageType; import org.swyp.linkit.domain.chat.repository.ChatMessageRepository; import org.swyp.linkit.domain.chat.repository.ChatRoomDeleteRepository; import org.swyp.linkit.domain.chat.repository.ChatRoomRepository; @@ -86,7 +87,7 @@ public List findRoomsByUserId(Long userId) { ChatMessage lastMessage = (ChatMessage) row[1]; // 마지막 메시지 내용 - String lastMessageContent = lastMessage != null ? lastMessage.getContent() : null; + String lastMessageContent = lastMessage != null ? resolveLastMessageContent(lastMessage) : null; // 상대방 정보 (연관관계로 바로 접근) boolean isMentor = room.getMentorId().equals(userId); @@ -120,7 +121,7 @@ public ChatRoomDto findDtoById(Long roomId, Long currentUserId) { String lastMessageContent = null; if (room.getLastMessageId() != null) { lastMessageContent = chatMessageRepository.findById(room.getLastMessageId()) - .map(ChatMessage::getContent) + .map(this::resolveLastMessageContent) .orElse(null); } @@ -180,6 +181,13 @@ public boolean isMentor(ChatRoom room, Long userId) { // === Private Helper Methods === + private String resolveLastMessageContent(ChatMessage message) { + if (message.getMessageType() == MessageType.IMAGE) { + return "[이미지]"; + } + return message.getContent(); + } + private User findUserById(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException("User not found: " + userId)); diff --git a/src/main/java/org/swyp/linkit/domain/notification/service/NotificationServiceImpl.java b/src/main/java/org/swyp/linkit/domain/notification/service/NotificationServiceImpl.java index 1a18694a..7963a0ff 100644 --- a/src/main/java/org/swyp/linkit/domain/notification/service/NotificationServiceImpl.java +++ b/src/main/java/org/swyp/linkit/domain/notification/service/NotificationServiceImpl.java @@ -69,7 +69,7 @@ public NotificationDto createNotification(Long receiverId, Long senderId, Notifi Notification savedNotification = notificationRepository.save(notification); // WebSocket 실시간 알림 발송 - String senderNickname = sender != null ? sender.getNickname() : "시스템"; + String senderNickname = resolveNickname(sender); String message = generateNotificationMessage(type, senderNickname); publishNotificationToRedis(savedNotification, senderNickname, message); @@ -154,8 +154,10 @@ public NotificationListResponseDto getNotifications(Long userId) { Map nicknameMap = senderIds.isEmpty() ? Collections.emptyMap() : userRepository.findAllById(senderIds).stream() - .collect(Collectors.toMap(User::getId, - u -> u.getNickname() != null ? u.getNickname() : "시스템")); + .collect(Collectors.toMap( + User::getId, + u -> hasValidNickname(u) ? u.getNickname() : "알 수 없음", + (existing, replacement) -> existing)); List notificationDtos = combinedNotifications.stream() .map(n -> { @@ -240,6 +242,18 @@ public int markAllAsRead(Long userId) { // ===== Private Methods ===== + /** + * sender가 null이면 "시스템", 존재하지만 닉네임이 없으면 "알 수 없음" + */ + private String resolveNickname(User sender) { + if (sender == null) return "시스템"; + return hasValidNickname(sender) ? sender.getNickname() : "알 수 없음"; + } + + private boolean hasValidNickname(User user) { + return user.getNickname() != null && !user.getNickname().isBlank(); + } + private User findUserById(Long userId) { return userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); diff --git a/src/main/java/org/swyp/linkit/global/config/RedisConfig.java b/src/main/java/org/swyp/linkit/global/config/RedisConfig.java index 04c3acbd..9f8e3f09 100644 --- a/src/main/java/org/swyp/linkit/global/config/RedisConfig.java +++ b/src/main/java/org/swyp/linkit/global/config/RedisConfig.java @@ -8,12 +8,14 @@ import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.swyp.linkit.domain.chat.redis.RedisChatSubscriber; +import org.swyp.linkit.domain.notification.redis.RedisNotificationSubscriber; @Profile("!test") @Configuration public class RedisConfig { private static final String CHAT_CHANNEL_PATTERN = "chat:room:*"; + private static final String NOTIFICATION_CHANNEL_PATTERN = "notification:user:*"; @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) { @@ -23,11 +25,13 @@ public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connection @Bean public RedisMessageListenerContainer redisMessageListenerContainer( RedisConnectionFactory connectionFactory, - RedisChatSubscriber redisChatSubscriber) { + RedisChatSubscriber redisChatSubscriber, + RedisNotificationSubscriber redisNotificationSubscriber) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(redisChatSubscriber, new PatternTopic(CHAT_CHANNEL_PATTERN)); + container.addMessageListener(redisNotificationSubscriber, new PatternTopic(NOTIFICATION_CHANNEL_PATTERN)); return container; } } \ No newline at end of file