Skip to content

Commit 4a067c5

Browse files
juyeong-sse030
andauthored
Refactor/#287-S : 소켓 상태 관리 리팩토링 - 다른 워크스페이스 접속 시 이전 연결 끊기 리팩토링 (#288)
* refactor : useSocket 소켓 관리 로직 변경 - socket을 ref로 관리 - useEffect 내에서 소켓을 할당하고, 언마운트 시에 disconnect 시킴 * chore : 소켓 조건문 early return 방식으로 변경 Co-authored-by: Seyoung Kim <[email protected]>
1 parent ed9aef3 commit 4a067c5

File tree

2 files changed

+22
-28
lines changed

2 files changed

+22
-28
lines changed

client/src/components/Workspace/index.tsx

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import Mom from 'components/Mom';
22
import Sidebar from 'components/Sidebar';
33
import { useEffect, useState } from 'react';
44
import { useParams } from 'react-router-dom';
5-
import { Socket } from 'socket.io-client';
65
import { getWorkspaceInfo } from 'src/apis/workspace';
76
import MeetingMediaBar from 'src/components/MeetingMediaBar';
87
import SOCKET_MESSAGE from 'src/constants/socket-message';
@@ -20,8 +19,8 @@ function Workspace() {
2019
const [workspace, setWorkspace] = useState<WorkspaceInfo | null>(null);
2120
const [selectedMom, setSelectedMom] = useState<TMom | null>(null);
2221

23-
const [momSocket, setMomSocket] = useState<Socket | null>(null);
24-
const [workspaceSocket, setWorkspaceSocket] = useState<Socket | null>(null);
22+
const momSocket = useSocket(`/sc-workspace/${id}`);
23+
const workspaceSocket = useSocket(`/workspace/${id}`);
2524

2625
const loadWorkspaceInfo = async () => {
2726
if (id) {
@@ -34,28 +33,8 @@ function Workspace() {
3433
};
3534

3635
useEffect(() => {
37-
setMomSocket((prev) => {
38-
prev?.disconnect();
39-
return useSocket(`/sc-workspace/${id}`);
40-
});
41-
setWorkspaceSocket((prev) => {
42-
prev?.disconnect();
43-
return useSocket(`/workspace/${id}`);
44-
});
45-
4636
loadWorkspaceInfo();
4737
setIsOnGoing(false);
48-
49-
return () => {
50-
setMomSocket((prev) => {
51-
prev?.disconnect();
52-
return null;
53-
});
54-
setWorkspaceSocket((prev) => {
55-
prev?.disconnect();
56-
return null;
57-
});
58-
};
5938
}, [id]);
6039

6140
useEffect(() => {
@@ -77,7 +56,9 @@ function Workspace() {
7756
};
7857
}, [workspaceSocket]);
7958

80-
return momSocket !== null && workspaceSocket !== null ? (
59+
if (!momSocket || !workspaceSocket) return <></>;
60+
61+
return (
8162
<SocketContext.Provider value={{ momSocket, workspaceSocket }}>
8263
<MeetingContext.Provider value={{ isOnGoing, setIsOnGoing }}>
8364
{workspace && (
@@ -89,8 +70,6 @@ function Workspace() {
8970
{isOnGoing && <MeetingMediaBar />}
9071
</MeetingContext.Provider>
9172
</SocketContext.Provider>
92-
) : (
93-
<></>
9473
);
9574
}
9675

client/src/hooks/useSocket.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
1-
import { io } from 'socket.io-client';
1+
import { useEffect, useRef } from 'react';
2+
import { io, Socket } from 'socket.io-client';
23
import env from 'src/config';
34

45
export default function useSocket(namespace: string) {
56
// TODO: http://example.com/ 까지만 나타내는 환경변수로 SERVER_URL 사용.
67
// SERVER_PATH 환경변수(http://example.com/api)와 겹치는 부분이 있으므로 리팩토링 필요
78
// TODO: '/ws' 부분을 환경변수로 관리하기. 위 리팩토링 진행시 같이 진행 필요
8-
return io(`${env.SERVER_URL}${namespace}`, { path: '/ws' });
9+
const socket = useRef<Socket>();
10+
11+
useEffect(() => {
12+
const ioSocket = io(`${env.SERVER_URL}${namespace}`, { path: '/ws' });
13+
socket.current = ioSocket;
14+
15+
return () => {
16+
if (socket.current) {
17+
socket.current.disconnect();
18+
socket.current = undefined;
19+
}
20+
};
21+
}, [namespace]);
22+
23+
return socket.current;
924
}

0 commit comments

Comments
 (0)