[TIL] troubleshooting, 실전 프로젝트 계획, 테스트코드, MongoDB

김정호·2022년 3월 18일
0

Troubleshooting한 것 생각해보기

문제

방에 입장한 사람 수를 셀 때, socket 서버에서의 수, client에서의 수, DB에서의 수가 동기화되어야 한다.

과정

client에서 방 입장과 방 퇴장 API를 요청할 때마다 DB에서 인원수를 업데이트를 해주는 방식으로 진행을 했다. 이 경우 동기화가 깨질 수 있는 상황들이 존재했다.

  1. 방 카드를 클릭하는 것이 아닌, 링크를 입력해서 방에 입장하는 상황
  2. 나가기 버튼이 아닌, 뒤로 가기나 창 닫기로 방을 나가는 상황

해결

client에서의 API 요청이 아니라, socket서버에서 발생하는 이벤트에 따라 DB에 접근하여 인원 수를 업데이트해주는 방식으로 변경했다. 이를 통해 socket에 연결되고 연결해제되는 다양한 상황들에서 인원수를 동기화할 수 있었다.

실전 프로젝트 앞으로 3주간 진행할 것들 생각해보기

비밀방, 링크 공유 및 초대 기능

링크로 들어왔을 때 로그인 거쳐야 함

입장 가능한 방 보기 토글

무한 스크롤

테스트 코드 통과 후 자동 배포하는 기능 (CI/CD 보완)

영상 통화 서비스의 불안정성 해결

Peer.js 검토

구글 애널리틱스로 사용자 통계

구글폼을 통한 사용자 피드백 받기

영상과 타이머 싱크 개선

여러 기기에서의 호환성(모니터 크기, 아이패드)

테스트 코드 작성

it('내가 일주일에 몇 일 운동했는지 알 수 있다.', async () => {
        // 두 날짜 사이의 랜덤 날짜 생성 함수
        function randomDate(start, end) {
            return new Date(
                start.getTime() +
                    Math.random() * (end.getTime() - start.getTime())
            )
        }

        const weekStart = moment().startOf('isoWeek').toDate()

        // 5개의 랜덤 데이터
        const recordsDays = []
        for (let i = 0; i < 5; i++) {
            const record = await WorkOutTime.create({
                userId,
                createdAt: randomDate(weekStart, new Date()),
            })
            recordsDays.push(record.createdAt.getDay())
        }

        const countPerWeek = new Set(recordsDays).size

        const response = await request(app)
            .get('/myinfo/statistics')
            .set('Authorization', 'Bearer ' + token)

        await WorkOutTime.deleteMany({ userId })
        
        expect(response.body.countPerWeek === countPerWeek).equal(true)
    })

MongoDB에 관해 찾아보기

https://velog.io/@fancyer/MongoDB%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

profile
개발자

0개의 댓글

관련 채용 정보