프로그래밍

👨‍💻 [Go] Go 에서 Socket.IO 프로토콜은 어떻게 구현하고 활용할 수 있나요?

밝음의기둥 2025. 1. 16. 15:09
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 Socket.IO 프로토콜은 어떻게 구현하고 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 Socket.IO 프로토콜은 어떻게 구현하고 활용할 수 있나요?

답변 >

Go에서 Socket.IO 프로토콜은 실시간 양방향 통신을 가능하게 하는 웹소켓(WebSocket) 기반의 프로토콜을 구현하거나 활용하기 위해 사용할 수 있습니다. 이를 통해 브라우저와 서버 간에 실시간 이벤트를 주고받을 수 있습니다. Go에서는 Socket.IO 프로토콜을 지원하는 서드파티 라이브러리를 사용해 쉽게 구현할 수 있습니다.


1. 주요 라이브러리

Go에서는 다음과 같은 라이브러리를 사용하여 Socket.IO 프로토콜을 구현할 수 있습니다:

  1. go-socket.io
    • Socket.IO 서버 기능을 제공.
    • Node.js Socket.IO 클라이언트와 호환.
    • 네임스페이스, 방(Rooms), 이벤트를 지원.
  2. socketio-go
    • Socket.IO 클라이언트 기능을 제공.
    • Go 애플리케이션이 다른 Socket.IO 서버와 통신 가능.

2. 서버 구현

2.1. 서버 설정

go get github.com/googollee/go-socket.io

2.2. 서버 코드

package main

import (
	"fmt"
	"log"
	"net/http"

	socketio "github.com/googollee/go-socket.io"
)

func main() {
	server := socketio.NewServer(nil)

	// 클라이언트가 연결될 때 실행되는 이벤트
	server.OnConnect("/", func(s socketio.Conn) error {
		fmt.Println("Connected:", s.ID())
		return nil
	})

	// 클라이언트가 보낸 메시지를 처리
	server.OnEvent("/", "chat message", func(s socketio.Conn, msg string) {
		fmt.Printf("Message from %s: %s\\n", s.ID(), msg)
		// 모든 클라이언트에 메시지 브로드캐스트
		server.BroadcastToNamespace("/", "chat message", msg)
	})

	// 클라이언트 연결 해제 시 처리
	server.OnDisconnect("/", func(s socketio.Conn, reason string) {
		fmt.Printf("Disconnected: %s, Reason: %s\\n", s.ID(), reason)
	})

	// HTTP 서버와 통합
	go server.Serve()
	defer server.Close()

	http.Handle("/socket.io/", server)
	http.Handle("/", http.FileServer(http.Dir("./static"))) // 정적 파일 제공

	fmt.Println("Socket.IO server running on :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}


3. 클라이언트 구현

3.1. Node.js Socket.IO 클라이언트

npm install socket.io-client

JavaScript 클라이언트 코드

const io = require("socket.io-client");
const socket = io("<http://localhost:8080>");

socket.on("connect", () => {
  console.log("Connected to server");

  // 메시지 보내기
  socket.emit("chat message", "Hello, Go server!");
});

socket.on("chat message", (msg) => {
  console.log("Message from server:", msg);
});

socket.on("disconnect", () => {
  console.log("Disconnected from server");
});


4. 클라이언트-서버 통신 구조

  1. 클라이언트 연결: 브라우저나 Node.js 클라이언트는 서버에 연결 요청을 보냅니다.
  2. 이벤트 기반 통신: 서버와 클라이언트는 이벤트(chat message 등)를 통해 데이터를 주고받습니다.
  3. 실시간 업데이트: 서버에서 특정 이벤트를 브로드캐스트하면, 연결된 모든 클라이언트가 데이터를 수신합니다.
  4. 연결 종료: 클라이언트가 연결을 끊으면, 서버는 연결 해제 이벤트를 처리합니다.

5. 활용 사례

  1. 실시간 채팅 애플리케이션:
    • 여러 사용자가 실시간으로 메시지를 주고받을 수 있습니다.
  2. 알림 시스템:
    • 실시간으로 사용자에게 알림을 전달.
  3. 온라인 멀티플레이어 게임:
    • 게임 상태를 실시간으로 동기화.
  4. 실시간 데이터 스트리밍:
    • 센서 데이터 또는 주식 거래 정보 등 실시간 업데이트 제공.

6. 고급 기능

6.1. 네임스페이스

  • 특정 경로(/chat, /news)에 따라 클라이언트를 분리하여 처리.
server.OnConnect("/chat", func(s socketio.Conn) error {
	fmt.Println("Chat namespace connected:", s.ID())
	return nil
})

6.2. 방(Rooms)

  • 클라이언트를 그룹으로 묶어 방 단위로 메시지 전송.
server.OnEvent("/", "join room", func(s socketio.Conn, room string) {
	s.Join(room)
	server.BroadcastToRoom("/", room, "room message", "Welcome to room "+room)
})


7. 장점과 단점

7.1. 장점

  1. 실시간 통신: 낮은 지연 시간으로 실시간 이벤트를 주고받을 수 있음.
  2. 이벤트 기반: 이벤트 드리븐 프로그래밍으로 효율적인 데이터 처리.
  3. 다양한 기능 제공: 네임스페이스, 방(Room), 브로드캐스트 등을 지원.

7.2. 단점

  1. 라이브러리 의존성: 서드파티 라이브러리에 의존하므로 유지보수 리스크.
  2. 복잡성 증가: 실시간 통신 애플리케이션은 동기화 문제를 잘 처리해야 함.

8. 요약

  • Go에서 Socket.IO 프로토콜은 go-socket.io와 같은 라이브러리를 사용해 간단히 구현할 수 있습니다.
  • 서버와 클라이언트 간에 실시간 이벤트 기반 통신을 가능하게 하며, 채팅, 알림 시스템, 실시간 데이터 스트리밍 등 다양한 응용 프로그램에 활용됩니다.
  • 네임스페이스와 방(Room)과 같은 고급 기능을 통해 구조화된 통신 설계가 가능합니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형