Skip to content

Commit 625280c

Browse files
committed
refactor: Controller에서 Redis 의존 제거
1 parent c1a1879 commit 625280c

2 files changed

Lines changed: 47 additions & 20 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/chats/controller/ChatMessageController.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
package com.back.web7_9_codecrete_be.domain.chats.controller;
22

33
import java.security.Principal;
4-
import java.time.Duration;
54
import java.util.Map;
65

7-
import org.springframework.data.redis.core.RedisTemplate;
86
import org.springframework.messaging.handler.annotation.MessageMapping;
97
import org.springframework.messaging.handler.annotation.Payload;
10-
import org.springframework.security.core.Authentication;
118
import org.springframework.stereotype.Controller;
129

1310
import com.back.web7_9_codecrete_be.domain.chats.dto.request.ChatMessageRequest;
1411
import com.back.web7_9_codecrete_be.domain.chats.service.ChatMessageService;
15-
import com.back.web7_9_codecrete_be.global.security.CustomUserDetail;
16-
import com.back.web7_9_codecrete_be.global.websocket.ServerInstanceId;
1712

1813
import lombok.RequiredArgsConstructor;
1914
import lombok.extern.slf4j.Slf4j;
@@ -24,7 +19,6 @@
2419
public class ChatMessageController {
2520

2621
private final ChatMessageService chatMessageService;
27-
private final RedisTemplate<String, Object> redisTemplate;
2822

2923
@MessageMapping("/chat/send")
3024
public void send(ChatMessageRequest message, Principal principal) {
@@ -33,17 +27,7 @@ public void send(ChatMessageRequest message, Principal principal) {
3327
throw new IllegalStateException("Unauthenticated WebSocket access");
3428
}
3529

36-
CustomUserDetail userDetail = (CustomUserDetail)
37-
((Authentication) principal).getPrincipal();
38-
39-
Long userId = userDetail.getUser().getId();
40-
41-
String sessionSetKey =
42-
"chat:server:" + ServerInstanceId.ID + ":user:" + userId + ":sessionIds";
43-
44-
redisTemplate.expire(sessionSetKey, Duration.ofHours(2));
45-
46-
chatMessageService.sendMessage(message, principal);
30+
chatMessageService.handleSend(message, principal);
4731
}
4832

4933
@MessageMapping("/chat/status")

src/main/java/com/back/web7_9_codecrete_be/domain/chats/service/ChatMessageService.java

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.back.web7_9_codecrete_be.domain.chats.service;
22

33
import java.security.Principal;
4+
import java.time.Duration;
45
import java.time.LocalDateTime;
56

67
import org.springframework.data.redis.core.RedisTemplate;
78
import org.springframework.messaging.simp.SimpMessagingTemplate;
9+
import org.springframework.security.core.Authentication;
810
import org.springframework.stereotype.Service;
911

1012
import com.back.web7_9_codecrete_be.domain.chats.dto.request.ChatMessageRequest;
1113
import com.back.web7_9_codecrete_be.domain.chats.dto.response.ChatMessageResponse;
1214
import com.back.web7_9_codecrete_be.domain.chats.dto.response.ChatUserCache;
1315
import com.back.web7_9_codecrete_be.domain.chats.repository.ChatStreamRepository;
16+
import com.back.web7_9_codecrete_be.global.security.CustomUserDetail;
1417
import com.back.web7_9_codecrete_be.global.websocket.ChatCountBroadcaster;
18+
import com.back.web7_9_codecrete_be.global.websocket.ServerInstanceId;
1519

1620
import lombok.RequiredArgsConstructor;
1721
import lombok.extern.slf4j.Slf4j;
@@ -28,9 +32,29 @@ public class ChatMessageService {
2832
private final RedisTemplate<String, Object> redisTemplate;
2933
private final ChatCountBroadcaster chatCountBroadcaster;
3034

31-
public void sendMessage(ChatMessageRequest request, Principal principal) {
35+
/**
36+
* 채팅 메시지 전송 + 세션 TTL 갱신
37+
*/
38+
public void handleSend(ChatMessageRequest request, Principal principal) {
3239

33-
String email = principal.getName();
40+
if (!(principal instanceof Authentication authentication)) {
41+
throw new IllegalStateException("Unauthenticated WebSocket access");
42+
}
43+
44+
CustomUserDetail userDetail =
45+
(CustomUserDetail) authentication.getPrincipal();
46+
47+
Long userId = userDetail.getUser().getId();
48+
49+
extendUserSessionTtl(userId);
50+
51+
sendMessage(request, userDetail.getUsername());
52+
}
53+
54+
/**
55+
* 실제 메시지 저장 + 브로드캐스트
56+
*/
57+
private void sendMessage(ChatMessageRequest request, String email) {
3458

3559
ChatUserCache chatUser = chatUserCacheService.getChatUser(email);
3660

@@ -42,8 +66,10 @@ public void sendMessage(ChatMessageRequest request, Principal principal) {
4266
LocalDateTime.now()
4367
);
4468

45-
log.info("[SEND MESSAGE] From User ID: {}, Content: {}", chatUser.getUserId(), request.getContent());
69+
log.info("[SEND MESSAGE] From User ID: {}, Content: {}",
70+
chatUser.getUserId(), request.getContent());
4671

72+
// Redis Stream 저장
4773
chatStreamRepository.save(response);
4874

4975
// WebSocket 브로드캐스트
@@ -53,6 +79,23 @@ public void sendMessage(ChatMessageRequest request, Principal principal) {
5379
);
5480
}
5581

82+
/**
83+
* 유저 세션 TTL 연장
84+
*/
85+
private void extendUserSessionTtl(Long userId) {
86+
87+
String sessionSetKey =
88+
"chat:server:" + ServerInstanceId.ID + ":user:" + userId + ":sessionIds";
89+
90+
redisTemplate.expire(sessionSetKey, Duration.ofHours(2));
91+
92+
log.debug("[CHAT TTL] session TTL extended: userId={}, key={}", userId, sessionSetKey);
93+
}
94+
95+
96+
/**
97+
* 채팅방 접속자 수 브로드캐스트
98+
*/
5699
public void broadcastUserCount(Long concertId) {
57100

58101
String key = "chat:concert:" + concertId + ":users";

0 commit comments

Comments
 (0)