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. 결정 이력¶
- teams/engineering/concepts/챌린지식-풀이 §4 채택 (2026-05-20)
- teams/engineering/concepts/오픈챌린지-mvp — 백/프론트 MVP 완성 현황 (2026-05-26)
- (예정) ADR-0006 — 챌린지 vs teams/engineering/domains/homework 경계
- (예정) ADR-0007 — 비로그인 공개 엔드포인트 Spring Security 정책
9. 열린 질문 / TODO¶
- 챌린지 출제 UI — 1차 MVP는 운영자 시드만, 선생님 직접 출제는 2차
- 챌린지가 teams/engineering/domains/studyroom 안에 속하는지 글로벌인지 → visibility 컬럼으로 양립 (해소)
- teams/engineering/domains/homework 와의 경계 → 출제 주체·범위 다름으로 별개 유지 (해소, ADR-0006 예정)
- teams/engineering/domains/qna 와의 관계 →
ChallengeProblemAttempt.qnaContextIdlazy 생성 (해소) - 부정행위 방지 (정답을 클라이언트로 보내지 않음) 외 1차 MVP 범위 외
- 6모 시즌 트래픽 spike 대응 — 1차 MVP는 모니터링 알림만, 캐시·스케일은 2차