Socket.io 클라이언트 통합
Socket.io 클라이언트를 연결하고, 이름이 지정된 이벤트를 수신하며, 서버로 데이터를 전송하고, 재연결 로직을 처리하며, 클라이언트 측에서 방을 관리합니다.
Socket.io 클라이언트 통합은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Raw WebSocket에 Socket.io가 더해 주는 기능
Socket.io는 WebSocket을 기반으로 하는 인기 라이브러리입니다. 자동 재연결, 폴링으로의 fallback, 룸/네임스페이스, 확인 콜백, 이름이 지정된 이벤트를 추가합니다. 클라이언트 라이브러리와 서버 라이브러리(Node.js)를 함께 사용합니다.
클라이언트 설치
socket.io-client를 설치합니다. 서버의 주 버전과 일치해야 합니다.
npm install socket.io-client연결하기
io를 가져온 다음 서버 URL에 연결합니다. Socket 인스턴스를 반환합니다.
import { io } from 'socket.io-client';
const socket = io('https://api.example.com', {
transports: ['websocket'], // skip polling fallback for speed
auth: { token: localStorage.getItem('jwt') }
});
socket.on('connect', () => console.log('connected', socket.id));이벤트 내보내기
socket.emit(eventName, payload)는 데이터와 함께 이름이 지정된 이벤트를 보냅니다. raw send와 JSON.parse를 조합하는 것보다 훨씬 깔끔합니다.
socket.emit('chat-message', {
room: 'general',
text: 'Hello everyone!'
});
socket.emit('typing', { user: 'Alice' });이벤트 수신 대기
socket.on(eventName, handler)는 리스너를 등록합니다. 서버에서 내보낸 이벤트가 여기로 전달됩니다.
socket.on('chat-message', (msg) => {
console.log(`${msg.user}: ${msg.text}`);
appendMessage(msg);
});
socket.on('user-joined', (user) => {
console.log(`${user.name} joined`);
});확인 응답 (Ack 콜백)
emit의 마지막 인수로 콜백을 전달하면 서버가 응답과 함께 콜백을 호출할 수 있습니다. RPC와 비슷합니다.
socket.emit('create-post', { title: 'Hello' }, (response) => {
if (response.error) {
console.error(response.error);
} else {
console.log('Created post', response.id);
}
});Promise 기반 emitWithAck
최신 Socket.io는 Promise를 반환하는 emitWithAck를 제공합니다.
try {
const response = await socket.emitWithAck('create-post', { title: 'Hello' });
console.log('Created', response.id);
} catch (err) {
console.error('Failed', err);
}룸
룸은 소켓을 서버 측에서 그룹화한 것입니다. 클라이언트는 이벤트를 내보내 룸에 참여하거나 나가고, 서버는 io.to(room).emit()을 사용해 브로드캐스트합니다.
// Client:
socket.emit('join-room', { roomId: 'general' });
// Listen to messages in any room you've joined:
socket.on('room-message', ({ room, message }) => {
if (room === activeRoom) appendMessage(message);
});
// Leave:
socket.emit('leave-room', { roomId: 'general' });네임스페이스
네임스페이스는 같은 서버에서 사용하는 별도의 통신 채널입니다. 예를 들어 /chat과 /admin이 있습니다. URL 끝에 네임스페이스를 덧붙여 연결합니다.
const chatSocket = io('https://api/chat');
const adminSocket = io('https://api/admin');내장된 재연결
Socket.io는 지수 백오프를 사용해 자동으로 재연결합니다. 옵션을 통해 구성할 수 있습니다.
const socket = io({
reconnection: true,
reconnectionAttempts: Infinity,
reconnectionDelay: 1000,
reconnectionDelayMax: 30000,
randomizationFactor: 0.5
});
socket.on('reconnect', (attempt) => console.log('reconnected after', attempt));
socket.on('reconnect_attempt', (attempt) => console.log('trying...', attempt));연결 해제 처리
연결 해제 이벤트를 수신해 UI를 업데이트합니다(‘재연결 중...’ 배너 표시).
socket.on('disconnect', (reason) => {
console.log('Disconnected:', reason);
if (reason === 'io server disconnect') {
// Server kicked us — must reconnect manually
socket.connect();
}
});React 통합
소켓 수명 주기를 사용자 지정 훅 또는 Context 제공자로 감쌉니다.
// useSocket.ts
import { useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';
let socket: Socket;
export function useSocket() {
const [connected, setConnected] = useState(false);
useEffect(() => {
if (!socket) socket = io('/');
socket.on('connect', () => setConnected(true));
socket.on('disconnect', () => setConnected(false));
return () => { /* keep socket alive across remounts */ };
}, []);
return { socket, connected };
}Socket.io와 Raw WebSocket 중 선택하기
Socket.io: 룸, 확인 콜백, 자동 재연결, 기본 제공 transport fallback이 필요할 때 사용합니다. Raw WebSocket: raw 프로토콜을 직접 제어해야 하거나, 번들 크기를 최소화해야 하거나, Socket.io가 아닌 서버와 연동해야 할 때 사용합니다.
빠른 확인
Socket.io의 emit(event, payload, callback)에서 세 번째 인수인 콜백으로 무엇을 할 수 있나요?
복습: Socket.io 클라이언트
WebSocket 기반 라이브러리로 룸, 네임스페이스, 확인 응답, 자동 재연결, 폴링 fallback을 제공합니다. io(url, options)으로 연결합니다. emit(event, payload)으로 이름이 지정된 이벤트를 보내고, on(event, handler)로 수신합니다. RPC 방식에는 세 번째 인수인 콜백 또는 emitWithAck를 사용합니다. 룸은 서버를 통해 사용하고, 네임스페이스는 URL 끝에 지정합니다. 재연결 기능이 내장되어 있습니다. React에서는 수명 주기를 훅으로 감쌉니다.
자주 묻는 질문
“Socket.io 클라이언트 통합” 강의는 무료인가요?
네 — “Socket.io 클라이언트 통합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Socket.io 클라이언트 통합”에서 뭘 배우나요?
Socket.io 클라이언트를 연결하고, 이름이 지정된 이벤트를 수신하며, 서버로 데이터를 전송하고, 재연결 로직을 처리하며, 클라이언트 측에서 방을 관리합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Frontend Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Socket.io 클라이언트 통합” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- WebSocket API: 열기, 메시지, 닫기, 오류
- Socket.io 클라이언트 통합
- 단방향 스트리밍을 위한 서버 전송 이벤트
- 실시간 UI 패턴