본문으로 건너뛰기

퀴즈 팩 제작 가이드
#

앱에서 설치 가능한 “퀴즈 팩(.zip)”을 만드는 방법을 단계별로 설명합니다.
핵심은 간단합니다: 폴더 구조 지키기 → JSON 스키마 맞추기 → zip으로 묶기.

  • 이 가이드는 본 프로젝트의 합의된 스키마/동작을 기준으로 작성되었습니다.
  • 외부 표준이나 정책 정보가 필요한 경우, 정보가 부족합니다. 프로젝트 문서 또는 운영 가이드라인을 확인해 주세요.

1) 개요
#

  • 퀴즈 팩은 “zip 파일”입니다.
  • zip 루트에는 pack.json이 반드시 있어야 합니다.
  • 실제 퀴즈 데이터는 quizzes/ 폴더 아래 JSON 파일로 넣습니다.
  • 앱은 pack.json → quizzes[].file 경로를 따라 퀴즈를 읽습니다.

폴더 구조 예시

    my_quiz_pack/
      pack.json
      quizzes/
        vocab_basic.json
        vocab_intermediate.json

2) 준비물
#

  • 텍스트 편집기(UTF-8 저장)
  • JSON 검증 도구(IDE 내장 혹은 온라인 Validator)
  • 압축 유틸리티(zip)
  • (선택) Excel → JSON 변환용 파이썬 환경

3) pack.json 작성
#

pack.json은 “팩 메타 + 퀴즈 인덱스”를 담습니다. zip 루트(최상위)에 배치하세요.

예시

    {
      "packId": "vocab_bundle_ko",
      "title": "어휘 퀴즈 묶음(한국어)",
      "version": 1,
      "publisher": "YourNameOrTeam",
      "quizzes": [
        { "id": "vocab_basic", "title": "어휘 기초", "file": "quizzes/vocab_basic.json" },
        { "id": "vocab_intermediate", "title": "어휘 중급", "file": "quizzes/vocab_intermediate.json" }
      ],
      "hash": null,
      "signature": null
    }

필드 설명

  • packId: 팩 고유 식별자(영문/숫자/언더스코어 권장)
  • title: 팩 제목
  • version: 정수(새 버전은 +1)
  • publisher: 제작자/팀명(선택)
  • quizzes[]: 퀴즈 목록(각 항목은 id/title/file 필수)
  • file: zip 내부 상대 경로(예: quizzes/xxx.json)
  • hash/signature: 선택(무결성/서명. 운영 정책에 따라 사용)

실제 적용되면 설명(표시)

  • quizzes > title = Card title
  • quizzes > id = Card subtitle

주의

  • 경로는 반드시 “상대 경로”만 사용(절대경로, .. 금지).
  • 파일명은 정확히 pack.json이어야 합니다.

4) 퀴즈 JSON 스키마
#

앱이 이해하는 퀴즈 JSON(객관식 전용)입니다.

루트

    {
      "version": 1,
      "id": "vocab_basic",
      "title": "어휘 기초",
      "description": "영단어-뜻 매칭",
      "timeLimitSec": 300,
      "shuffleQuestions": true,
      "shuffleOptions": true,
      "questions": [ /* 문항 배열 */ ]
    }

문항(questions[])

    {
      "id": "q1",
      "type": "single",              // "single" | "multi"
      "text": "'abandon'의 뜻은?",
      "options": [
        { "id": "a", "text": "포기하다" },
        { "id": "b", "text": "증가하다" }
      ],
      "answers": ["a"],              // 정답 option id 배열(완전 일치)
      "explanation": "abandon = 포기하다",   // 선택
      "tags": ["vocab"],             // 선택
      "difficulty": 1                // 선택(정수)
    }

체크포인트

  • type은 “single” 또는 “multi”만 지원합니다.
  • answers의 id는 반드시 options[].id에 존재해야 합니다.
  • JSON은 UTF-8로 저장하세요.

5) Excel → JSON 변환(선택)
#

엑셀에서 아래 컬럼으로 작성 후 스크립트로 JSON을 만들 수 있습니다(프로젝트 제공 스키마 기준).

권장 컬럼

  • qid, type(single|multi), text, opt_a, opt_b, opt_c, opt_d, answers(a,b), explanation, tags, difficulty

샘플 행

    qid: q1
    type: single
    text: "'abandon'의 뜻은?"
    opt_a: "포기하다"
    opt_b: "증가하다"
    answers: "a"

워크플로

  1. 엑셀 작성 → 변환 스크립트로 JSON 생성
  2. 생성 JSON을 quizzes/ 에 배치
  3. pack.json의 quizzes[].file에 경로 등록

6) ZIP 만들기
#

macOS / Linux

    cd my_quiz_pack
    zip -r ../vocab_bundle_ko.v1.zip .

Windows PowerShell

    Set-Location my_quiz_pack
    Compress-Archive -Path * -DestinationPath ..\vocab_bundle_ko.v1.zip -Force

권장 파일명

  • packId.v<version>.zip (예: vocab_bundle_ko.v1.zip)

무결성 해시(선택)

    # macOS/Linux
    shasum -a 256 vocab_bundle_ko.v1.zip

    # Windows PowerShell
    Get-FileHash .\vocab_bundle_ko.v1.zip -Algorithm SHA256

해시값을 배포 페이지에 함께 표기하면 신뢰성이 높아집니다.


7) 앱에서 설치(사용자)
#

  • 파일 탐색기/메신저/메일/클라우드에서 zip을 “파일로 열기” → 앱이 인식하여 설치합니다.
  • 또는 앱의 “팩 관리” → “팩 가져오기(.zip)”에서 직접 선택합니다.
  • 설치 후 홈 목록에 팩의 퀴즈가 나타납니다.

8) 버전/운영 원칙
#

  • 같은 packId로 새 버전을 배포할 때는 version을 올리고 “새 파일명”으로 배포합니다.
    (예: vocab_bundle_ko.v2.zip)
  • quizzes[].id는 앱 전체에서 유일한 이름을 권장합니다(예: jp_n1_0001 형태).
  • 대용량 단어장도 앱이 “세션(10–25문항)”으로 자동 분할하여 부담을 줄입니다.

9) 자주 하는 실수(피하기)
#

  • pack.json을 루트가 아닌 하위 폴더에 둠 → 인식 실패
    → zip 루트에 pack.json 필수.
  • type에 임의 문자열 사용(예: “단일”, “복수”) → 파싱 에러
    → 반드시 “single” 또는 “multi”.
  • answers에 없는 option id 기재 → 채점/표시 오류
  • 경로에 절대경로/.. 사용 → 보안상 차단
    → 항상 상대 경로 사용.
  • JSON 문법 오류(쉼표/따옴표) → Validator로 확인 권장

10) 체크리스트
#

  • zip 루트에 pack.json이 있는가?
  • quizzes/ 폴더에 모든 퀴즈 JSON이 있는가?
  • pack.json의 quizzes[].file 경로가 실제 파일과 일치하는가?
  • 각 문항의 type은 single/multi만 사용했는가?
  • answers의 id가 options[].id에 존재하는가?
  • 파일은 UTF-8로 저장했는가?
  • zip 파일명은 packId.vN.zip 규칙을 따르는가?
  • (선택) SHA-256 해시를 제공하는가?

11) 템플릿(복사해서 시작)
#

pack.json
#

    {
      "packId": "your_pack_id",
      "title": "팩 제목",
      "version": 1,
      "publisher": "YourName",
      "quizzes": [
        { "id": "your_quiz_id", "title": "퀴즈 제목", "file": "quizzes/your_quiz.json" }
      ],
      "hash": null,
      "signature": null
    }

quizzes/your_quiz.json
#

    {
      "version": 1,
      "id": "your_quiz_id",
      "title": "퀴즈 제목",
      "description": "설명(선택)",
      "timeLimitSec": 0,
      "shuffleQuestions": true,
      "shuffleOptions": true,
      "questions": [
        {
          "id": "q1",
          "type": "single",
          "text": "문제 내용",
          "options": [
            { "id": "a", "text": "보기 A" },
            { "id": "b", "text": "보기 B" }
          ],
          "answers": ["a"],
          "explanation": "해설(선택)"
        }
      ]
    }

12) FAQ
#

  • Q. 이미지/사운드 자원도 함께 넣을 수 있나요?
    A. 현 버전 앱은 텍스트 중심입니다. assets/ 폴더에 자원 파일을 넣고 JSON에 경로를 추가해도 앱은 알 수 없는 필드를 무시하므로 스키마 호환성은 유지됩니다. 다만 표시 기능은 추후 앱 업데이트에 따라 달라집니다.

  • Q. 2,000+ 문항도 가능한가요?
    A. 가능합니다. 앱이 세션(10–25문항)으로 자동 분할하고, 새/복습 비율과 사용자 속도에 맞춰 적응형으로 출제합니다.

  • Q. 기존 팩을 업데이트하려면?
    A. 같은 packId로 version을 올린 새 zip을 배포하세요(파일명도 변경). 기존 파일은 보존합니다.(추천하지 않습니다)


자신만의 퀴즈 팩을 제작 행운을 빕니다! 🚀
궁금한 부분은 “문의하기” 메뉴를 통해 Github Issues 남겨 주세요.

가장 쉽게 하는 방법은 Excel 형식에 맞쳐서 Excel 만드시고, 퀴즈팩용 파일변환기 에서 zip 만들고 적용하시면 됩니다.