본문 바로가기
회고/네이버 부스트캠프 9기

[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 11주 차 회고 (그룹프로젝트 week3)

by NewCodes 2024. 11. 16.

 

안녕하세요! NewCodes입니다!

 

 

이번에는 그룹프로젝트 3주 차 회고를 해보겠습니다!!

 

어느덧 그룹프로젝트 절반이 끝났네요! 

 

한 주 되돌아보면서 다음 계획을 짜보겠습니다. 

 

 


🚀 week3 문제 해결 경험

week1, week2 성장 일지는 주로 ‘회고’스럽게 진행했었습니다.
week3에서는 문제 해결 경험을 ‘정리’한다는 마인드로 작성했습니다.

redis data modeling - 레디스에 데이터를 어떻게 저장할 것인가?

  1. 동기
    1. 우선 NoSQL 자체를 처음 써봤는데, 이를 잘 사용하기 위해서는 어떤 식으로 저장할지 설계가 필요하다고 생각함
    2. 마치 RDB에서 ERD 설계하는 것처럼
    3. 그래서 Redis를 본격적으로 사용하기 전에 아래와 같이 데이터 모델링을 진행함
  2. 과정
    1. Redis에서는 String 뿐만 아니라 다양한 자료구조를 지원하여 이를 최대한 활용하고자 함
    2. 특히 관련이 있는 데이터의 집합은 hash로 묶어줌
    3. 또, key는 : 으로 depth를 구분하고자 함. key를 통해서 어떤 데이터인지 더 확실히 알 수 있음
  3. 향후 개선
    1. 잘 설계된 것인지에 대해서는 아직 ?가 남아있음
    2. 레디스 관련 핵심 기능이 완료되면 잘 설계되었는지 다시 점검해보고자 함
    3. 현재는 게임방 관련 정보를 모두 레디스에 담고 있지만, 덜어내는 방안을 모색해보고자 함
  4. 결과
# 게임방 관련
Room:<gameId> → Hash
- host: "host_id"
- status: "0"
- title: "게임 제목"
- gameMode: "모드1"
- maxPlayerCount: "4"
- isPublicGame: "1"
- isWaiting: "0"
- quizSetId: "4"
- quizCount: "10" #랜덤 10문제     
- lastAcitivityAt: #고인 방 삭제하기 위함

# 방 참가자 목록 
Room:<gameId>:Players → Set #중복방지
- members: [playerId1, playerId2, ...]

# 플레이어 정보 (241113 'Room:<gameId>' 삭제. playerId만을 가지고 어떤 게임방에 있는지 쉽게 파악하기 위함)
Player:<playerId> → Hash
- playerName: "player_nickname" #241112 nickname에서 playerName으로 변경함 (용어 맞추기 위해)
- positionX: "0.3"
- positionY: "0.2"
- disconnected: "0"
- gameId: "123456"


# 퀴즈셋 관련 (quizId는 DB quiz 테이블에 저장되어 있는 기본키)
Room:<gameId>:Quiz:<quizId> → Hash
- quiz: "퀴즈 내용"
- answer: "1"
- limitTime: "10"
- choiceCount: "4"

Room:<gameId>:Quiz:<quizId>:Choices → Hash
- 1: "보기1"
- 2: "보기2"
- 3: "보기3"
- 4: "보기4"


# 순위 리더보드
Room:<gameId>:Leaderboard → Sorted Set
- member: <playerId>
- score: <score>

# 현재 퀴즈 Id 저장
Room:<gameId>:CurrentQuiz -> String
(TTL 걸어둬서 타이머처럼 사용)
(NX 옵션 사용)

# 진행되어야 하는 퀴즈들 번호 순서대로 저장 
Room:<gameId>:QuizSet -> List
- quizId, quizId, quizId ...

 

 

integration test code 작성 경험기

  1.  
  2.  개요
    1. 이번 프로젝트에서 이전보다 더 테스트 코드를 작성하는 것에 신경 쓰고 있음
    2. 함께 작성하는 코드이다보니 유지보수 측면에서 테스트 코드를 작성하는 게 좋겠다고 판단
    3. 특히, 다른 사람이 작성한 코드를 쉽게 수정하기 위해서는 테스트 코드가 중요하다고 생각
  3. 과정
    1. 현재는 소켓 통신에 대한 통합 테스트 코드 위주로 작성했음
    2. 이번 주는 게임방 소켓 관련 로직을 redis로 옮기면서 통합 테스트 코드도 함께 수정했음
    3. 다른 팀원이 작성한 코드에 대해 테스트 코드를 작성하는 경험도 했음
      1. 테스트 코드를 작성하면서 어떤 부분이 수정되었는지 잘 파악할 수 있었음
      2. 그러면서 해당 팀원이 작성한 코드에서 잘못된 부분도 발견할 수 잇었음
    4. 특히, 이 과정에서 ioredis-mock 라이브러리를 사용했는데 redis keyspace notifications 기능이 지원 안 돼서 애를 조금 먹음. 결론은 메서드를 오버라이딩해서 원하는 동작을 추가시켜주는 걸로 해결.
      1. 이 과정에서 해당 라이브러리 소스코드를 직접 열어보며 확인함
      2. redis에서 지원하는 config 메서드를 지원하나? keyspace notifications 관련한 부분이 구현되어 있나? 등을 살펴봄
      3. 라이브러리 소스코드를 이렇게 필요에 의해서 자연스럽게 뜯어본 건 처음이라 신기했음
  4. 테스트 코드를 가성비 있게 작성하기 좋은 때 (이번에 느낀 점)
    1. 내가 작성한 코드를 처음으로 테스트해보려 할 때
      1. postman, console 등으로 테스트하는 건 휘발됨
      2. 반면, 테스트 코드는 계속 남아 우리의 코드를 지켜줌
    2. 다른 팀원이 수정한 코드에 대해 테스트를 작성할 때
      1. 어떤 부분이 수정되었는지 업무 파악과 함께 테스트 코드 작성까지 일석이조
  5. 테스트 코드를 작성하는 건 시간 아깝다고 생각이 들 수 있는데, 아래의 경우일 때 하면 테스트 코드 작성하는 시간을 더욱 의미있게 보낼 수 있음

 

처음 클라우드 세팅 해보면서 배우기

  1. 마이크로 서버 내 was 세팅
    1. 주말에 처음부터 하나하나 세팅해봄
    2. 덕분에 클라우드, 네트워크 관련 지식이 향상됨
      1. VPC와 subnet
      2. ACG inbound, outbound
      3. NAT
      4. proxy
    3. [김상혁] 클라우드 마이크로 서버 세팅 및 배포
  2. 유료 서버 2개 (was, db) 세팅
    1. public subnet - nginx, was
    2. private subnet - redis, mysql
    3. ssh agent
      1. private subnet에 접근할 때 agent 기능을 통해 pem키 들고 갈 수 있음

 

redis에 있는 기능 활용해 게임 진행 설계하기

  1. redis pub/sub
    • ex) 사용자의 위치 변경 처리할 때 쓰임
  2. redis keyspace notifications & expiration
    1. ex) 퀴즈 진행할 때 쓰임
  3. [Redis] Expiration과 Keyspace Notifications, redis 실무 사용 예시

 

1) 다중 서버에서의 사용자 소켓 연결

 

2) Redis key notifications를 이용하여 이벤트 구독

 

3) 한 사용자가 위치를 변경했을 때 알림

 


⭐️ 피드백

  1. 협업했을 때의 장점 -> 휴먼에러 감소
  2. 다음 주부터가 진짜 시작일 듯 (기술적 도전 측면에서)
  3. 이번 주도 팀 목표 잘 달성했음
  4. 4, 5주 차 계획은 더 잘 세워봐야 할 듯
  5. 매일 운동하기로 했는데 또 못 지킴 ㅎㅎ..
  6. 데모 발표 은근히 힘들었다!
    1. 20분간 30명 앞에서 발표했다.
    2. 그래도 발표 잘한 것 같다. 
  7. 이번에 데모 보면서 느낀 점
    1. was를 private에 두는 선택지가 있구나.
    2. 성능 향상 경험 내 수치적인 근거 자료가 좋다.
    3. WebSocket이 아닌 Socket.io를 선택한 이유 다시 정리해봐야겠다.
  8. 향후 해볼 법한 기술적 도전 (아이디어들)
    1. https://youtu.be/SVt1-Opp3Wo?si=ySlolwqMVGH1O8_d
    2. https://tech.kakao.com/posts/391
    3. 게임 서버 레퍼런스 탐색
    4. redis 관련 로직 최적화하여 메모리 비용 절감하기

 


🎯 다음 주의 나에게

  1. 점심시간에 커피 사올 겸 산책하자.
  2. 의미 있는 것들을 남기려 노력하자.