콘텐츠로 이동

Challenge (신규)

1. 한 줄 정의

학생이 단계별로 문제를 풀어 사고력을 단련하는 챌린지 도메인. 1차 MVP 핵심 채널 (Notion v0.2, ADR-0009). 오픈챌린지로 비로그인 학생 유입 + 스터디룸 챌린지로 선생님 전환의 이중 채널 역할. 막힘 발생 시 teams/engineering/concepts/사고력-답변구조-v0.2 (v0.2 대화형 코칭) 트리거.

2. 핵심 개념

  • Challenge — 챌린지 본체 (제목, visibility: PUBLIC/STUDYROOM, studyRoomId nullable)
  • ChallengeProblem — 챌린지 내 문제 (order, body, expectedAnswer, problemType)
  • ChallengeRubric — open-ended 문제 채점 기준
  • ChallengeAttempt — 학생 1회 시도 (status: IN_PROGRESS/COMPLETED/ABANDONED)
  • ChallengeProblemAttempt — 문제 단위 시도 (status: PENDING/PASSED/FAILED/GIVEN_UP, hintLevelUsed, qnaContextId FK)
  • ChallengeScore — 시도당 집계 (총점·통과수·힌트 사용 점수)

3. 관련 코드

아직 없음. 구현 명세는 mvp-back:docs/frd/챌린지식-풀이/spec (Backend) + mvp-front:docs/frd/챌린지식-풀이/spec (Frontend)에서 관리. 패키지 배치:

mvp-back/src/main/java/com/example/demo/
├─ domain/challenge/
├─ application/service/challenge/
├─ presentation/{controller,dto}/challenge/
└─ infrastructure/persistence/repository/challenge/

mvp-front route group: - (public)/challenge — 비로그인 공개 리스트 - (private)/challenge — 스터디룸 챌린지 + 진행

4. API 표면

구현 명세는 mvp-back:docs/frd/챌린지식-풀이/spec §2 + Frontend는 mvp-front:docs/frd/챌린지식-풀이/spec §3 참조. 주요 path 9개: - GET /api/public/challenges{,/{id}} — 비로그인 리스트·상세 - POST /api/student/challenges/{id}/attempts — 시도 시작 (멱등) - GET /api/student/attempts/{attemptId} — 진행도 - POST /api/student/attempts/{attemptId}/problems/{problemId}/{submit,hint,give-up} — 답 제출·힌트·포기 - GET /api/teacher/studyrooms/{id}/challenge-attempts — 선생님 모니터링 - GET /api/teacher/attempts/{attemptId}/log — 학생 AI 로그

5. 상태/생명주기

ChallengeAttempt:
  (없음) → IN_PROGRESS → COMPLETED       (모든 ProblemAttempt PASSED/GIVEN_UP)
                      → ABANDONED        (24h 무활동 배치)

ChallengeProblemAttempt:
  PENDING → PASSED        (답 일치 / rubric 통과)
         → FAILED         (오답, 재시도 가능)
         → GIVEN_UP       (5단계 힌트 후 give-up)

채점은 항상 서버 단일 진실원천. 클라이언트 결과 신뢰 ❌.

6. 외부 의존

  • LLM provider — open-ended 문제 채점 시 (ChallengeRubricScoringService)
  • LLM provider — 막힘 시 사고력 답변 (teams/engineering/concepts/사고력-답변구조 공유)
  • S3 — 문제 본문 이미지 첨부 가능성
  • Spring Security — /api/public/** permitAll 설정 필요 (ADR-0007 예정)

7. UI 노출

  • /challenge 공개 리스트 (비로그인)
  • /challenge/[id] 챌린지 상세 안내
  • /challenge/[id]/attempts/[attemptId] 풀이 진행 (단계 인디케이터 + 사이드 패널)
  • 결과 화면 — 사용한 힌트 단계까지 노출해 사고력 가시화
  • 디자인 시스템 (Tailwind v4 + 27개 UI + Tiptap) 활용

8. 결정 이력

9. 열린 질문 / TODO

  • 챌린지 출제 UI — 1차 MVP는 운영자 시드만, 선생님 직접 출제는 2차
  • 챌린지가 teams/engineering/domains/studyroom 안에 속하는지 글로벌인지 → visibility 컬럼으로 양립 (해소)
  • teams/engineering/domains/homework 와의 경계 → 출제 주체·범위 다름으로 별개 유지 (해소, ADR-0006 예정)
  • teams/engineering/domains/qna 와의 관계 → ChallengeProblemAttempt.qnaContextId lazy 생성 (해소)
  • 부정행위 방지 (정답을 클라이언트로 보내지 않음) 외 1차 MVP 범위 외
  • 6모 시즌 트래픽 spike 대응 — 1차 MVP는 모니터링 알림만, 캐시·스케일은 2차