안녕하세요! NewCodes입니다!
이번에는 그룹프로젝트 3주 차 회고를 해보겠습니다!!
어느덧 그룹프로젝트 절반이 끝났네요!
한 주 되돌아보면서 다음 계획을 짜보겠습니다.
🚀 week3 문제 해결 경험
week1, week2 성장 일지는 주로 ‘회고’스럽게 진행했었습니다.
week3에서는 문제 해결 경험을 ‘정리’한다는 마인드로 작성했습니다.
redis data modeling - 레디스에 데이터를 어떻게 저장할 것인가?
- 동기
- 우선 NoSQL 자체를 처음 써봤는데, 이를 잘 사용하기 위해서는 어떤 식으로 저장할지 설계가 필요하다고 생각함
- 마치 RDB에서 ERD 설계하는 것처럼
- 그래서 Redis를 본격적으로 사용하기 전에 아래와 같이 데이터 모델링을 진행함
- 과정
- Redis에서는 String 뿐만 아니라 다양한 자료구조를 지원하여 이를 최대한 활용하고자 함
- 특히 관련이 있는 데이터의 집합은 hash로 묶어줌
- 또, key는 : 으로 depth를 구분하고자 함. key를 통해서 어떤 데이터인지 더 확실히 알 수 있음
- 향후 개선
- 잘 설계된 것인지에 대해서는 아직 ?가 남아있음
- 레디스 관련 핵심 기능이 완료되면 잘 설계되었는지 다시 점검해보고자 함
- 현재는 게임방 관련 정보를 모두 레디스에 담고 있지만, 덜어내는 방안을 모색해보고자 함
- 결과
# 게임방 관련
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 작성 경험기
- 개요
- 이번 프로젝트에서 이전보다 더 테스트 코드를 작성하는 것에 신경 쓰고 있음
- 함께 작성하는 코드이다보니 유지보수 측면에서 테스트 코드를 작성하는 게 좋겠다고 판단
- 특히, 다른 사람이 작성한 코드를 쉽게 수정하기 위해서는 테스트 코드가 중요하다고 생각
- 과정
- 현재는 소켓 통신에 대한 통합 테스트 코드 위주로 작성했음
- 이번 주는 게임방 소켓 관련 로직을 redis로 옮기면서 통합 테스트 코드도 함께 수정했음
- 다른 팀원이 작성한 코드에 대해 테스트 코드를 작성하는 경험도 했음
- 테스트 코드를 작성하면서 어떤 부분이 수정되었는지 잘 파악할 수 있었음
- 그러면서 해당 팀원이 작성한 코드에서 잘못된 부분도 발견할 수 잇었음
- 특히, 이 과정에서 ioredis-mock 라이브러리를 사용했는데 redis keyspace notifications 기능이 지원 안 돼서 애를 조금 먹음. 결론은 메서드를 오버라이딩해서 원하는 동작을 추가시켜주는 걸로 해결.
- 이 과정에서 해당 라이브러리 소스코드를 직접 열어보며 확인함
- redis에서 지원하는 config 메서드를 지원하나? keyspace notifications 관련한 부분이 구현되어 있나? 등을 살펴봄
- 라이브러리 소스코드를 이렇게 필요에 의해서 자연스럽게 뜯어본 건 처음이라 신기했음
- 테스트 코드를 가성비 있게 작성하기 좋은 때 (이번에 느낀 점)
- 내가 작성한 코드를 처음으로 테스트해보려 할 때
- postman, console 등으로 테스트하는 건 휘발됨
- 반면, 테스트 코드는 계속 남아 우리의 코드를 지켜줌
- 다른 팀원이 수정한 코드에 대해 테스트를 작성할 때
- 어떤 부분이 수정되었는지 업무 파악과 함께 테스트 코드 작성까지 일석이조
- 내가 작성한 코드를 처음으로 테스트해보려 할 때
- 테스트 코드를 작성하는 건 시간 아깝다고 생각이 들 수 있는데, 아래의 경우일 때 하면 테스트 코드 작성하는 시간을 더욱 의미있게 보낼 수 있음
처음 클라우드 세팅 해보면서 배우기
- 마이크로 서버 내 was 세팅
- 주말에 처음부터 하나하나 세팅해봄
- 덕분에 클라우드, 네트워크 관련 지식이 향상됨
- VPC와 subnet
- ACG inbound, outbound
- NAT
- proxy
- [김상혁] 클라우드 마이크로 서버 세팅 및 배포
- 유료 서버 2개 (was, db) 세팅
- public subnet - nginx, was
- private subnet - redis, mysql
- ssh agent
- private subnet에 접근할 때 agent 기능을 통해 pem키 들고 갈 수 있음
redis에 있는 기능 활용해 게임 진행 설계하기
- redis pub/sub
- ex) 사용자의 위치 변경 처리할 때 쓰임
- redis keyspace notifications & expiration
- ex) 퀴즈 진행할 때 쓰임
- [Redis] Expiration과 Keyspace Notifications, redis 실무 사용 예시
1) 다중 서버에서의 사용자 소켓 연결
2) Redis key notifications를 이용하여 이벤트 구독
3) 한 사용자가 위치를 변경했을 때 알림
⭐️ 피드백
- 협업했을 때의 장점 -> 휴먼에러 감소
- 다음 주부터가 진짜 시작일 듯 (기술적 도전 측면에서)
- 이번 주도 팀 목표 잘 달성했음
- 4, 5주 차 계획은 더 잘 세워봐야 할 듯
- 매일 운동하기로 했는데 또 못 지킴 ㅎㅎ..
- 데모 발표 은근히 힘들었다!
- 20분간 30명 앞에서 발표했다.
- 그래도 발표 잘한 것 같다.
- 이번에 데모 보면서 느낀 점
- was를 private에 두는 선택지가 있구나.
- 성능 향상 경험 내 수치적인 근거 자료가 좋다.
- WebSocket이 아닌 Socket.io를 선택한 이유 다시 정리해봐야겠다.
- 향후 해볼 법한 기술적 도전 (아이디어들)
- https://youtu.be/SVt1-Opp3Wo?si=ySlolwqMVGH1O8_d
- https://tech.kakao.com/posts/391
- 게임 서버 레퍼런스 탐색
- redis 관련 로직 최적화하여 메모리 비용 절감하기
🎯 다음 주의 나에게
- 점심시간에 커피 사올 겸 산책하자.
- 의미 있는 것들을 남기려 노력하자.
'회고 > 네이버 부스트캠프 9기' 카테고리의 다른 글
[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 13주 차 회고 (그룹프로젝트 week5) (0) | 2024.11.30 |
---|---|
[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 12주 차 회고 (그룹프로젝트 week4) (0) | 2024.11.24 |
[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 10주 차 회고 (그룹프로젝트 week2) (0) | 2024.11.08 |
[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 9주 차 회고 (그룹프로젝트 시작!) (0) | 2024.11.03 |
[네부캠] 네이버 부스트캠프 웹・모바일 9기 - 멤버십 8주 차 회고 (학습 스프린트 끝!) (0) | 2024.10.19 |