[프리온보딩] 세번째 과제 회고

이동훈·2021년 11월 9일
0

프리온보딩

목록 보기
4/8

프리온보딩의 세번째 과제는 게임 제작게임 출시에 필요한 API들을 구현하는 것을 목표로 하고 있었다. 프로젝트가 실시간으로 반영되는 것을 구현해야 했기에 socket을 활용하기로 했다. 또한 필드 추가가 좀 더 용이한 mongoDB를 데이터베이스로 선택하기로 했다.

지난 과제에 대한 회고에서 각자 하나의 역할을 가져서 하니, 동기적으로 일이 진행되어 병목현상이 발생한다는 의견이 많았다. 그래서 이번엔 도메인 별로 2명씩 나누어 작업하는 방식을 택했다. 처음에 API 명세는 다같이 작업하고, 이후 게임제작, socket, 퍼블리시 3개의 파트로 나누어 진행하였다. 원활한 진행을 위해 socket은 기존에 socket을 다뤄본 적이 있던 팀원 2명이 맡기로 했고, 나는 퍼블리시 파트를 맡기로 했다.

이번엔 도메인 별로 나눴기 때문에, controller, service, error와 같은 하나의 api를 만들기 위한 전 과정을 작성해야 했다. 퍼블리시 파트를 함께한 팀원과 페어 프로그래밍 방식으로 진행해 보았는데, 같이 배워가는 입장에서 매우 좋은 선택이었다고 생각한다.

배웠던 점

  • mongoDB의 ODM인 mongoose를 활용했는데, query와 option 등 mongoose에서 제공하는 기능들을 많이 적용해보면서 하나하나 이해할 수 있었다. 특히 virtual 모델(collection에 정의 되지 않은 filed 이지만 정의된 field 처럼 사용할 수 있게 하는 기능)이 신기하면서도 이해가 잘 가지 않았는데, 좀 더 공부할 필요성을 느꼈다.

  • 추후 mongoDB의 query 중 countDocuments를 알게 되었는데, 단순히 count 값만을 돌려주는 로직이라면 아래와 같이 length method를 쓰는 방식을 택하지 않았을 것 같다. 또한 책임 분리를 위해 count 하는 함수를 따로 빼는 것도 좋았을 것이다.

// 좋아요 추가
exports.createGameLike = async (authorId, gameId) => {
  try {
    await Like.create({
      authorId: { _id: authorId },
      releaseId: { _id: gameId },
    });
	
    /** 이 부분을
    const likeCount = await Like.find({
      releaseId: { _id: gameId },
    });

    return likeCount.length;
    */
    
    // 이렇게 바꿔준다.
    const likeCount = await Like.countDocuments({
      releaseId: { _id: gameId },
    }).exec();
    
    return likeCount;
  } catch (err) {
    throw err;
  }
  // 이 로직을 따로 함수로 빼는 것도 고려해야 할 것이다.
};
  • 실시간 저장은 서버에 과부하를 줄 수 있는 요소이다. socket을 작성하신 팀원분들의 코드와 회고를 통해, 어떻게 성능 개선을 하려 노력하셨는지 배울 수 있었다.
    실시간 저장 성능을 위한 개선 방안 링크

아쉬웠던 점

  • 협업이 조금 더 원활히 진행된 것 같아 좋긴 했지만, 여전히 초반 세팅에서 다같이 하고 넘어갔으면 좋겠다는 부분은 있었다. model 코드가 그런 케이스인데, api 명세 정하고 나서 model 코드도 다같이 미리 작성하는 것이 조금 더 효율적일 것 같다는 생각이다.
profile
I will find a way, I always have.

0개의 댓글