๐Ÿ“ก 65. React Native์—์„œ WebSocket ์‚ฌ์šฉํ•ด ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ

JM_Devยท2025๋…„ 7์›” 30์ผ
0
post-thumbnail

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ์ฑ„ํŒ…, ์•Œ๋ฆผ, ๊ฒŒ์ž„, ๋ผ์ด๋ธŒ ์—…๋ฐ์ดํŠธ ๋“ฑ์—์„œ ํ•ต์‹ฌ์ด๋‹ค.
React Native์—์„œ WebSocket์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”
๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์˜ˆ์ œ๋ฅผ ์ •๋ฆฌํ•ด๋ดค๋‹ค. ๐Ÿš€


๐Ÿ”Œ 1. WebSocket์ด๋ž€?

  • HTTP์ฒ˜๋Ÿผ ์š”์ฒญ/์‘๋‹ต ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ,
    ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ์ง€์† ์—ฐ๊ฒฐ ํ”„๋กœํ† ์ฝœ
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • ์ฑ„ํŒ…, ์•Œ๋ฆผ, ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€/๋‚ ์”จ ์ •๋ณด ๋“ฑ์— ํ™œ์šฉ

โš™๏ธ 2. ๊ธฐ๋ณธ WebSocket ์—ฐ๊ฒฐ ์˜ˆ์ œ

import React, { useEffect, useRef } from 'react';
import { Text } from 'react-native';

export default function WebSocketExample() {
  const socketRef = useRef<WebSocket | null>(null);

  useEffect(() => {
    socketRef.current = new WebSocket('wss://echo.websocket.org');

    socketRef.current.onopen = () => {
      console.log('โœ… WebSocket ์—ฐ๊ฒฐ๋จ');
      socketRef.current?.send('Hello Server!');
    };

    socketRef.current.onmessage = (event) => {
      console.log('๐Ÿ“ฉ ๋ฐ›์€ ๋ฉ”์‹œ์ง€:', event.data);
    };

    socketRef.current.onerror = (error) => {
      console.log('โŒ ์—๋Ÿฌ ๋ฐœ์ƒ:', error);
    };

    socketRef.current.onclose = () => {
      console.log('๐Ÿ”Œ ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋จ');
    };

    return () => {
      socketRef.current?.close();
    };
  }, []);

  return <Text>WebSocket ์—ฐ๊ฒฐ ์˜ˆ์ œ</Text>;
}

๐Ÿ”„ 3. ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ํŽธํ•˜๋‹ค

import { useEffect, useRef } from 'react';

export const useWebSocket = (url: string) => {
  const socketRef = useRef<WebSocket | null>(null);

  useEffect(() => {
    socketRef.current = new WebSocket(url);

    socketRef.current.onopen = () => {
      console.log('๐Ÿ”Œ WebSocket ์—ฐ๊ฒฐ');
    };

    return () => {
      socketRef.current?.close();
    };
  }, [url]);

  const sendMessage = (msg: string) => {
    socketRef.current?.send(msg);
  };

  return { sendMessage };
};

๐Ÿ“ฑ 4. ์‹ค์ „ ํ™œ์šฉ ์˜ˆ: ์ฑ„ํŒ…๋ฐฉ

  • Socket.io-client๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ง€๋งŒ,
  • ๊ธฐ๋ณธ WebSocket๋งŒ์œผ๋กœ๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
npm install socket.io-client
import io from 'socket.io-client';

const socket = io('https://your-chat-server.com');

socket.on('connect', () => {
  console.log('โœ… ์—ฐ๊ฒฐ๋จ');
});

socket.on('chat', (msg) => {
  console.log('๐Ÿ—จ๏ธ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€:', msg);
});

โš ๏ธ 5. ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ํ•ญ๋ชฉ๋‚ด์šฉ
์—ฐ๊ฒฐ ์œ ์ง€๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์—์„œ๋„ ์œ ์ง€ ํ•„์š” ์—ฌ๋ถ€ ํ™•์ธ
reconnect๋Š๊น€ ์‹œ ์ž๋™ ์žฌ์—ฐ๊ฒฐ ๋กœ์ง ํ•„์ˆ˜
๋ณด์•ˆ์ธ์ฆ ํ† ํฐ๊ณผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ SSL ์‚ฌ์šฉ ๊ถŒ์žฅ
์—๋Ÿฌ ์ฒ˜๋ฆฌonerror, onclose ์ฒ˜๋ฆฌ ํ•„์ˆ˜

๐Ÿ” ์š”์•ฝ ์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
WebSocket์–‘๋ฐฉํ–ฅ, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์— ์ ํ•ฉ
React Native๊ธฐ๋ณธ WebSocket ๋˜๋Š” Socket.io ์‚ฌ์šฉ
๊ตฌ์กฐํ™”์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ƒํ™” ์ถ”์ฒœ
์‹ค์ „ ์ ์šฉ์ฑ„ํŒ…, ์•Œ๋ฆผ, ์ฃผ๊ฐ€ ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅ

๐Ÿ“ก ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ๋‹ค.
WebSocket์„ ํ†ตํ•ด ์•ฑ์— ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์„ฑ์„ ๋”ํ•ด๋ณด์ž!


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€