현재 배포 시점에 API 변경은 사이드이펙트가 우려되므로 시연 시후에 수정하는 것을 목표로합시다..!
퀴즈 진행 상황 동기화 로직의 데이터 정합성 이슈 및 개선 제안
- 문제 상황 (Current Problem)
현재 QuizService.syncProgress 메서드는 클라이언트가 보낸 요청(SyncProgressRequest)을 그대로 신뢰하여 DB의 QuizUserProgress 엔티티를 덮어쓰고 있습니다.
totalQuestions는 서버 값 사용으로 수정되었으나, 성공(success) 및 실패(failure) 횟수는 여전히 클라이언트가 보낸 값을 그대로 저장합니다.
**서버 사이드 채점(QuizGradingService.grade)이 수행되어 DB의 success/failure가 증가하더라도, 이후 클라이언트가 동기화 API를 호출할 때 이전 상태(stale data)를 보내버리면 서버의 최신 채점 결과가 유실될 위험이 있습니다.
ex)
- 사용자가 퀴즈를 풀고 POST /grade API 호출 -> 서버가 채점 후 DB의 success를 1 증가시킴.
- 클라이언트 네트워크 지연 또는 로직 오류로 인해 success 증가 사실을 즉시 반영하지 못함.
- 클라이언트가 주기적 동기화 또는 화면 이동 시 PATCH /progress API 호출.
- 이때 클라이언트는 증가되지 않은 이전 success 값을 보냄.
- 서버는 클라이언트 값을 신뢰하여 DB의 success 값을 롤백해버림. (데이터 불일치 발생)
관련 PR
#48
퀴즈 진행 상황 동기화 로직의 데이터 정합성 이슈 및 개선 제안
현재 QuizService.syncProgress 메서드는 클라이언트가 보낸 요청(SyncProgressRequest)을 그대로 신뢰하여 DB의 QuizUserProgress 엔티티를 덮어쓰고 있습니다.
totalQuestions는 서버 값 사용으로 수정되었으나, 성공(success) 및 실패(failure) 횟수는 여전히 클라이언트가 보낸 값을 그대로 저장합니다.
**서버 사이드 채점(QuizGradingService.grade)이 수행되어 DB의 success/failure가 증가하더라도, 이후 클라이언트가 동기화 API를 호출할 때 이전 상태(stale data)를 보내버리면 서버의 최신 채점 결과가 유실될 위험이 있습니다.
ex)
관련 PR
#48