2024. 8. 6. 00:11γBackend/π©΅ Go
κ°μ
fiber νλ μμν¬λ₯Ό μ¬μ©νμ¬ μΉμμΌ μ±ν μλ²λ₯Ό κ°λ° μ€ http μμ websocket μΌλ‘ νλ‘ν μ½μ μ κ·Έλ μ΄λ νλ κ³Όμ μμ λ°μν λ¬Έμ .
μλ¬ λ°μ
μ£Όμμ λ¬μλμ κ² μ²λΌ websocket handler λ΄λΆμμ fiber.Ctx μ μ κ·Όνμλ§μ μλ¬κ° λ°μνλ€.
μ ν¨νμ§ μμ λ©λͺ¨λ¦¬ μ£Όμμ΄κ±°λ nil pointer μλ¬κ° λ°μνλ€λλ°, ServeHttp() λ©μλ μ§μ μμ μμ c λ₯Ό λ‘κ·Έλ‘ νμΈνμ λ μ μ κ°μ΄ μΆλ ₯λλ€.
μ¦ websocker νΈλ€λ¬ λ΄λΆμμ fiber.Ctx λ₯Ό μ κ·Όνμ§ λͺ»νλ κ²μ΄ μμΈμ΄λΌ μκ°νλ€.
func (r *Room) ServeHTTP(c *fiber.Ctx) error {
if r == nil {
return fiber.NewError(fiber.StatusInternalServerError, "Room is not initialized")
}
return websocket.New(func(conn *websocket.Conn) {
if conn == nil {
log.Println("WebSocket connection failed")
return
}
authCookie := c.Cookies("auth") // log νμΈ κ²°κ³Ό ν΄λΉ λΌμΈμμ μλ¬ λ°μ
if authCookie == "" {
log.Println("auth cookie is failed")
return
}
client := &Client{
Socket: conn,
Send: make(chan *message, messageBufferSize),
Room: r,
Name: authCookie,
}
if client == nil {
log.Println("Failed to create client")
return
}
r.Join <- client
defer func() {
if r != nil && client != nil {
r.Leave <- client
}
}()
go client.Write()
client.Read()
})(c)
}
μμΈ
μμΈμ webSocket.New() νΈλ€λ¬ ν¨μ λ΄μμ c *fiber.Ctxμ μ‘μΈμ€ν μ μλ λ¬Έμ μλ€.
μ΄λ WebSocket μ°κ²°μ΄ HTTP μ°κ²°μ μ κ·Έλ μ΄λνλ―λ‘ κΈ°μ‘΄μ 컨ν μ€νΈλ₯Ό λ μ΄μ μ¬μ©ν μ μκΈ° λλ¬Έμ΄λ€.
μ fiberμ Context λ websocket λ΄μμ μ¬μ©ν μ μμκΉ?
λ³μ cκ° WebSocket νΈλ€λ¬ λ΄λΆμμ μ¬μ©ν μ μλ μ΄μ λ WebSocket νλ‘ν μ½μ νΉμ±κ³Ό Fiber νλ μμν¬μ ꡬν λ°©μ λλ¬Έμ΄λ€.
1. Httpμμ WebSocket μΌλ‘ λ³ν
- websocket μ°κ²°μ μΌλ° HTTP μμ²μΌλ‘ μμνμ¬ νλ‘ν μ½ μ κ·Έλ μ΄λλ₯Ό ν΅ν΄ μ΄λ€μ§λ€.
- μ κ·Έλ μ΄λ μλ£ μ, 컀λ₯μ μ λ μ΄μ Http κ° μλ WebSocket νλ‘ν μ½μ μ¬μ©νλ€.
2. Fiber 컨ν μ€νΈμ μλͺ
- c *fiber.Ctx λ http μμ²μ 컨ν μ€νΈ μ 보λ₯Ό λ΄κ³ μλ€.
- μ΄ μ»¨ν μ€νΈλ http μμ²μ μλͺ μ£ΌκΈ° λμλ§ μ ν¨νλ€. μ¦ websocket μΌλ‘ μ κ·Έλ μ΄λ λ μμ λΆν°λ λ μ΄μ μ ν¨νμ§ μλ€.
μ 리νλ©΄ WebSocket νΈλ€λ¬ λ΄λΆμμ c *fiber.Ctxλ₯Ό μ§μ μ¬μ©νλ κ²½μ° λ°νμ μλ¬κ° λ°μν μ μλ€.
μ¦ WebSocket μ°κ²° μ μ νμν μ 보(μ: μΏ ν€, ν€λ λ±)λ₯Ό 미리 μΆμΆνμ¬ WebSocket νΈλ€λ¬μ μ λ¬νλ λ°©μμ μ¬μ©νλ μμΌλ‘ μ½λλ₯Ό κ°μ ν΄μΌνλ€. μ΄λ κ² νλ©΄ WebSocket μ°κ²° λμ νμν μ 보λ₯Ό μμ νκ² μ¬μ©ν μ μλ€.
λ³κ²½λ μ½λ
websocket.New() λ΄λΆμμ μ§μ fibet.Ctx λ₯Ό μ°Έμ‘°ν κΈ°μ‘΄ μ½λμ λ¬λ¦¬
κ°μ λ μ½λμμλ fiber.Ctx μμ νμν μ 보λ₯Ό 미리 μΆμΆνλ μμΌλ‘ λ³κ²½νλ€.
그리νμ¬ websocket handler λ΄λΆμμλ νμν μ λ³΄λ§ μ λ¬λ°μ μ¬μ©ν μ μλ€.
func (r *Room) ServeHTTP(c *fiber.Ctx) error {
if r == nil {
return fiber.NewError(fiber.StatusInternalServerError, "Room is not initialized")
}
authCookie := c.Cookies("auth")
if authCookie == "" {
return fiber.NewError(fiber.StatusUnauthorized, "Auth cookie is missing")
}
return websocket.New(func(conn *websocket.Conn) {
if conn == nil {
log.Println("WebSocket connection failed")
return
}
client := &Client{
Socket: conn,
Send: make(chan *message, messageBufferSize),
Room: r,
Name: authCookie, // Use the authCookie we got earlier
}
if client == nil {
log.Println("Failed to create client")
return
}
r.Join <- client
defer func() {
if r != nil && client != nil {
r.Leave <- client
}
}()
go client.Write()
client.Read()
})(c)
}
'Backend > π©΅ Go' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
ν ν¬ λΈλ‘κ·Έ λͺ¨μ보기 κ°λ° κΈ°λ‘ (2) : Go μΈμ΄μ μλ²λ¦¬μ€ νλ μμν¬ (0) | 2024.10.22 |
---|---|
[Go] goroutine κ³Ό channel λ‘ API μ€ν μκ° κ°μ νκΈ° (1) | 2024.09.13 |
λ컀 컨ν μ΄λ Go μλ²κ° SIGTERM μ 무μν μ΄μ (feat. PID 1) (0) | 2024.09.10 |
μμλ₯Ό ν΅ν Go κ°μ²΄ μμ± μ΄ν΄νκΈ° (0) | 2024.01.25 |
[Golang] new, make, pointer νꡬ (0) | 2024.01.07 |