Skip to content

주관식 퀴즈의 서버 사이드 채점 + 클라이언트 사이드 채점 방식의 혼재에 따른 문제점 #49

@joonamin

Description

@joonamin

현재 배포 시점에 API 변경은 사이드이펙트가 우려되므로 시연 시후에 수정하는 것을 목표로합시다..!

퀴즈 진행 상황 동기화 로직의 데이터 정합성 이슈 및 개선 제안

  1. 문제 상황 (Current Problem)
    현재 QuizService.syncProgress 메서드는 클라이언트가 보낸 요청(SyncProgressRequest)을 그대로 신뢰하여 DB의 QuizUserProgress 엔티티를 덮어쓰고 있습니다.

totalQuestions는 서버 값 사용으로 수정되었으나, 성공(success) 및 실패(failure) 횟수는 여전히 클라이언트가 보낸 값을 그대로 저장합니다.
**서버 사이드 채점(QuizGradingService.grade)이 수행되어 DB의 success/failure가 증가하더라도, 이후 클라이언트가 동기화 API를 호출할 때 이전 상태(stale data)를 보내버리면 서버의 최신 채점 결과가 유실될 위험이 있습니다.

ex)

  1. 사용자가 퀴즈를 풀고 POST /grade API 호출 -> 서버가 채점 후 DB의 success를 1 증가시킴.
  2. 클라이언트 네트워크 지연 또는 로직 오류로 인해 success 증가 사실을 즉시 반영하지 못함.
  3. 클라이언트가 주기적 동기화 또는 화면 이동 시 PATCH /progress API 호출.
  4. 이때 클라이언트는 증가되지 않은 이전 success 값을 보냄.
  5. 서버는 클라이언트 값을 신뢰하여 DB의 success 값을 롤백해버림. (데이터 불일치 발생)

관련 PR

#48

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions