WIL8주차
이번 주 작업
저번 주에 이어서 웹소캣 프로그래밍 작업을 했다. 저번 작업이 로컬 내부에서 대부분 처리하는 것이라면 이번에는 redis를 사용하기 위해 다른 환경 설정들을 한 작업, redis를 통한 데이터 관리, 그 외에 사사로운 작업들을 했다.
- redis를 연결하는 과정
redis는 데이터베이스의 일종이라고 이해하고 있는데, 다른 DBMS에 비해서 압도적으로 빠른 속도를 가졌다는 것을 이용하기 위해서 사용해 보기로 했다.
그러나 redis는 linux에서 작동할 걸 상정하는 시스템이기 때문에 이걸 사용하기 위해서 docker를 사용해 보기로 했었다.
클릭하면 사이트로 이동합니다.
docker는 redis 같이 특정 운영체제에서 실행되는 기능들을 사용할 수 있게 해주는 가상 머신 같은 것인데, 여기서부터 조금 쎄한 느낌이 들긴 했다.
환경 설정들을 하고 보니 내 컴퓨터로는 메모리가 부족하다는 사실을 알게 되었다. 내 컴퓨터 메모리는 16G지만 그럼에도 메모리가 부족하여 폴더를 열거나 할 때 렌더링이 느리게 나타나는 현상이 나타났기 때문이다.
redis cloud 사용
그냥 redis local을 설치할까 고민도 했지만 위와 마찬가지 이유로 컴퓨터에 뭔가 더 설치를 하는 것은 지양하고 싶었기에 cloud를 사용해 보기로 했다.
redis 모듈 뿐만 아니라 redis-cli 라는 별도 모듈이 필요하다는 것도 알게 되었는데, 해당 것을 그냥 설치한다고 해서 되는 게 아니었다. 시행 착오 끝에 redis-cli를 사용하려면 global 하게 설정해야 한다는 걸 알게 되었다.
정확히 어떤 차이가 있는 것인지는 이해하지 못했으나 local로 설치할 때는 별다른 게 설치 안 되는 걸 보면 global로만 작동이 되는 모듈이 있다고 생각할 뿐이었다.
개선점
- 기왕 disconnect, end 등을 만들어 놓고선 잘 사용하지 않고 score 쪽에서 너무 많은 작업을 처리했던 것 같다.
score 쪽에서 최고 점수, 아이템 관리까지 해버리다 보니 다른 작업들에 세분화시키지 않았던 점에 가독성이 더 떨어졌던 것 같다.
예시로 보내준 코드처럼 기왕 handle로 분리를 해놓았다면 더 세분화시킬 걸 그랬다.
export const gameEnd = (uuid, payload) => {
const { timestamp: gameEndTime, score } = payload;
const stages = stageModel.getStage(uuid);
const userItems = getUserItems(uuid); // 유저 아이템을 가져오는 함수 가정
if (!stages.length) {
return { status: "fail", message: "No stages found for user" };
}
// 스테이지 기간 및 아이템 점수를 기반으로 총 점수 계산
const totalScore = calculateTotalScore(stages, gameEndTime, false, userItems);
// 점수 검증
if (Math.abs(totalScore - score) > 1) { // 허용 오차 범위 설정
return { status: "fail", message: "Score verification failed" };
}
// 나머지 게임 종료 로직...
};
- 신뢰성 보장 등을 제대로 못한 것 같다.
아이템 획득은 그저 아이템의 id 값만 가지고 구분했었는데, 외부에서 아직 열리지 않은 스테이지의 id 값을 임의로 테이블에 넣을 수 있다는 문제를 간과했다.
timestamp를 이용한 게임 시간 경과도 주의깊게 볼 걸 그랬다.
export const handleItemPickup = (userId, payload) => {
// 아이템 유효성 검증 로직...
addItem(userId, { id: itemId, timestamp }); // addItem 함수 호출
return { status: 'success', handler: 21 };
};
다음 주 할 것
계속 작업할 때마다 컴퓨터가 먹통이 되는 빈도가 늘어나는 것 같다. 컴퓨터 정리를 좀 해야겠다.