Skip to content

Commit a2dc4bd

Browse files
committed
Feat: WebSocket 이벤트 리스너 추가
1 parent 2a1e9ed commit a2dc4bd

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.back.global.websocket.event;
2+
3+
import com.back.global.exception.CustomException;
4+
import com.back.global.security.CustomUserDetails;
5+
import com.back.global.websocket.service.WebSocketSessionManager;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.context.event.EventListener;
9+
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
10+
import org.springframework.security.core.Authentication;
11+
import org.springframework.stereotype.Component;
12+
import org.springframework.web.socket.messaging.SessionConnectEvent;
13+
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
14+
15+
import java.net.http.WebSocket;
16+
17+
@Slf4j
18+
@Component
19+
@RequiredArgsConstructor
20+
public class WebSocketEventListener {
21+
22+
private final WebSocketSessionManager sessionManager;
23+
24+
// WebSocket 연결 이벤트 처리 - 세션 매니저에 사용자 세션 등록
25+
@EventListener
26+
public void handleWebSocketConnectListener(SessionConnectEvent event) {
27+
try {
28+
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
29+
30+
// 인증된 사용자 정보 추출
31+
Authentication auth = (Authentication) headerAccessor.getUser();
32+
if (auth != null && auth.getPrincipal() instanceof CustomUserDetails userDetails) {
33+
34+
String sessionId = headerAccessor.getSessionId();
35+
Long userId = userDetails.getUserId();
36+
37+
// 세션 매니저에 등록 (TTL 10분 자동 설정)
38+
sessionManager.addSession(userId, sessionId);
39+
40+
log.info("WebSocket 연결 완료 - 사용자: {} ({}), 세션: {}",
41+
userDetails.getUsername(), userId, sessionId);
42+
43+
} else {
44+
log.warn("인증되지 않은 WebSocket 연결 시도 - 세션: {}", headerAccessor.getSessionId());
45+
}
46+
47+
} catch (CustomException e) {
48+
log.error("WebSocket 연결 처리 실패: {}", e.getMessage());
49+
} catch (Exception e) {
50+
log.error("WebSocket 연결 처리 중 예상치 못한 오류 발생", e);
51+
}
52+
}
53+
54+
// WebSocket 연결 해제 이벤트 처리 - 세션 매니저에서 사용자 세션 제거
55+
@EventListener
56+
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
57+
try {
58+
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
59+
String sessionId = headerAccessor.getSessionId();
60+
61+
// 세션 매니저에서 제거 (방 퇴장 처리도 자동 수행)
62+
sessionManager.removeSession(sessionId);
63+
64+
log.info("WebSocket 연결 해제 완료 - 세션: {}", sessionId);
65+
66+
} catch (CustomException e) {
67+
log.error("WebSocket 연결 해제 처리 실패: {}", e.getMessage());
68+
} catch (Exception e) {
69+
log.error("WebSocket 연결 해제 처리 중 예상치 못한 오류 발생", e);
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)