목차


느낀 점

  1. 협업에서 모듈의 사양 합의가 돼있지 않을 때, 이에 대응하기 용이한 유연한 코드를 작성하는 방법
  2. MVP 내에서도 더 세부 단계에서 어디서부터 구현을 시작해야 하는지에 대한 고민
  3. 추상화를 통해 모듈 내부의 역할을 세부적으로 분리하는 방법
  4. Interface 등의 더 상위 추상화를 통해 모듈 간의 의존성을 줄이는 작업 검토의 필요성

진행 내용


진행 과정

Chat 모듈 구현

모듈 사양이 불명확할 때의 구현

clientManager.go
func (cm *ClientManager) CheckClient(sessionID string) bool {
  _, ok := cm.clients[sessionID]
  return ok
}

func (cm *ClientManager) GetClient(sessionID string) *Client {
  if !cm.CheckClient(sessionID) {
    fmt.Println("Client with sessionID", sessionID, "does not exist")
    return nil
  }

  return cm.clients[sessionID]
}

추상화를 통해 모듈의 작업 단위를 세부적으로 분리

room.go
func NewRoom() *Room {
  room := &Room{
    client_chan: make(map[*Client]*websocket.Conn),
    broadcast:   make(chan []byte),
    register:    make(chan *ClientConn),
    unregister:  make(chan *ClientConn),
  }

  go room.run()

  return room
}
roomManager.go
type RoomManager struct {
  rooms map[string]*Room
}

func GetRoomManager() *RoomManager {
  roomOnce.Do(func() {
    roomManager = &RoomManager{
      rooms: make(map[string]*Room),
    }
  })

  return roomManager
}

func (rm *RoomManager) CheckRoom(roomID string) bool {
  _, ok := rm.rooms[roomID]
  return ok
}

func (rm *RoomManager) GetRoom(roomID string) *Room {
  if !rm.CheckRoom(roomID) {
    fmt.Println("Room with roomID", roomID, "does not exist")
    return nil
  }

  return rm.rooms[roomID]
}

이후 진행 방향

  1. 현재 작성중인 포멧의 추가 구현
  2. Interface 등의 더 상위 추상화를 통해 모듈 간의 의존성을 줄이는 작업 필요성 검토

2024-04-09
카테고리로 돌아가기 ↩