Vue Academy · 강의

브라우저에서 WebSocket 기초 다지기

new WebSocket(url), onopen/onmessage/onerror/onclose, send()와 readyState를 익힙니다.

레슨 1/413개 단계

브라우저에서 WebSocket 기초 다지기은(는) CoddyKit의 무료 Vue Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Vue Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

브라우저에서 실시간 데이터 사용하기

HTTP는 요청과 응답 방식입니다. 클라이언트가 요청하고 서버가 응답한 다음 연결이 닫힙니다. 채팅, 실시간 대시보드, 멀티플레이어 게임에서는 요청을 받지 않아도 서버가 데이터를 푸시해야 합니다.

WebSocket 프로토콜은 브라우저와 서버 사이에 오래 유지되는 양방향 연결 하나를 제공합니다.

연결 열기

브라우저에는 전역 WebSocket 생성자가 기본으로 제공됩니다. ws://(일반 연결) 또는 wss://(TLS) 방식을 사용하는 URL을 전달합니다.

객체를 만들면 즉시 연결 핸드셰이크가 시작됩니다.

const ws = new WebSocket("wss://echo.example.com/socket")

// Construction kicks off the connection.
// Nothing is sent yet — we wait for it to open.

onopen 처리기

객체를 생성했다고 연결을 즉시 사용할 수 있는 것은 아닙니다. 핸드셰이크가 완료되고 소켓이 데이터를 전송할 준비가 되면 onopen 이벤트가 한 번 실행됩니다.

첫 번째 메시지는 반드시 onopen 내부에서 보내고, 그전에는 보내지 않습니다.

const ws = new WebSocket("wss://echo.example.com/socket")

ws.onopen = () => {
  console.log("Connected!")
  ws.send("hello server")
}

메시지 받기

수신 데이터는 onmessage를 통해 도착합니다. 페이로드는 event.data에 있으며 기본적으로 문자열입니다.

대부분의 앱은 JSON을 보내므로 이를 다시 객체로 구문 분석합니다.

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data)
  console.log("Got:", msg.type, msg.payload)
}

메시지 보내기

ws.send()를 사용해 데이터를 전송합니다. WebSockets는 일반 문자열이나 이진 데이터를 전달하므로 먼저 JSON.stringify로 객체를 인코딩합니다.

양쪽은 데이터 구조에 합의합니다. 여기서는 type과 payload를 사용합니다.

function sendChat(text) {
  const msg = { type: "chat", payload: { text } }
  ws.send(JSON.stringify(msg))
}

sendChat("Good morning")

전체 왕복 과정

열기, 보내기, 받기를 하나로 묶으면 완전한 에코 클라이언트가 됩니다. 소켓을 열고, 열리면 메시지를 보내고, 돌아오는 내용을 기록합니다.

const ws = new WebSocket("wss://echo.example.com/socket")

ws.onopen = () => {
  ws.send(JSON.stringify({ type: "ping" }))
}

ws.onmessage = (event) => {
  const data = JSON.parse(event.data)
  console.log("Server replied:", data)
}

연결 닫기

연결이 끝나면 onclose 이벤트가 실행됩니다. ws.close()를 호출한 경우든 네트워크가 끊긴 경우든 동일합니다. 이벤트에는 숫자 code와 문자열 reason이 포함됩니다.

1000 코드는 정상적으로 연결이 종료되었음을 의미합니다.

ws.onclose = (event) => {
  console.log("Closed:", event.code, event.reason)
  if (event.code !== 1000) {
    console.log("Unexpected close — may want to reconnect")
  }
}

// Trigger a clean close yourself:
// ws.close(1000, "done")

오류 처리

전송에 실패하면 onerror 이벤트가 실행됩니다. 보안을 위해 오류 이벤트 자체에는 의도적으로 자세한 정보가 거의 없습니다. 문제가 발생했다는 신호로 처리하고 곧 연결 종료가 이어질 수 있다고 생각해야 합니다.

ws.onerror = (event) => {
  console.error("WebSocket error occurred")
  // onclose usually fires right after onerror.
}

readyState 속성

ws.readyState는 소켓의 수명 주기에서 현재 위치를 나타내는 숫자입니다. 아직 열리지 않은 소켓에서 전송해 오류가 발생하지 않도록 보내기 전에 항상 확인합니다.

  • 0 CONNECTING
  • 1 OPEN
  • 2 CLOSING
  • 3 CLOSED
function safeSend(data) {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(JSON.stringify(data))
  } else {
    console.warn("Not open, readyState =", ws.readyState)
  }
}

이름이 있는 readyState 상수

매직 넘버 대신 WebSocket 클래스의 상수를 사용합니다. 상수를 사용하면 0, 1, 3보다 의미가 훨씬 명확합니다.

console.log(WebSocket.CONNECTING) // 0
console.log(WebSocket.OPEN)       // 1
console.log(WebSocket.CLOSING)    // 2
console.log(WebSocket.CLOSED)     // 3

if (ws.readyState === WebSocket.OPEN) {
  ws.send("ready to talk")
}

Vue에서 통합하기

Vue 컴포넌트 내부에서는 일반적으로 onMounted에서 소켓을 만들고 onUnmounted에서 정리합니다. 처리기는 템플릿이 렌더링하는 반응형 ref를 업데이트합니다.

import { ref, onMounted, onUnmounted } from "vue"

const messages = ref([])
let ws

onMounted(() => {
  ws = new WebSocket("wss://echo.example.com/socket")
  ws.onmessage = (e) => messages.value.push(JSON.parse(e.data))
})

onUnmounted(() => ws && ws.close())

빠른 확인

WebSocket readyState 값에 대한 이해도를 확인해 보세요.

복습

이 레슨에서 다음을 배웠습니다.

  • new WebSocket(url)은 ws:// 또는 wss://를 사용하는 양방향 연결을 시작합니다.
  • 소켓을 사용할 준비가 되면 onopen이 실행됩니다. 그 이후에만 보내야 합니다.
  • onmessage는 event.data로 데이터를 전달합니다. 객체를 얻으려면 JSON을 구문 분석합니다.
  • ws.send(JSON.stringify(msg))로 데이터를 전송합니다.
  • onclose와 onerror로 정리와 실패를 처리합니다.
  • readyState는 0 CONNECTING, 1 OPEN, 2 CLOSING, 3 CLOSED입니다.
무료로 시작

AI 튜터와 함께 HTML을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
42
레슨
156

자주 묻는 질문

“브라우저에서 WebSocket 기초 다지기” 강의는 무료인가요?

네 — “브라우저에서 WebSocket 기초 다지기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Vue Academy 강의 전체를 잠금 해제할 수 있습니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“브라우저에서 WebSocket 기초 다지기”에서 뭘 배우나요?

new WebSocket(url), onopen/onmessage/onerror/onclose, send()와 readyState를 익힙니다. 브라우저에서 직접 실행하는 실습 코드로 Vue Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Vue Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Vue Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“브라우저에서 WebSocket 기초 다지기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Vue Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Vue Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 브라우저에서 WebSocket 기초 다지기
  2. Vue에서 Socket.io 클라이언트 사용
  3. 실시간 채팅 컴포넌트 만들기
  4. 재연결 기능이 있는 useWebSocket 컴포저블
← Vue Academy(으)로 돌아가기