์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ RN์ผ๋ก ์ฑํ ์ ๊ตฌํ ์ค์ด๋ค
์ผ๋จ ํด๋ผ์ด์ธํธ์์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ธ ์น์์ผ ์ฐ๊ฒฐ์ ๊ตฌํํด๋ดค๋ค
์ฐ์ ์น์์ผ ์ฐ๊ฒฐ์ ์ํ WebSocketProvider๋ฅผ ๋ง๋ค์ด์ ์ฑํ ๋ฐฉ์ ๊ฐ์ธ์คฌ์ต๋๋ค.
์น์์ผ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ํจ์๋ก ๋ง๋ค๊น ํ๋ค๊ฐ ์ด์ฐจํผ ํ๋์ ์น์์ผ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ์์ฑํ์ต๋๋ค.
useMemo๋ฅผ ์ฌ์ฉํด์ ํ ํฐ์ด ์ ๋ฐ์ดํธ ๋์์ ๋ ์๋ก์ด ์น์์ผ์ ์์ฑํฉ๋๋ค.
WebSocketContext๋ฅผ ์ฌ์ฉํด์ ์ฑํ ๋ฐฉ์์ ์น์์ผ์ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
import {tokenState} from '@/store/loginAtom';
import React, {createContext, useMemo} from 'react';
import {useRecoilValue} from 'recoil';
type Props = {
children: React.ReactNode;
};
export const WebSocketContext = createContext<WebSocketClient | null>(null);
export const WebSocketProvider = ({children}: Props) => {
const token = useRecoilValue(tokenState);
const webSocket = useMemo(() => {
if (!token) return null;
return new WebSocketClient(token.accessToken);
}, [token]);
return (
<WebSocketContext.Provider value={webSocket}>
{children}
</WebSocketContext.Provider>
);
};
export default WebSocketProvider;
WebSocketClient ํด๋์ค๋ ๊ฐ๋จํฉ๋๋ค.
class WebSocketClient {
socket: WebSocket | null = null;
token = '';
pingInterval: NodeJS.Timeout | null = null;
//์์ฑ์์์ ํ ํฐ์ ์ ์ฅํ๊ณ ์น์์ผ ์ฐ๊ฒฐ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค
constructor(token: string) {
this.token = token;
this.socket = this.connectWebSocket();
}
//์น์์ผ ์ฐ๊ฒฐ ๋ฉ์๋
connectWebSocket = () => {
const socket = new WebSocket(
`์์ฒญ uri?authorization=${this.token}`,
);
//์น์์ผ์ด ์ฐ๊ฒฐ๋๋ฉด ํ์ ์ค์ ํฉ๋๋ค
socket.onopen = () => {
console.log('WebSocket connected');
this.startPing();
};
//์น์์ผ์ด ๋๊ฒผ์ ๊ฒฝ์ฐ, ์ฌ์ฐ๊ฒฐํฉ๋๋ค
socket.onclose = () => {
console.log('WebSocket connection closed');
this.reconnect();
};
//๋ฐ์ ๋ฉ์์ง๋ฅผ handleMessage๋ฉ์๋๋ก ๋๊ฒจ์ค๋๋ค
socket.onmessage = e => {
this.handleMessage(e);
};
//์๋ฌ๋ก ์ฐ๊ฒฐ์ด ๋๊ฒผ์ ๊ฒฝ์ฐ, ์ฌ์ฐ๊ฒฐํฉ๋๋ค
socket.onerror = err => {
console.error('WebSocket error:', err);
this.reconnect();
};
return socket;
};
//ํ ๋ฉ์๋, ๋ง์ง๋ง ์์ฒญ์ผ๋ก๋ถํฐ 30์ด๊ฐ ์ฐ๊ฒฐ์ด ์ง์๋๊ธฐ ๋๋ฌธ์ 25์ด ๊ฐ๊ฒฉ์ผ๋ก ํ
startPing = () => {
this.pingInterval = setInterval(() => {
if (this.socket) {
this.socket.send(
JSON.stringify(ํ๋ฉ์์ง๊ฐ ๋ค์ด๊ฐ ๊ณณ),
);
}
}, 25000);
};
//ํ ์ธํฐ๋ฒ ์ด๋ฒคํธ๋ฅผ ํด๋ฆฌ์ด ํ๋ ๋ฉ์๋
stopPing = () => {
if (this.pingInterval) {
clearInterval(this.pingInterval);
this.pingInterval = null;
}
};
//์ฌ์ฐ๊ฒฐ ๋ฉ์๋
reconnect = () => {
console.log('Reconnecting...');
this.stopPing();
setTimeout(() => {
this.connectWebSocket();
}, 300);
};
//์์ ๋ฉ์์ง ํธ๋ค ๋ฉ์๋
handleMessage = (event: WebSocketMessageEvent) => {
const parse = JSON.parse(event.data);
console.log(parse);
//๋ฉ์์ง ์์์ ํธ๋ค
};
//๋ฉ์์ง ์ ์ก ๋ฉ์๋
//์น์์ผ์ด ์ฐ๊ฒฐ๋ ์ํ์์๋ง ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค
sendMessage = (roomId: number, content: string) => {
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
const message = JSON.stringify({action: 'TEXT', roomId, content});
this.socket.send(message);
} else {
console.error('WebSocket is not connected');
}
};
}
์ฌ์ค ์น์์ผ ํต์ ์ด ์ ๋์ง๋์ง๋ง ํ์ธํ๊ฑฐ๋ผ์ ์์ง ๊ฐ ๊ธธ์ด ๋ฉ๋ค...
ํ์์๊ฒ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ธฐ ์ ์ด๋ผ์ ์๋ง ์์ ๋์ง ์์๊น ์ถ๋ค..
์ฑํ ํผ๋ธ๋ฆฌ์ฑ์ ๋ค ํ๊ณ ๋๋ฉด ๋จธ๋ฆฌ๊ฐ ์ํ ๊ฒ ๊ฐ๋ค...
์ฑํ ๋ฉ์์ง๋ค์ ๋ก์ปฌ์ ์ ์ฅํ๊ณ FCM ์ฒ๋ฆฌ๋ ํด์ผ ํ๊ณ ,,
์ธ์ ๋คํ์ง ใ ใ ใ
'๐ป ํ๋ก ํธ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React Native - ์น๋ทฐ ํต์ ๊ตฌํ(TypeScript) (0) | 2024.01.27 |
---|---|
Next scss ์ ์ญ๋ณ์ ์ ์ฉํ๊ธฐ (0) | 2024.01.17 |
CSS ์์ ์์๊ฐ focus ๋ ๋ ๋ถ๋ชจ ์์ ํจ๊ณผ ์ฃผ๊ธฐ (2) | 2024.01.08 |
React Native์ React ์ปดํฌ๋ํธ ์ฐจ์ด (2) | 2024.01.08 |
CSS ์ ๋๋ฉ์ด์ ์ฑ๋ฅ ๊ฐ์ (0) | 2024.01.08 |