⚠ 이 페이지는 v0.1 (Notion v0.1 기반) 기록 보존본. 2026-05-22부터 teams/engineering/concepts/챌린지식-풀이-v0.2 (Notion v0.2 — 1차 MVP 핵심 채널, 대화형 위임)로 superseded (ADR-0009).
본문은 그대로 둠 (Karpathy "decisions are forever"). 현재 정책은 v0.2 페이지 참조. wiki/concept 페이지 v 단위 분리 정책: ADR-0010.
챌린지식 문제 풀이 (v0.1 — superseded)¶
1. 무엇 / 왜¶
학습 문제 풀이를 챌린지(스테이지/단계 진행) 메타포로 감싼다. 학생은 챌린지를 시작 → 문제별로 풀이 시도 → 막히면 teams/engineering/concepts/사고력-답변구조가 개입(5단계 힌트) → 통과/포기 상태로 종결한다.
핵심 동기는 Notion 본문 §8 시장 진입 전략에 명시:
6모 전후 오픈챌린지로 학생 유입 → 디에듀 AI 사용 경험 → 선생님 전환
즉 챌린지는 학생 획득 채널 + 사고력-답변구조의 실증 컨테이너 두 역할을 동시에 한다.
출처: raw/notion/ai-mvp-v0.1
2. 사용자 시나리오¶
학생 — 오픈챌린지 (비로그인 또는 무소속 학생)¶
/challenge진입 → 공개 챌린지 리스트- 챌린지 시작 → 문제 1 풀이
- 답 제출 → 채점 결과
- 막힘 → teams/engineering/concepts/사고력-답변구조 트리거 (1~5단계 힌트)
- 모든 문제 통과 또는 종료 → 결과 화면
학생 — 스터디룸 챌린지¶
- 위와 동일. 단, 챌린지가 자기 스터디룸 안에서 제공됨. 선생님이 진행도/사고 과정 열람 가능
선생님¶
- 스터디룸에서 챌린지 등록(또는 공개 챌린지 큐레이션) — 1차 MVP에서는 운영자가 시드 (선생님 출제 UI는 2차)
- 학생별 진행도/AI 상호작용 로그 열람 (AI Inbox 재사용)
3. 데이터 모델¶
별도 도메인 challenge로 신설. QnA와 직교(orthogonal) — 챌린지 풀이 중 막힘은 새 QnaContext를 만드는 대신 ChallengeAttempt에 QnaContext를 1:1로 연결.
| 엔티티 | 필드 (요약) |
|---|---|
Challenge |
id, title, description, visibility(PUBLIC/STUDYROOM), studyRoomId(nullable), authorId, createdAt |
ChallengeProblem |
id, challengeId, order, title, body(Tiptap JSON), expectedAnswer(or rubricRef), problemType(SHORT_ANSWER/MULTIPLE_CHOICE/OPEN_ENDED) |
ChallengeRubric |
id, problemId, criteria(JSON) — open-ended용 |
ChallengeAttempt |
id, challengeId, studentId, status(IN_PROGRESS/COMPLETED/ABANDONED), startedAt, finishedAt |
ChallengeProblemAttempt |
id, attemptId, problemId, status(PENDING/PASSED/FAILED/GIVEN_UP), answerSubmitted, hintLevelUsed(0~5), qnaContextId(nullable, FK) |
ChallengeScore |
id, attemptId, totalProblems, passed, failed, hintUsageScore, completedAt — view 또는 집계 테이블 |
4. Backend FRD¶
구현 명세 본문은 코드 옆 mvp-back:docs/frd/챌린지식-풀이/spec (Backend) + mvp-front:docs/frd/챌린지식-풀이/spec (Frontend) 에서 관리한다 (ADR-0004, ADR-0005). 본 페이지는 "왜·추상" 만 유지.
핵심 요약:
- 신규 도메인 challenge (Challenge, ChallengeProblem, ChallengeRubric, ChallengeAttempt, ChallengeProblemAttempt, ChallengeScore)
- API 9개 (공개 리스트/상세 2 + 학생 attempts·submit·hint·give-up 5 + 선생님 모니터링 2)
- Flyway V35~V39 (사고력-답변구조 V29~V34 뒤)
- 두 단계 상태머신 (Attempt: IN_PROGRESS→COMPLETED/ABANDONED, ProblemAttempt: PENDING→PASSED/FAILED/GIVEN_UP)
- 채점 분기: 객관식/단답=서버, open-ended=LLM
- /api/public/** permitAll (ADR-0008 예정)
- 막힘 → ChallengeProblemAttempt.qnaContextId lazy 생성 후 teams/engineering/concepts/사고력-답변구조 위임
세부 (엔티티 필드·SQL·서비스 클래스명·권한 분기): mvp-back:docs/frd/챌린지식-풀이
5. Frontend 화면/플로우¶
본 FRD는 backend 중심. Frontend 상세는 Track F.
후보 화면: -
/challenge— 공개 챌린지 리스트 (비로그인) -/challenge/[id]— 챌린지 상세 (시작 전 안내) -/challenge/[id]/attempts/[attemptId]— 풀이 진행 화면 - 단계 진행 인디케이터 (문제 N/M) - 막힘 → 사이드 패널에서 teams/engineering/concepts/사고력-답변구조 UI 재사용 - 결과 화면 (총점 + 사용한 힌트 단계 표시 → 사고력 점수 가시화)
6. 비기능¶
- 공개 챌린지 응답 시간: 리스트 < 200ms, 상세 < 300ms (Redis 캐시 후보)
- 시도 동시성: 한 학생이 동일 챌린지에 진행 중 시도는 1개만 (POST attempts 멱등성)
- 오픈챌린지 트래픽: 6모 시즌 일시적 spike 가능. 1차 MVP는 RDS · 단일 인스턴스 가정, 모니터링 알림 임계만 사전 설정
- 부정행위 방지: 1차 MVP 범위 외 (정답을 클라이언트로 보내지 않는 것까지만)
7. 관련 도메인¶
- teams/engineering/domains/challenge — 본 도메인
- teams/engineering/domains/qna — 풀이 중 막힘 시
QnaContextlazy 생성 + teams/engineering/concepts/사고력-답변구조 트리거 - teams/engineering/domains/studyroom — 스터디룸 visibility 챌린지
- teams/engineering/domains/member — 학생/선생님/운영자 권한
- teams/engineering/domains/homework — 챌린지와 별개 유지 (homework는 선생님 출제 + 1:1, 챌린지는 선생님 출제 외 글로벌 가능)
8. 관련 결정¶
- (예정) ADR-0006 — 챌린지 vs 과제(homework) 경계
- (예정) ADR-0007 — 비로그인 공개 엔드포인트 Spring Security 정책
- (참조) teams/engineering/concepts/사고력-답변구조 — 의존 컨셉
9. 출처¶
- raw/notion/ai-mvp-v0.1 — STEP 1 오픈챌린지 / STEP 2 선생님 전환
- raw/notion/ai-mvp-v0.1 — "기존 질문 / 과제에 AI 힌트 추가" — 챌린지에도 동일 패턴 적용
- raw/notion/ai-mvp-v0.1 — A. 학생 학습 경험 (챌린지가 실증 컨테이너)