Vue에서 Socket.io 클라이언트 사용
socket.io-client, io(url), socket.on/emit을 사용하고 소켓 이벤트로부터 반응형 Vue 상태를 만듭니다.
Vue에서 Socket.io 클라이언트 사용은(는) CoddyKit의 무료 Vue Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Vue Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
왜 Socket.IO인가요
기본 WebSockets는 저수준 기술입니다. Socket.IO는 그 위에 자동 재연결, 대체 전송 방식, 방, 깔끔한 이벤트 기반 API를 추가한 인기 라이브러리입니다.
서버와 클라이언트에 대응하는 패키지가 제공되며, 여기서는 Vue 내부에서 사용하는 브라우저 클라이언트에 초점을 맞춥니다.
클라이언트 설치
Vue 프로젝트에 클라이언트 패키지를 추가합니다. 서버 패키지와는 별도의 패키지입니다.
// terminal
// npm install socket.io-client
import { io } from "socket.io-client"io()로 연결하기
io(url)를 호출해 소켓을 만들고 연결합니다. 기본 WebSockets와 달리 http(s):// URL을 전달하면 Socket.IO가 전송 방식을 대신 협상합니다.
import { io } from "socket.io-client"
const socket = io("https://api.example.com", {
autoConnect: true,
})socket.on으로 수신 대기하기
Socket.IO는 이름이 있는 이벤트를 중심으로 동작합니다. socket.on(name, handler)를 사용해 서버 이벤트에 반응합니다. 처리기는 서버가 전달한 페이로드를 그대로 받습니다.
socket.on("message", (msg) => {
console.log("New message:", msg.text, "from", msg.user)
})내장 수명 주기 이벤트
Socket.IO는 자체 수명 주기 이벤트도 발생시키므로 수신 대기할 수 있습니다. connect, disconnect, connect_error가 있습니다.
socket.on("connect", () => {
console.log("Connected, id:", socket.id)
})
socket.on("disconnect", (reason) => {
console.log("Disconnected:", reason)
})socket.emit으로 보내기
보내려면 socket.emit(name, payload)를 호출합니다. 이벤트 이름은 직접 정하고 서버는 같은 이름을 수신합니다. JSON을 직접 인코딩할 필요가 없습니다. Socket.IO가 자동으로 직렬화합니다.
function sendMessage(text) {
socket.emit("send", { text, at: Date.now() })
}
sendMessage("Hello room!")반응형 메시지 배열
Vue에서는 들어오는 메시지를 반응형 ref 배열에 보관합니다. socket.on 처리기가 배열에 항목을 추가하면 템플릿이 자동으로 다시 렌더링됩니다.
import { ref } from "vue"
const messages = ref([])
socket.on("message", (msg) => {
messages.value.push(msg)
})script setup에서 연결하기
일반적인 컴포넌트는 onMounted에서 연결하고 수신기를 등록한 다음, 템플릿에 보낼 함수를 노출합니다.
import { ref, onMounted, onUnmounted } from "vue"
import { io } from "socket.io-client"
const messages = ref([])
const socket = io("https://api.example.com")
onMounted(() => {
socket.on("message", (m) => messages.value.push(m))
})
function send(text) {
socket.emit("send", { text })
}수신기 정리
socket.on으로 등록한 수신기는 계속 연결된 상태로 남습니다. 컴포넌트가 다시 마운트되면 처리기가 중복으로 쌓일 수 있습니다. 정리할 때 socket.off로 수신기를 제거합니다.
function onMessage(m) { messages.value.push(m) }
onMounted(() => socket.on("message", onMessage))
onUnmounted(() => socket.off("message", onMessage))onUnmounted에서 연결 해제하기
컴포넌트가 제거될 때 socket.disconnect()로 연결을 닫아 화면을 이동한 뒤 열린 소켓이 남지 않게 합니다.
import { onUnmounted } from "vue"
onUnmounted(() => {
socket.disconnect()
})수신 확인
Socket.IO의 유용한 기능 중 하나는 마지막 emit 인수로 콜백을 전달하면 서버가 이를 호출해 수신을 확인할 수 있다는 점입니다. "메시지 전달됨" 사용자 경험에 매우 유용합니다.
socket.emit("send", { text: "hi" }, (ack) => {
console.log("Server confirmed:", ack.status)
})빠른 확인
Socket.IO 클라이언트 API에 대한 이해도를 확인해 보세요.
복습
이 레슨에서 다음을 배웠습니다.
socket.io-client의io(url)는 http(s) URL을 사용해 연결합니다.socket.on(name, handler)는 이름이 있는 서버 이벤트에 반응합니다.socket.emit(name, payload)는 이벤트를 보내며 페이로드는 자동으로 직렬화됩니다.- 들어오는 데이터를 반응형
ref배열에 추가하면 템플릿에서 사용할 수 있습니다. onUnmounted에서socket.off와socket.disconnect()로 정리합니다.
자주 묻는 질문
“Vue에서 Socket.io 클라이언트 사용” 강의는 무료인가요?
네 — “Vue에서 Socket.io 클라이언트 사용” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Vue Academy 강의 전체를 잠금 해제할 수 있습니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Vue에서 Socket.io 클라이언트 사용”에서 뭘 배우나요?
socket.io-client, io(url), socket.on/emit을 사용하고 소켓 이벤트로부터 반응형 Vue 상태를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Vue Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Vue Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Vue Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“Vue에서 Socket.io 클라이언트 사용” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Vue Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Vue Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 브라우저에서 WebSocket 기초 다지기
- Vue에서 Socket.io 클라이언트 사용
- 실시간 채팅 컴포넌트 만들기
- 재연결 기능이 있는 useWebSocket 컴포저블