gorilla/websocket 사용하기
연결 업그레이드하고 처리하기
gorilla/websocket 사용하기은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
gorilla/websocket 라이브러리
gorilla/websocket은 가장 널리 사용되는 Go WebSocket 라이브러리입니다. 업그레이드 핸드셰이크를 처리하고 프레임을 읽고 쓸 수 있는 연결 객체를 제공합니다. go get github.com/gorilla/websocket으로 설치합니다.
import "github.com/gorilla/websocket"업그레이더
Upgrader는 HTTP 요청을 WebSocket 연결로 변환합니다. 버퍼 크기와 출처 확인을 설정할 수 있습니다.
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}CheckOrigin 및 보안
기본적으로 Upgrader는 교차 출처 요청을 거부합니다. 개발 중에는 이를 완화할 수 있지만, 프로덕션에서는 사이트 간 WebSocket 탈취를 방지하도록 Origin 헤더를 검증해야 합니다.
upgrader.CheckOrigin = func(r *http.Request) bool {
return r.Header.Get("Origin") == "https://myapp.com"
}처리기에서 업그레이드하기
http.HandlerFunc 내부에서 Upgrade를 호출합니다. 성공하면 *websocket.Conn을 얻습니다.
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
// read/write loop here
}메시지 읽기
ReadMessage는 프레임이 도착할 때까지 실행을 차단하고, 메시지 유형과 페이로드 바이트를 반환합니다.
mt, data, err := conn.ReadMessage()
if err != nil {
return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mt메시지 쓰기
WriteMessage는 지정한 유형의 프레임을 전송합니다.
err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
return
}에코 반복
전형적인 예제에서는 메시지를 읽은 다음 그대로 돌려보냅니다. Read가 오류를 반환하면(클라이언트가 연결을 끊었음을 의미합니다) 반복이 끝납니다.
for {
mt, msg, err := conn.ReadMessage()
if err != nil {
break
}
conn.WriteMessage(mt, msg)
}JSON 도우미
gorilla는 Go 값을 소켓을 통해 직접 marshal하고 역으로 복원할 수 있는 ReadJSON과 WriteJSON을 제공합니다. 구조화된 메시지에 편리합니다. 실제 소스에서는 Msg 구조체 필드에 json:"text" 태그가 붙습니다.
type Msg struct {
Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})읽기 하나, 쓰기 하나 규칙
중요: 하나의 연결에서는 동시에 실행되는 읽기 작업 하나와 쓰기 작업 하나만 허용됩니다. 여러 고루틴이 쓴다면 뮤텍스로 보호하거나, 하나의 고루틴을 통해 쓰기를 한 곳으로 모아야 합니다(브로드캐스팅에서 다룹니다).
경로 등록
일반적인 HTTP 경로와 같은 방식으로 처리기를 연결합니다. 클라이언트는 ws://host/ws에 연결합니다.
http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)실행 가능: JSON 왕복 비유
WebSocket 코드는 외부 라이브러리가 필요합니다. 이 표준 라이브러리 코드는 들어온 메시지를 맵으로 역직렬화하고 응답을 직렬화하여 ReadJSON/WriteJSON을 모방합니다.
package main
import (
"encoding/json"
"fmt"
)
func main() {
in := []byte("{\"text\":\"ping\"}")
var m map[string]string
json.Unmarshal(in, &m)
reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
fmt.Println(string(reply))
}빠른 확인
gorilla/websocket 사용법에 대한 이해도를 확인해 보십시오.
복습
gorilla/websocket을 사용하는 방법을 배웠습니다.
Upgrader가 핸드셰이크를 수행하므로CheckOrigin을 검증해야 합니다Upgrade는*websocket.Conn을 반환합니다ReadMessage/WriteMessage또는 JSON 도우미를 사용합니다- 한 번에 연결당 읽기 작업 하나와 쓰기 작업 하나만 실행합니다
자주 묻는 질문
“gorilla/websocket 사용하기” 강의는 무료인가요?
네 — “gorilla/websocket 사용하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“gorilla/websocket 사용하기”에서 뭘 배우나요?
연결 업그레이드하고 처리하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“gorilla/websocket 사용하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- WebSocket 기초
- gorilla/websocket 사용하기
- 메시지 브로드캐스트
- 연결 관리