๐Ÿฌ ๊ธดํ˜ธํก/๊ณ ์Šค๋ฝ ํ‹ฐ์ผ“

[2.0] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ Socket.io-client ์‚ฌ์šฉํ•˜๊ธฐ

ํ•œ๊ทœ์ง„ 2022. 9. 12. 03:11

1์ฐจ ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์˜ค๋ฉด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ, ์˜ˆ์ƒ๋ณด๋‹ค ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ชป์ฐพ๋Š”๊ฑด์ง€ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ณ„๋กœ ์—†์—ˆ์Œ. ์ผ๋‹จ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์ด๋Ÿฌ์ฟต ์ €๋Ÿฌ์ฟต ํ•˜๋‹ˆ ๋˜๊ธด ํ–ˆ๋Š”๋ฐ, ์ด๊ฒŒ ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ผ๋‹จ ์ž˜ ๋Œ์•„๊ฐ€๋‹ˆ ๊ธฐ๋ก.

 

์ €๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์—์„œ socket.io-client ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ์ •์˜๋ฅผ ํ•ด์ฃผ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ,

 

์•ˆ์“ฐ๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š”๊ฑด ์•Œ๊ฒ ๋‹ค.. ์ผ๋‹จ!!

 


 

import io, { Socket } from 'socket.io-client';

io์™€ ํ•จ๊ป˜ Socket๋„ import ํ•ด์ค€๋‹ค.

 

const [socket, setSocket] = useState<Socket<ServerToClientEvents>>();

์†Œ์ผ“ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด state์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ์›๋ž˜ Socket ํƒ€์ž…์˜ ์ œ๋„ค๋ฆญ์œผ๋กœ <ListenEvents, EmitEvents> ๋‘๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ง€๊ธˆ์€ ์ •๋ณด ์ˆ˜์‹ ๋งŒ ํ• ๊ฑฐ๋‹ˆ๊นŒ ListenEvents๋งŒ ์ง€์ •ํ•ด๋‘ . (์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๋Š”๊ฑด๊ฐ€)

 

 

TicketQR.tsx

๋ช…์„ธ

event ์ด๋ฆ„์œผ๋กœ ํ‹ฐ์ผ“์˜ uuid๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

 

socket.on(ticketId, (data: SocketData) => {
    if (data.success) {
        // ์ƒ๋žต..
    } else {
        // ์—๋Ÿฌ์ฒ˜๋ฆฌ..
    }
});

๊ทธ๋Œ€๋กœ ํ•ด๋ดค์Œ. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค.

 

๐Ÿ˜ก๐Ÿ˜ก

 

https://socket.io/docs/v4/typescript/

 

ServerToClientEvents๋Š” ์„œ๋ฒ„์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ• ๋•Œ์˜ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜ ํƒ€์ž…์œผ๋กœ ์“ฐ์ธ๋‹ค. socket.on(EventName, Listener)์—์„œ, ์ด๋ฒคํŠธ ์ด๋ฆ„์ด 'noArg'์ธ ๊ฒฝ์šฐ์— ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜์˜ ํƒ€์ž…์€ ()=>void ์—ฌ์•ผ ํ•œ๋‹ค. ๋ญ ์ด๋Ÿฐ ์‹์ž„.

๋‚ด ๊ฒฝ์šฐ์—” ticketId๋ฅผ eventName์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋กœ (data) => void ํ˜•์‹์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ๋‹ค. eventName๊ณผ ๊ทธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•˜์„ ๋•Œ์— ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

/type/socket.ts

export interface ServerToClientEvents {
  noArg: () => void;
  basicEmit: (a: number, b: string, c: Buffer) => void;
  withAck: (d: string, callback: (e: number) => void) => void;
  ticketId: (data: any) => void;
}

export interface ClientToServerEvents {
  hello: () => void;
}

export interface InterServerEvents {
  ping: () => void;
}

export interface SocketData {
  uuid: string;
  success: boolean;
  date: 'YB' | 'OB';
  ticketStatus: '์ž…์žฅ์™„๋ฃŒ' | '์ž…๊ธˆํ™•์ธ' | 'ํ™•์ธ๋Œ€๊ธฐ' | '๊ธฐํ•œ๋งŒ๋ฃŒ';
  message: string;
  name: string;
  phoneNumber: string;
  adminName: string;
}

์ด๋ ‡๊ฒŒ ํƒ€์ž…์„ ์ •์˜ํ•ด์ค€๋‹ค. ๊ฐ€์šด๋ฐ ๋‘๊ฐœ๋Š” ํ•„์š”์—†๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ฌธ์„œ์—์„œ ๊ธ์–ด์˜ฌ๋•Œ ๊ฐ™์ด ๊ธ์–ด์™”๋‹ค. data๋งŒ ๋ฐ›์•„์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Œ.

 

const ticketIdForSocket = ticketId as keyof ServerToClientEvents;
socket.on(ticketIdForSocket, (data: SocketData) => {
    if (data.success) {
        // ์ƒ๋žต..
    } else {
        // ์—๋Ÿฌ์ฒ˜๋ฆฌ..
    }
});

keyof ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ–ˆ๋‹ค. ServerToClientEvents ๊ฐ์ฒด์˜ key๋ผ๊ณ  ๋‹จ์–ธ์„ ํ•ด์ฃผ๊ณ  ์ด๋ฒคํŠธ ์ด๋ฆ„์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋Ÿผ ๋ฆฌ์Šค๋„ˆํ•จ์ˆ˜์™€ ํƒ€์ž…์ด ์ง์งœ๊ฟ์ด ์ž˜ ๋งž์•„์ง€๋ฉด์„œ(...) ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

 


 

์ง 

์ฝ”๋”ฉํ•˜๊ธฐ ์ „์— ๊ธ€๋ถ€ํ„ฐ ์ž˜์“ฐ๊ณ  ์‹ถ๋‹ค.