본문 바로가기

Project

(23)
[간단한 퀴즈 서비스] 2차 개발 회고 배포와 기능 추가를 위한 2차 개발을 위해 2024년 9월 초부터 평일 9일간 09:30 ~ 12:30 코어 타임을 가졌었다.백앤드는 나 혼자이며 프론트는 1차 개발 때와 같이 세 분이서 담당해 주셨다.  이번에 했던 주요 활동들은 아래와 같다. AWS EC2, Rout53 등을 이용한 배포퀴즈 데이터 셋 서버 메모리에 JS map자료구조로 저장하던 것에서 DB 이관랭킹 정보 페이지네이션으로 표현과거에는 1~3등, 나의 랭킹 및 위, 아래 1명 랭킹만 보여줌무한 퀴즈 챌린지퀴즈에 틀릴 때까지 퀴즈를 계속 풀 수 있음 2주간의 코어 타임 동안에는 배포, 랭킹 정보 페이지네이션, 퀴즈 데이터 셋을 DB로 이관하였다.무한 퀴즈 챌린지 부분은 2주간의 코어 타임 이후에 본격적으로 진행되었다. 무한 퀴즈 챌린지는..
[간단한 퀴즈 서비스] 무한 퀴즈 챌린지 동작 과정 무한퀴즈 챌린지는 3,200여 개의 한국어 어휘 문제 세트를 기반으로 퀴즈를 틀릴 때까지 계속 풀 수 있는 방식의 퀴즈이다.한 문제당 15초의 제한 시간이 있으며, 확률은 낮지만(1/3200) 이전에 풀었던 문제도 다음 문제로 나올 수 있다.유저는 자신의 최대 연속 정답 횟수를 알 수 있으며, 몇 번 도전했는지를 알 수 있어야 한다.그러므로 서버에서는 각 도전별 연속 정답 횟수와 최대 연속 정답 횟수를 알 고 있어야 한다.무한 퀴즈 챌린지 동작 과정무한 퀴즈 챌린지 id 생성할 때 값 추가summary 테이블에는 도전 횟수를 1 증가 시킴현재 도전의 correct_streak(연속 정답 횟수)가 summary 테이블에 있는 것보다 클 때, summary 테이블에 있는 값을 갱신함detail 테이블에는 해..
[간단한 퀴즈 서비스] 무한 퀴즈 챌린지, 퀴즈 && 채점 고민 validateChallege() 메서드 어느 경우에나 다 동작하지 않는 문제점.validateChallege()에서 isChallengeActive flag 값을 확인하게 하였지만퀴즈 결과 api를 호출할 때는 isChallengeActive 값이 false이더라도 진행해야 함채점에서 틀린 경우 isChallengeActive 값을 false로 바꾸는데 퀴즈 결과 api에서도 isChallengeActive 값이 false일 때 처리하지 않는다면, 메모리에 있는 회원의 퀴즈 챌린지 기록을 DB에 저장할 수 없게 됨     https://github.com/DevSimpleQuiz/Backend/issues/65  출제된 문제와 채점에 온 문제가 동일한지 판단하는 방법 적용 필요 · Issue #65 ·..
[간단한 퀴즈 서비스] 서버시간 node로 띄운 서비스 시간이 서버의 시간이 서로 다름을 발견하였다왜 그런가 하니..node서버 시간의 경우 UTC를 기본으로 따라서 그러하다는 것을 발견하였다.이를 시간대가 다르게 나오는 상황을 KST시간대로 나오게 하기 위해 아래의 코드를 추가하여 보완하였다.   console.log("Server started at: ", new Date(Date.now() + KST_OFFSET)); // console.log(`Server started at: ${new Date(Date.now())}`);
[간단한 퀴즈 서비스] 무한 퀴즈 챌린지 설계 고려 문제를 틀릴 때까지 계속 문제를 제공해 주며, 몇 개 풀었는지, 도전을 몇 번 했는지를 기록한다. 고려사항 어떻게 n번째 도전과 n+1번째 도전을 구분할 것인가?구분할 고유 키 값은 어떻게 생성할 것인가?유저가 퀴즈 중간에 이탈하는 경우 어떻게 할 것인가?유저가 고유 키 값을 조작해서 퀴즈를 푸는 경우 어떻게 할 것인가?challengeId를 따로 빼두어서 조작하는 경우브라우저가 아닌 클라이언트로 접속하는 경우고유 키 값의 타임아웃을 어떻게 줄 것인가?mapredis고유 키가 타임아웃 난 것을 언제 판별할 것인가?무한 퀴즈 챌린지 퀴즈 api?퀴즈 제공할 때, 판별한다.퀴즈 문제를 제공할 때, 15초가 지났다면 기존 챌린지 id는 지우며, 새로운 챌린지 id로 발급해 준다.채점 api?채점에서 틀렸으면 ..
[간단한 퀴즈 서비스] 퀴즈 결과 api 에러 퀴즈 결과 api에서 에러가 발생하였다. try catch가 있음에도 의도대로 걸러지지 않았기에 무슨 일인가 알아보았다.트랜젝션 코드에 await를 하지 않고 써서 try catch {} 구문이 있음에도 에러가 발생하는 경우 제대로 감지하지 못하였다.await를 붙여 줌으로써 해결하였다. 런타임에 문제를 알게된 게 아쉬웠다..
[간단한 퀴즈 서비스] 회원탈퇴, 테이블 데이터 회원탈퇴 때 삭제되어야 할 데이터들이 무엇인지 고려해 보았다.   user테이블에서 해당 유저 정보, score 테이블에서 해당 유저의 퀴즈 기록, solved_quizzes  테이블에서 해당 유저가 풀었던 문제들, quiz_accuracy_statistics 퀴즈 문제별 풀었던 정보(정답 횟수, 전체 시도 횟수) 등등  quiz_accuracy_statistics의 경우 전체 통계로 사용되고 개인 정보가 남지는 않기에 탈퇴한 유저의 문제 시도 횟수를 남기는 것은 괜찮다고 판단하였다.그 외에 당연하지만 user, score, solved_quizzes 테이블에서 탈퇴 유저 정보는 지우기로 하였다. 탈퇴하고서 1~2년간 데이터를 보관하고 해당 유저가 계정복구를 하면 살려두는 방식이 있다고 듣기는 하였지..
[간단한 퀴즈 서비스] 퀴즈 데이터 DB 이관 1차 개발 당시 퀴즈 데이터 세트를 서버 map 자료구조에 저장해서 썼었다.메모리에 있으니 DB에 있는 것보다는 응답이 빠르겠지만 서버를 띄울 때마다 정제해 놓은 퀴즈 세트 excel 파일을 읽어서 메모리에 올려서 하는 방식을 계속 지속하기에는 데이터 관리 영구적으로 되는 것도 아니고 그렇다고 같은 메모리에 저장되지만 문제가 Redis처럼 관리되는 형태도 아니었기에 RDBMS 혹은 in-memory cache로 넘어가야 할 일이라 생각하였다.  기존 회원 데이터, 퀴즈 점수 등은 mysql로 관리되고 있었기에 퀴즈 데이터도 RDBMS로 관리하기로 하였다.Redis를 쓰면 빠르겠지만 AWS freetier유저라 작고 소박한 1GB짜리 EC2 서버에 여러 서비스를 띄우기에 서버에 지장이 되지 않을까 하여 가..
[간단한 퀴즈 서비스] 배포 3/3 결론부터 이야기하면 마침내 nginx 세팅을 여러 우여곡절을 거친 끝에 끝내고 https로 배포에 성공하였다.Intro https로 배포해야 했던 이유는 신뢰성 있는 통신 프로토콜로 서비스가 제공되게 하기 위한 어찌 보면 당연한 이유와쿠키에 담은 JWT 토큰을 읽어오기 위해 https 이거나, 같은 주소로 api 요청이 오가야 했지만처음에 EC2에 서비스를 올리기만 하고 nginx는 docker에서 띄운 설정이 제대로 동작하지 않아 http로만 서비스되었었고,도메인도 구매하지 않았기에 api에서 서버로 자원을 요청할 같은 주소가 아니라서 브라우저(크롬)에서 쿠키를 제대로 받아오지 못하는 이슈가 있었다. 이런 문제를 해결하기 위해 지난 포스팅에서 도메인 구매와 aws route53을 이용해서 도메인과 서버..
[간단한 퀴즈 서비스] 배포 2/3 가비아 도메인 구매기 잠을 덜 자고서 한 눈만 뜨며 도메인을 구매했더니 도메인 명의 철자를 틀려서 결국 멍청 비용이 발생했다..두 눈 떠지는 일이 발생하고 다시 꼼꼼하게 보고 아래와 같이 도메인을 구매했다  가비아에서 구매한 도메인과 배포한 서버의 IP를 맞추기 위해 AWS의 Route53 호스팅 영역에 네임서버 주소, EC2 주소 등을 설정해 주었다. 글과 사진은 단출하지만 여러 블로그를 보며 은근한 시행착오를 겪었다마침내 혹은 아마도 nginx 설정만 맞추어주면  https에서의 배포는 끝날 것으로 보인다.