더북(TheBook)

메시지 수신/전송 구현

웹소켓의 메시지를 전달받으면 전달받은 메시지를 몽고DB에 저장하고 채팅방에 있는 다른 사용자에게 전달하는 코드를 작성해 보자.

▼ client.go

func (c *Client) readLoop() {
    // 메시지 수신 대기
    for {
        m, err := c.read()
        if err != nil {
            // 오류가 발생하면 메시지 수신 루프 종료
            log.Println("read message error: ", err)
            break
        }
         
        // 메시지가 수신되면 수신된 메시지를 몽고DB에 생성하고 모든 clients에 전달
        m.create()
        broadcast(m)
     
    }
    c.Close()
}
 
func (c *Client) writeLoop() {
    // 클라이언트의 send 채널 메시지 수신 대기
    for msg := range c.send {
        // 클라이언트의 채팅방 아이디와 전달된 메시지의 채팅방 아이디가 일치하면 웹소켓에 메시지 전달
        if c.roomId == msg.RoomId.Hex() {
            c.write(msg)
        }
    }
}
 
func broadcast(m *Message) {
    // 모든 클라이언트의 send 채널에 메시지 전달
    for _, client := range clients {
        client.send <- m
    }
}

readLoop() 메서드에서는 메시지 수신을 대기한다. 메시지가 전달되면 메시지를 생성하고(m.create()), 현재 접속 중인 모든 클라이언트에게 메시지를 전달한다(broadcast(m)). 만약 메시지를 읽어 들이는 과정에서 오류가 발생하면 루프를 빠져나와 클라이언트를 종료한다(c.Close()).

writeLoop() 메서드에서는 send 채널로 메시지가 전달되면, 메시지의 RoomId와 현재 클라이언트의 RoomId를 비교해서 일치하면 웹소켓으로 메시지를 전달한다(c.write(msg)).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.