2026년 9월 6일 일요일

[바이브 코딩] 모자이크 퍼즐 퀴즈 & 발표 즉각 피드백 생성기 - 교실 몰입과 관찰 평가를 단 한 장으로



교과 맞춤형 이미지 퍼즐 퀴즈 & 발표 즉각 피드백 생성기

🧩 국어 발표, 사회 문화재 탐구, 영어 단어 퀴즈. 교과서 삽화나 사진을 16조각 모자이크 퍼즐(mosaic puzzle)로 가려두고 하나씩 열며 정답을 유추하는 역동적인 퀴즈 웹앱을 소개합니다.

학생 발표 직후 평정 척도 버튼을 누르면 성취 기준 기반 피드백(feedback) 문장이 즉시 조합되며, 평가 기록은 외부 전송 없이 로컬 장부로 안전하게 아카이빙됩니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
모자이크 퍼즐 퀴즈 정답 이미지를 4×4(16조각) 격자로 덮어두고 번호를 누를 때마다 한 조각씩 열립니다. 조각이 열릴 때마다 획득 점수가 줄어들어 학생들이 최소 힌트로 맞히려고 집중합니다. 사회 문화재, 과학 실험 기구, 영어 단어 사진을 심어두고 모둠별 스피드 추리 대결.
발표 관찰 즉각 피드백 발표 태도·전달력·내용 충실도 등 3대 영역의 평정 척도(상/중/하) 버튼을 누르면, 교육과정 성취 기준에 맞춘 구체적 격려 문장이 1초 만에 조합되어 화면에 뜹니다. 발표 직후 전자칠판에서 피드백 문장을 함께 확인하여 즉각적인 긍정 강화.
평가 기록 아카이빙 학생 관찰 평가 문장은 외부 클라우드로 전송하지 않고 브라우저 세션 메모리에 누적한 뒤, 수업 종료 시 교사용 CSV 파일로 다운로드합니다. 'CSV 내보내기' 버튼으로 수업 후 나이스(NEIS) 세특 관찰 기록 참고 자료로 활용.

2. 핵심 아키텍처 해설

① 도트 데이터: PUZZLES 상수

const PUZZLES = [
  { answer: "첨성대", hint: "신라의 천문대", imgData: "iVBORw0KGgo..." }
];

퀴즈의 핵심인 대표 이미지는 Base64(베이스64) 텍스트로 파일 안에 심어두는 방식을 씁니다 — 외부 이미지 링크가 완전히 없어도 사진이 사진으로 그려지는 심기 모드(데이터 임베딩)의 정석입니다.

② CSS 그리드 조각 마스킹

.tile {
  background-size: 400% 400%;
  background-position: calc(var(--x) * 100%) calc(var(--y) * 100%);
}
.tile.opened { opacity: 0; }

전체 이미지를 배경으로 쓰고 조각마다 배경 위치를 계산해 자르면, 외부 이미지 자르기 API가 필요 없습니다. 열린 조각은 투명도 0으로 처리합니다.

③ 피드백 조합 엔진

const FEEDBACK = {
  태도: ["차분한 시선 전달이 인상적입니다.", "청중을 향한 제스처가 아낌없습니다."],
  전달력: ["핵심 어휘를 강조하여 크게 들립니다.", "마침표마다 숨을 고르면 더 안정적입니다."],
  내용: ["근거 사례가 설득력 있습니다.", "자료를 내 말로 재구성한 노력이 빛납니다."]
};

function makeFeedback(picks) {
  return "🎯 " + picks.태도 + " " + picks.전달력 + " " + picks.내용;
}

관찰 결과를 조합한 상수 문장을 붙이는 구조 — 평가 기준이 코드에 명시되어 관찰 평가의 객관성이 확보됩니다.

④ 수업 몰입도를 높이는 사운드 설계

function sound(kind) {
  const ctx = audioCtx();
  const o = ctx.createOscillator();
  o.type = kind === "open" ? "triangle" : "square";
  o.frequency.value = kind === "open" ? 660 : 220;
  o.connect(ctx.destination);
  o.start(); o.stop(ctx.currentTime + 0.1);
}

조각을 열 때는 가벼운 삼각파를, 발표 피드백이 뜰 때는 낮은 사각파를 합성해 학생들의 귀가 화면을 따라가게 합니다.

⑤ 원칙·정합

단일 HTML·외부 통신 0. 학생 표기는 번호·닉네임만(이름 저장 0), 발표 관찰 기록은 세션 메모리에서 CSV 내보내기로 로컬 파일 저장 — 관찰 평가 장부는 학내망 안에서 완결됩니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini가 던지는 질문 3가지(과목, 조각 수, 피드백 영역)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '퍼즐퀴즈.html'로 저장 후 더블클릭으로 실행합니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·외부 CSS/JS 프레임워크·외부 이미지 호출 없이 단일 HTML 파일로 완성한다.
2. 퀴즈 이미지는 파일 상단 PUZZLES 상수에 Base64 텍스트로 내장하거나, 브라우저 로컬 파일 선택(<input type="file">)으로 읽어 표시하는 외부 통신 0 구조를 취한다.
3. 4×4 조각 마스킹은 CSS Grid와 background-position으로 구현하며, 조각을 누를 때마다 번호가 사라지고 이미지가 서서히 드러나게 만든다.
4. 조각 열기 사운드와 정답 판정 사운드는 Web Audio API로 자체 합성한다(오디오 파일 다운로드 금지).
5. 학생 발표 피드백 기능: 평가 영역 3가지(태도·전달력·내용)의 평정 버튼을 누르면 성취 기준 기반 피드백 문장이 즉시 화면에 조합된다.
6. 관찰 평가 결과는 학생 번호와 조합된 피드백 문장으로 세션 메모리에 누적되며, 'CSV 내보내기' 버튼으로 교사용 로컬 파일로 다운로드된다. 학생 실명은 저장하지 않는다.
7. 모바일·태블릿·전자칠판 터치 대응: 최소 터치 영역 48×48px 이상, 가로 스크롤 금지.
8. // TODO, /* 생략 */ 등 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 어떤 교과 단원(국어 발표, 사회 문화재, 과학 실험, 영어 어휘)을 중심으로 퀴즈를 구성할까요?
Q2. 모자이크 조각 수는 몇 단계(3×3, 4×4, 5×5)로 설정할까요?
Q3. 발표 피드백 영역에 추가하고 싶은 우리 학급만의 특별한 평가 항목이 있나요?

🎯 에디터 한줄평

"가려진 것을 하나씩 열어가는 순간, 학생들의 눈빛은 수업의 가장 깊은 곳으로 모여듭니다. 모자이크 퍼즐은 호기심을 극대화하고, 발표 직후 눈앞에 펼쳐지는 구체적인 피드백 문장은 학생에게 가장 따뜻하고 정교한 지도를 선물합니다. 외부 클라우드 없이 단일 파일과 로컬 CSV로 관찰 평가 장부까지 깔끔하게 지켜낸 설계 — 진정한 교실 맞춤형 에듀테크의 표본입니다."

📚 기술·교육 참고 링크

  • CSS Grid 가이드 : 4×4 모자이크 퍼즐 배치를 위한 순수 그리드 기법
  • Web Audio API 오실레이터 합성 : 외부 사운드 파일 없는 로컬 효과음 제작
  • 교육과정 평가 기준 : 교과별 관찰 평가 루브릭과 피드백 문장 설계 지침

[바이브 코딩] 다면적 자리 배치 & 모둠 협력 점수 대시보드 - 3대 대형 원클릭 전환과 공정한 학급 자치



다면적 자리 배치 & 모둠 협력 점수 대시보드

🪑 짝꿍 대형, 4인 분단 모둠, 전원 참여 'ㄷ'자 토의 대형. 수업 형태에 따라 교실 배치를 1초 만에 바꾸고, 당일 모둠 협력 점수까지 실시간으로 합산하는 다면적 자리 배치(flexible seating) 대시보드를 소개합니다.

시력 배려와 관계 분리 등 복잡한 조건을 알고리즘으로 자동 만족하며, 모든 데이터는 외부 전송 없이 교탁 전자칠판 안에서 안전하게 완결됩니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
3대 대형 원클릭 전환 강의식 2인 짝꿍, 협동학습 4~6인 분단 모둠, 전체 토의 'ㄷ'자 대형을 버튼 하나로 즉시 재배치합니다. 좌석 카드가 부드러운 애니메이션으로 이동해 학생들의 흥미를 끕니다. 국어 토론 시간에는 'ㄷ'자 모드, 과학 실험 시간에는 4인 모둠 모드로 전환하여 수업 전환 시간 단축.
조건 만족 자동 배정 앞자리 배려(시력), 짝 분리(관계) 등 민감한 배치 조건을 우선순위 알고리즘으로 먼저 처리한 뒤, 나머지 좌석을 무작위 셔플하여 공정성을 보장합니다. 학생들이 보는 앞에서 '자리 바꾸기' 버튼을 눌러 불만 없는 투명한 학급 자치 실현.
모둠 협력 점수판 자리 배치도 상단에 각 모둠의 협력 점수 카운터(+1, -1)를 결합하여, 수업 중 배려 행동과 협동 미션 성공 시 즉각적으로 점수를 누적합니다. 하루 1회 학급 다모임 시간에 당일 협력 점수를 결산하고 CSV 파일로 안전하게 백업.

2. 핵심 아키텍처 해설

① 학생 데이터 상수: 배려 조건 코드

const STUDENTS = [
  { no: 1, nick: "곰",  front: true,  apart: 5 },
  { no: 2, nick: "여우", front: false, apart: 0 },
  { no: 3, nick: "토끼", front: false, apart: 0 }
];

시력·키·성별 등 민감 정보를 따로 저장하지 않고 '앞자리 필요(front)', '분리 상대(apart)'라는 배려 조건 코드만 파일 안에 심습니다(정보의 최소 수집 원칙). 실명 대신 모둠 친구들만 아는 닉네임을 쓰면 웃픈 개인정보 사고가 아예 발생하지 않습니다.

② 조건 만족 셔플 알고리즘

function canSit(p, seat, placed) {
  if (p.front && seat.col > 2) return false;   // 앞자리 필요 → 앞 2열만
  for (const o of placed) {
    if (o.no === p.apart && isNeighbor(o.seat, seat)) return false;  // 인접 금지
  }
  return true;
}

function placeAll() {
  for (const p of byPriority(STUDENTS)) {
    const ok = SEATS.find(function (s) {
      return !occupied(s) && canSit(p, s, placed);
    });
    if (ok) place(p, ok);
    else report.push(p.nick + ": 조건 미충족 — 모둠 회의 제안");
  }
}

조건이 많은 학생부터 배정하고, 만족 못 하는 학생이 생기면 화면에 '모둠 회의 제안' 문구로 남깁니다 — 알고리즘의 한계를 학급 자치 논의로 연결하는 설계입니다.

③ CSS 애니메이션 자리 이동

.desk {
  transition: all .6s cubic-bezier(.2, .8, .2, 1);
  left: var(--x); top: var(--y);
}
.dae-mode .chart { transform: rotate(-90deg); }

좌석 카드 위치를 CSS 변수로 두고 대형 변경 시 변수만 바꾸면, 학생들이 보는 앞에서 교실이 자연스럽게 재배열됩니다. 'ㄷ'자 대형은 격자를 회전하는 트릭으로 처리합니다.

④ 모둠 점수 세션 메모리

const GROUP_SCORES = [0, 0, 0, 0];

function bump(groupIndex, delta) {
  GROUP_SCORES[groupIndex] += delta;
  sound(delta > 0 ? "coin" : "boop");   // Web Audio 합성
  drawScores();
}

모둠 점수는 세션 메모리(종료 시 소멸)로 관리하여 개인 식별 정보 저장을 방지하고, 하루 종료 시 CSV 내보내기 버튼으로 학급 점수 장부를 로컬 파일로 확보합니다.

⑤ 원칙·정합

단일 HTML·외부 통신 0, Apps Script·구글 시트 API 미사용. 배치도·모둠 점수 기록은 CSV 내보내기로 로컬 파일 저장 — 학급 시트 정리는 교사 수동으로 처리하며, 학생 개인 데이터는 학내망 밖으로 나가지 않습니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini가 던지는 질문 3가지(교실 격자, 대형 종류, 점수 규칙)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '자리배치.html'로 저장 후 더블클릭으로 실행합니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일 — 더블클릭 즉시 실행(서버·설치·회원가입·구글 시트 API·Apps Script 금지).
2. 학생 데이터는 파일 상단 STUDENTS 상수에 번호·닉네임만 담는다(실명·시력·키·성별 저장 금지). 배려 조건은 '앞자리 필요(front)'와 '분리 상대 번호(apart)' 코드만 사용한다.
3. 3가지 대형 모드(2인 짝꿍 / 4인 분단 모둠 / 'ㄷ'자 토의 대형)를 버튼으로 전환하며, 좌석 카드 이동에는 CSS transition 애니메이션을 적용한다.
4. 조건 만족 배정: 조건 많은 학생부터 우선 배정하고, 미충족자는 '모둠 회의 제안' 문구로 표시한다. 무작위 셔플은 모든 순서가 같은 확률이 되도록 한다.
5. 모둠 협력 점수판: 모둠별 +1/-1 버튼, 세션 메모리(새로고침 시 소멸) 기본값, 점수 변화에 Web Audio 합성 효과음.
6. 하루 종료 'CSV 내보내기' 버튼으로 배치도·모둠 점수를 로컬 파일 저장 — 자동 외부 전송 없음(학급 시트는 교사 수동).
7. 전자칠판 대형 터치 대응: 좌석 카드 64px 이상, 조작 버튼 88px 이상.
8. // TODO, /* 생략 */ 금지 — 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 교실 격자 크기는 몇 행 × 몇 열인가? (예: 5행 × 6열)
Q2. 분단 모둠은 몇 인으로 나눌까? (4인 / 6인)
Q3. 모둠 협력 점수의 가점·감점 규칙은 무엇인가? (예: 배려 +1, 잡담 -1)

🎯 에디터 한줄평

"자리 바꾸기 10분이 화면 클릭 3초로 줄어드는 순간, 그 시간은 순수하게 수업으로 돌아옵니다. 더 큰 가치는 '시력 배려'와 '관계 분리'를 코드 안에 조용히 심어두는 설계 — 민감한 정보를 저장하지 않고도 배려가 작동하는 것은 공정함의 가장 아름다운 형태입니다. 좌석 이동 애니메이션은 학생들에게 새 수업의 신호등이 되어, 물리적 재배치 자체가 즐거운 의식으로 변합니다."

📚 기술·교육 참고 링크

  • CSS transition & transform : 좌석 이동 애니메이션의 핵심 기술
  • 정보의 최소 수집 원칙 : 배려 조건 코드 설계 시 반드시 참고
  • 교육과정 연계 : 창의적 체험활동(학급 자치)·협동학습·수학(알고리즘 사고) 확장

[바이브 코딩] 교내 시설·장비 예약 관리자 - 중복 분쟁을 막는 단일 파일 예약 시스템



교내 시설물 신청 & 방송실 장비 대여 관리 웹앱

🏫 체육관, 과학실, 방송실 장비. 동료 교원이 스마트폰 화면에서 날짜·교시·장소를 선택하면 중복 예약이 즉시 감지되고 예약 현황표가 정리되는 경량 예약 관리자를 소개합니다. Apps Script 배포나 클라우드 설정 없이, 단일 HTML 파일 공유 하나로 시작됩니다.

예약 데이터는 세션 메모리(종료 시 소멸)를 기본으로 하고 'CSV 내보내기'로 당일 장부를 로컬 파일에 안전하게 아카이빙(archiving, 기록 보관)합니다 — 자동 외부 전송이 없어 학내망 원칙을 완벽히 지킵니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
중복 예약 즉시 감지 같은 날짜·교시·시설 조합이 이미 있으면 예약을 차단하고 '이미 예약된 시간입니다'를 안내합니다. 구두 요청으로 생기던 중복 사용 분쟁이 원천 사라집니다. 교무실 PC에서 열어두고 동료 교원이 필요할 때마다 직접 확인·예약.
현황표 실시간 렌더링 요일·교시 그리드에 예약 현황이 채워지고, 새 예약이 들어오는 즉시 화면이 갱신됩니다. 서버의 '실시간 동기화' 없이도 입력 즉시 반영으로 충분합니다. 화면 하단 'CSV 내보내기'로 당일 예약 장부를 로컬 파일로 안전하게 저장.
개인정보 최소 수집 예약자 표기는 부서·닉네임·번호만을 기본값으로 두고, 실명 기록이 꼭 필요한 경우에만 교무부가 선택하는 별도 모드로 한정합니다. 장비 대여는 '방송 장비 / 마이크 2개'처럼 장비 칸까지 명확히 입력.

2. 핵심 아키텍처 해설

① 시설·교시 데이터 상수

const FACILITIES = ["체육관", "과학실", "음악실", "방송실 장비"];
const PERIODS = ["1교시", "2교시", "3교시", "4교시", "5교시", "6교시", "방과후"];
const BOOKINGS = [];   // 세션 메모리 — 종료 시 소멸

교내 시설 목록과 교시 구조는 파일 상단 상수로 심기(임베딩)합니다 — 학내망 배포본은 외부 통신 없이 시작됩니다.

② 중복 감지 예약 함수

function isConflict(day, period, facility) {
  return BOOKINGS.some(function (b) {
    return b.day === day && b.period === period
      && b.facility === facility;
  });
}

function reserve(day, period, facility, who) {
  if (isConflict(day, period, facility)) {
    sound("nope");
    return { ok: false, message: "이미 예약된 시간입니다" };
  }
  BOOKINGS.push({ day: day, period: period,
    facility: facility, who: who, at: nowStamp() });
  sound("ok");
  drawChart();
  return { ok: true };
}

Array의 some으로 조건 충돌을 검사합니다 — 예약 기록에는 타임스탬프(timestamp)를 포함해 '누가 먼저 예약했는가'의 근거를 남깁니다.

③ 현황표 렌더링

function drawChart() {
  const grid = document.getElementById("chart");
  grid.innerHTML = "";
  FACILITIES.forEach(function (f) {
    PERIODS.forEach(function (p) {
      const cell = document.createElement("div");
      const found = BOOKINGS.find(function (b) {
        return b.facility === f && b.period === p;
      });
      cell.textContent = found ? found.who : "";
      cell.className = found ? "cell busy" : "cell";
      grid.append(cell);
    });
  });
}

시설 행 × 교시 열 그리드에 예약자 표기가 채워집니다. 새 예약이 들어올 때마다 이 함수가 다시 그려 '입력 즉시 반영'의 실시간이 실현됩니다.

④ 장부 아카이빙

function bookingCSV() {
  return BOOKINGS.map(function (b) {
    return [b.day, b.period, b.facility, b.who, b.at].join(",");
  }).join(";");
}
// 'CSV 내보내기' 버튼으로 로컬 파일 저장 — 자동 외부 전송 없음

하루 예약 장부를 CSV(쉼표로 구분한 값)로 내보내 교무부가 시트나 서류에 옮겨 적습니다. 서버·클라우드 연동이 없으므로 예약 정보가 학내망 밖으로 나가지 않습니다.

⑤ 원칙·정합

단일 HTML·외부 통신 0, Apps Script·구글 시트 API 미사용. 배포는 학내망 공유 폴더의 파일 경로(교내 메신저 바로가기에 파일 경로 등록)로 시작합니다 — 예약 정보는 세션 메모리에서 소멸되고, 장부는 로컬 CSV로 교무부가 관리합니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini가 던지는 질문 3가지(관리 시설, 교시 구조, 표기 방식)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행·배포 — 완성 코드를 '예약관리.html'로 저장, 교내 공유 폴더에 두고 교내 메신저에 파일 경로 바로가기를 등록합니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일 — 더블클릭 즉시 실행(서버·설치·회원가입·구글 시트 API·Apps Script 금지).
2. 시설·장비·교시 목록은 파일 상단 상수로 심기(학내망 배포용 외부 통신 0) — 교내 상황에 맞게 갱신하는 루틴을 주석으로 명시한다.
3. 중복 감지: 같은 날짜·교시·시설의 중복 예약을 즉시 차단하고 '이미 예약된 시간입니다'를 안내한다. 예약 기록에는 타임스탬프를 포함한다.
4. 예약 현황표: 시설 행 × 교시 열 그리드로 한눈에 보이게 하고, 예약 입력 즉시 화면을 다시 그린다(실시간의 정의 — 입력 즉시 반영).
5. 예약자 표기는 부서·닉네임·번호만을 기본값으로 한다(실명 모드는 교무부 선택 시에만). 개인정보는 최소 수집을 원칙으로 한다.
6. 'CSV 내보내기' 버튼으로 당일 예약 장부를 로컬 파일로 저장한다 — 자동 외부 전송 없음(시트 정리·공유는 교무부 수동).
7. 스마트폰·전자칠판 터치 대응: 선택 버튼 44px 이상, 360px 화면 가로 스크롤 금지. 사운드는 Web Audio API 합성(예약 완료 '똑', 중복 차단 '삑').
8. // TODO, /* 생략 */ 금지 — 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 관리 대상 시설·장비는 무엇인가? (체육관·특별실·방송 장비 등)
Q2. 교시 구조는 무엇인가? (1~7교시 / 방과후 연장 포함 여부)
Q3. 예약자 표기는 무엇으로 할까? (부서·닉네임 기본 / 실명 모드 필요 여부)

🎯 에디터 한줄평

"'누가 먼저 말했지?'라는 애매한 구두 순서가 '누가 먼저 눌렀는가'라는 명확한 눈금 경쟁으로 바뀌는 순간, 교내 시설 분쟁의 절반이 사라집니다. 중복 감지와 타임스탬프라는 두 개의 작은 코드가 분쟁 조정의 모든 손질서를 대체합니다. 그리고 Apps Script 배포 대신 '파일 공유 하나'로 시작하는 태도 — 행정 도구는 진입장벽이 낮을수록 전 교직원이 실제로 쓴다는 현장의 진실을 그대로 담았습니다."

📚 기술·교육 참고 링크

  • MDN — Array.some & Array.find : 중복 감지·현황 조회에 쓰이는 배열 탐색 기법
  • CSV(쉼표로 구분한 값) 서식 : 학급·교무 장부 데이터의 표준 교환 형식
  • 교육·행정 연계 : 시설 안전 점검 일정과 예약 시스템 결합 시 안전관리 강화

[바이브 코딩] 예체능 실기 평가 & NEIS 문구 변환기 - 관찰에서 세특 문장까지 원클릭 완성



초등 예체능·실기 수업 실시간 기능 평가 & 나이스(NEIS) 세특 변환 웹앱

🏃 체육 뜀틀·줄넘기, 음악 리코더 연주, 미술 판화 표현. 실기 수업 중에 교사가 태블릿을 들고 학생별 도달 수준(상·중·하)과 관찰 키워드를 터치하면, 수업 종료 즉시 나이스(NEIS) 세부능력 및 특기사항 문구로 자동 변환되어 엑셀로 내려받는 실기 평가 도우미를 소개합니다.

현장의 생생한 수행 장면을 그 자리에서 기록하여 평가 신뢰도를 100% 확보하고, 학기말 서술형 기록 작성의 심리적 부담을 획기적으로 덜어줍니다. 모든 평가는 외부 전송 없이 교사 태블릿 안에서 안전하게 완결됩니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
현장 즉시 터치 관찰 종이 평가 대장에 펜으로 적던 방식을 태블릿 원클릭 터치로 전환합니다. 학생 번호를 누르고 상·중·하와 관찰 태그를 누르면 3초 만에 1명 기록이 끝납니다. 체육관이나 음악실에서 교사용 태블릿을 들고 실기 수행 과정을 순회하며 실시간 평가.
나이스 세특 문장 자동 조립 수준별 기본 진술문에 관찰된 구체적 행동 특성 키워드를 자연스러운 한국어 문장으로 조립합니다. '상/중/하' 단순 평어가 풍부한 서술형 문장으로 탈바꿈합니다. 단원 종료 후 '세특 변환' 버튼을 눌러 학생별 완성 문장을 한눈에 확인하고 검토.
안전한 로컬 엑셀 다운로드 평가 데이터가 외부 클라우드나 사설 서버로 전송되지 않고, 태블릿 브라우저 메모리에서 엑셀(CSV) 파일로 직접 변환되어 내려받아집니다. 수업 종료 후 CSV 파일을 업무 PC로 옮겨 나이스 일괄 업로드 서식에 복사·붙여넣기.

2. 핵심 아키텍처 해설

① 관찰 요소 데이터 상수

const OBSERVE = [
  { tag: "참여도", good: "전 과정 참여", mid: "부분 참여", low: "도움 필요" },
  { tag: "기능", good: "기술 동작 안정적", mid: "기술 동작 연습 중", low: "기초 기술 습득" }
];

관찰 요소(태그)마다 수준별 핵심 문구를 상수로 정의합니다. 교사는 문장을 고민하는 대신, 현장의 진실을 대표하는 문구를 고르기만 하면 됩니다.

② 나이스 세특 문장 조립 엔진

function makeSentence(no, picks) {
  const head = picks.level === "상"
    ? "해당 단원의 기능과 태도를 우수하게 수행하였으며, "
    : picks.level === "중"
      ? "단원의 기본 기능을 성실히 연습하며, "
      : "기본 기술 습득을 위한 안내에 응하며, ";
  return no + "번 학생: " + head + picks.tags.join(", ") + "의 모습이 관찰됨.";
}

수준 판정(상·중·하)에 맞춰 문장 첫머리가 바뀌고, 터치로 골라낸 관찰 키워드가 뒤에 자연스럽게 이어집니다. 서술형 기록이 3초 만에 완성됩니다.

③ 반응형 관찰 폼

.grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
button { min-height: 64px; font-size: 18px; }

태블릿 한 손 조작에 최적화된 큰 터치 영역과 그리드 레이아웃으로, 점프하며 달리는 학생을 바라보면서도 오탈자 없이 기록할 수 있습니다.

④ CSV 데이터 아카이빙

function recordsCSV() {
  return RECORDS.map(function (r) {
    return [r.no, r.subject, r.level, r.tags.join(" "), r.sentence].join(",");
  }).join(";");
}
// 'CSV 내보내기' 버튼으로 로컬 파일 저장 — 자동 외부 전송 없음

누적 관찰 기록을 CSV(쉼표로 구분한 값)로 내려받아 나이스 붙여넣기 서식으로 활용합니다. 평가 데이터는 교사 태블릿 세션 안에서만 존재합니다.

⑤ 원칙·정합

단일 HTML·외부 통신 0. 학생 표기는 번호·닉네임만(실명 저장 금지), 평가 데이터는 세션 메모리에서 소멸되고 CSV 파일로만 보존됩니다. 나이스 자동 업로드 대신 '복사·붙여넣기' 절차를 명시해 학내망 원칙을 지킵니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini가 던지는 질문 3가지(교과·단원, 관찰 요소, 기록 서식)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '실기평가.html'로 저장 후 더블클릭. 태블릿에서 바로 관찰이 시작됩니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일 — 더블클릭 즉시 실행(서버·설치·회원가입·외부 클라우드·나이스 API 직접 연동 금지).
2. 학생 표기는 번호·닉네임만(실명·주민번호·연락처 저장 금지) — 명단은 파일 상단 상수로 심기(학내망 배포용 외부 통신 0).
3. 관찰 기록은 번호 터치 → 수준(상·중·하) 터치 → 관찰 태그 터치의 3단 원클릭 — 3초 안에 1명 기록 완료.
4. 나이스 세부능력 및 특기사항 문구는 수준별 첫머리 + 관찰 키워드 조립으로 자동 생성 — 단순 평어(상/중/하)만 남기지 않는다.
5. 'CSV 내보내기' 버튼으로 누적 기록을 로컬 파일 저장 — 자동 외부 전송 없음(나이스 반영은 교사가 직접 복사·붙여넣기).
6. 태블릿 터치 대응: 버튼 최소 64px, 360px 가로 스크롤 금지. 기록 완료 사운드는 Web Audio 합성('똑').
7. 평가 데이터는 세션 메모리(종료 시 소멸) — CSV 파일만 보존 수단으로.
8. // TODO, /* 생략 */ 금지 — 끝까지 완성.

[❓ 역질문 유도]
Q1. 어떤 교과·단원의 실기 평가인가? (체육 뜀틀·줄넘기 / 음악 리코더 연주 / 미술 표현)
Q2. 관찰 요소는 몇 개? (기본 3: 참여도·기능·태도 — 우리 학교 평가 기준에 맞춰 교체)
Q3. 기록 CSV 서식은? (번호,교과,수준,태그,문장 기본)

🎯 에디터 한줄평

'수업이 끝나고 밤에 쓰던 서술형 평가'가 '수업 중에 터치하던 3초 기록'으로 바뀌는 것 — 이 도구의 진짜 가치는 시간 절약보다 기록의 신선함입니다. 방금 본 장면의 단어가 곧바로 문장이 되니, 학기말의 기억에 의존한 어설픈 문장이 사라집니다. '나이스 자동 연동'을 지른 대신 복사·붙여넣기로 끊은 절약 설계도 개인정보 소양의 모범입니다.

📚 기술·교육 참고 링크

[바이브 코딩] 감정 날씨 체크인 & 관찰 대시보드 - 우리 반 정서 케어 단일 파일 앱



우리 반 1일 학생 감정 날씨 & 또래 관계망 관찰 대시보드

🌦️ 아침 등교 시 학생들이 교실 태블릿에 오늘의 감정 날씨(맑음·구름·비·천둥)와 한 줄 소감을 남기면, 교사 화면에는 감정 변화 추이와 관심 필요 학생이 색상별로 시각화되는 정서 케어 웹앱입니다.

학생용 간편 터치 모드교사용 비밀 통계 대시보드를 분리해 구동합니다 — 내 감정이 옆 친구 화면에 남지 않는 설계가 정직한 기록을 만듭니다. 모든 데이터는 교사 태블릿 안에서만 완결됩니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
10초 감정 체크인 아침 자리에 앉자마자 태블릿에서 감정 아이콘 하나, 한 줄 소감 하나 — 인사말 겸 정서 신호등이 매일 아침 켜집니다. 교실 입구 태블릿 스탠드에서 등교하며 순서대로 터치 체크인.
제출 즉시 초기화(프라이버시) 한 줄 소감을 제출하면 화면이 즉시 깨끗하게 지워집니다 — 다음 학생에게 내 감정과 문장이 보이지 않습니다. 입력 후 자동 초기화 루틴 확인 — 프라이버시가 곧 정직한 기록을 만듭니다.
교사용 비밀 대시보드 비밀번호 토글로만 열리는 통계 화면에서 감정 분포·추이·관심 필요 학생을 색상별로 확인합니다 — 학생 화면과 완전히 분리됩니다. 아침 인사 후 교탁 PC에서 대시보드 열어 오늘의 정서 지도 파악.
좌석 지도 감정 색 교실 좌석 지도(seat map) 위에 감정 색이 겹쳐 보이는 관찰 지도 — 또래 밀도와 분위기 흐름을 한눈에 읽습니다. 표기는 번호·닉네임만. 화·목요일에는 좌석 지도로 봐 — 특정 구역에 '비'가 몰리면 대화로 확인. 관심 필요 감지 '비·천둥'이 연속된 학생은 자동으로 관심 목록에 올라가 색이 진하게 표시됩니다 — 조기 발견이 상담의 첫 걸음. 연속 신호 학생에게는 아침 맞춤 개별 상담으로 연결(교사 수동 결정). 원칙·정합 단일 HTML·외부 통신 0, 실명 칸 없음(번호·닉네임), 소감 속 쉼표는 CSV 보호를 위해 가운뎃점(·)으로 자동 치환, 데이터는 세션 메모리 + 종료 시 CSV 내보내기(교사 보관). 금요일에 CSV 내보내기로 주간 정서 기록을 로컬 파일로 보관.

2. 핵심 아키텍처 해설

① 감정 날씨 상수

const MOODS = [
  { key: "맑음", color: "#ffe066", score: 2 },
  { key: "구름", color: "#c9d6df", score: 1 },
  { key: "비", color: "#8ab6d6", score: 0 },
  { key: "천둥", color: "#5c6b73", score: -1 }
];

감정을 날씨 말로 바꾼 이유는 간단합니다 — 날씨에는 맑음이 곧 '좋은 사람'이라는 뜻이 없습니다. 학생은 상태를, 교사는 흐름을 보게 됩니다.

② 학생 입력 + 즉시 초기화

function submitMood(no, moodKey, note) {
  LOG.push({ at: nowStamp(), no: no, mood: moodKey, note: note });
  document.getElementById("note").value = "";
  showThankYou();   // 제출 화면 3초 표시 후 홈으로
  sound("ding");
}

기록은 교사 태블릿 세션 안에만 쌓이고, 학생 화면은 남김없이 초기화됩니다 — '보였을 불안'이 없어야 진짜 감정이 나옵니다.

③ 교사용 비밀번호 토글

function openBoard(pin) {
  if (pin !== TEACHER_PIN) { sound("nope"); return false; }
  document.getElementById("board").classList.add("on");
  return true;
}
// TEACHER_PIN은 파일 상단 상수 — 학생 화면에는 절대 표시되지 않음

④ 관심 필요 감지

function careList() {
  return LOG.filter(function (m) {
    return m.mood === "비" || m.mood === "천둥";
  });
}
// 연속 저기분 번호는 대시보드에서 진한 색으로 표시

⑤ CSV 아카이빙과 원칙

function moodCSV() {
  return LOG.map(function (m) {
    return [m.at, m.no, m.mood, m.note.replace(",", "·")].join(",");
  }).join(";");
}
// 소감 속 쉼표는 가운뎃점으로 치환해 CSV 칸을 보호

주간 기록은 로컬 파일로 보관(자동 외부 전송 없음), 상담 연계는 교사의 수동 결정으로 남깁니다 — 감정 데이터는 도구가 판단하는 것이 아니라 사람이 확인하는 것입니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(감정 아이콘 종류, 대시보드 열림 방식, CSV 서식)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '감정날씨.html'로 저장 후 더블클릭. 학생 모드와 교사 모드가 한 파일 안에서 전환됩니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일 — 더블클릭 즉시 실행(서버·설치·회원가입·외부 클라우드 금지).
2. 학생 표기는 번호·닉네임만(실명·연락처 저장 금지) — 감정 데이터는 민감 정보이므로 화면 표시를 최소화한다.
3. 학생 모드: 감정 아이콘 4종 터치 + 한 줄 소감 입력 → 제출 즉시 화면 완전 초기화(다음 학생에게 표시 안 됨).
4. 교사 모드: 파일 상단 TEACHER_PIN 상수로 비밀번호 토글 — 학생 화면에는 절대 표시되지 않는 통계 대시보드.
5. 대시보드: 감정 분포(색상별), 좌석 지도(seat map) 위 감정 색, 연속 저기분 관심 목록(진한 색 표시).
6. 소감 속 쉼표는 가운뎃점(·)으로 자동 치환 — CSV 칸 보호. 'CSV 내보내기'로 로컬 파일 저장(자동 외부 전송 없음).
7. 태블릿 터치 대응: 감정 아이콘 최소 88px, 360px 가로 스크롤 금지. 사운드는 Web Audio 합성(제출 '딩', 오류 '삑').
8. // TODO, /* 생략 */ 금지 — 끝까지 완성.

[❓ 역질문 유도]
Q1. 감정 아이콘은 몇 종? (기본 4: 맑음·구름·비·천둥 — 학급 회의로 조정)
Q2. 대시보드 열림 방식은? (비밀번호 토글 / 이중 버튼 길게 누르기)
Q3. 주간 기록 CSV 서식은? (날짜,번호,감정,소감 기본)

🎯 에디터 한줄평

'오늘 기분 어때?'라는 물음이 '10초 체크인'이 되는 교실 아침 — 정서 케어의 시작은 대화이고, 이 도구는 대화가 필요한 학생의 조기 신호를 놓치지 않게 해줍니다. 제출 즉시 초기화와 비밀 대시보드의 이중 설계가 백미입니다. 도구가 학생을 판단하는 게 아니라, 교사가 신호를 확인하는 구조라는 점이 정서 교육의 올바른 자세입니다.

📚 기술·교육 참고 링크

  • MDN — Element.classList : 학생 모드·교사 모드 화면 전환
  • 교육과정 연계: 창의적 체험활동(정서·배려), 사회(공동체)와 함께 활용 — 상담 연계는 학교 전문 상담 체계에 따름

[학급 경영] 1일 1명언 플래시 카드 & 마음 챙김 - 자치 임원이 갱신하는 아침 루틴



월요일 아침, 임원이 명언을 심는다 — 1일 1명언 플래시 카드 & 마음 챙김 완전 정복

☀️ 학급 자치 임원들이 매주 월요일 캔바(Canva)로 명언 카드의 문구와 디자인을 만들면, 제미나이 프롬프트가 그 데이터를 심은 단일 HTML 플래시 카드 앱으로 바꿉니다 — 학생들이 등교 후 크롬북에서 카드를 뒤집고 '오늘의 다짐'을 한 줄 적는 아침 5분 루틴.

다짐은 기록이 아니라 마음 — 입력하면 화면에 잠깐 떠올랐다가 부드럽게 사라지는 연출(저장 0). 이어지는 '숨 고르기 3회' 가이드가 마음 챙김(mindfulness)의 첫 5분을 완성합니다. 단일 HTML·외부 통신 0.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
자치 임원 제작 루틴 월요일 아침 회의에서 임원이 명언 5개를 선정하고 캔바(Canva)로 문구·색을 다듬습니다. '우리 반의 말'이 카드가 되는 자치 활동입니다. 임원 회의 → 명언 선정 → 상수 갱신(1분).
플래시 카드 뒤집기 CSS 회전(rotateY)으로 3D 카드가 뒤집힙니다 — 앞면은 명언, 뒷면은 출처와 의미. 터치 한 번으로. 카드 클릭 → 뒤집기 → 출처 확인.
오늘의 다짐 한 줄 다짐을 입력하면 화면에 큰 글씨로 잠깐 떠올랐다가 부드럽게 사라집니다. 저장은 하지 않습니다 — 다짐은 누구의 것인지 남기지 않는 시간이기 때문입니다. 입력 → 연출 8초 → 화면 초기화.
마음 챙김 3회 호흡 원이 커졌다 작아지는 시각 가이드와 부드러운 숨 사운드(Web Audio sine)로 아침 5분을 마무리합니다. '숨 고르기' 버튼 → 원 크기에 맞춰 들쉬기.
원칙·정합 단일 HTML·외부 통신 0. 다짐·명언 데이터는 상수·세션으로만 존재(외부 전송 없음), 교실 앞 태블릿에 상시 대기 화면으로 띄워둡니다. EMBED_QUOTES 명언 상수 + 대기 화면.

2. 핵심 아키텍처 해설

① 명언 상수

const QUOTES = [
  { text: "천 리 길도 한 걸음부터", src: "옛말" },
  { text: "작은 일도 최선으로", src: "우리 반 약속" }
];

임원이 갱신하는 부분은 이 상수뿐 — 매주 월요일 1분의 심기 루틴입니다.

② 3D 뒤집기

.card { perspective: 800px; }
.card-inner.flipped { transform: rotateY(180deg); }
.face { backface-visibility: hidden; }
.back { transform: rotateY(180deg); }

③ 다짐 사라짐 연출

function showResolution(text) {
  banner.textContent = text;
  banner.style.opacity = 1;
  setTimeout(function () {
    banner.style.opacity = 0;   // 8초 후 부드럽게 소멸 — 저장 0
  }, 8000);
}

다짐을 서버나 시트에 남기지 않는 설계 — '남기지 않아야' 아이들이 자기 마음을 진짜로 적을 수 있습니다.

④ 마음 챙김 호흡

function breathCycle() {
  circle.style.transform = "scale(1.5)";   // 4초 들숨
  setTimeout(function () {
    circle.style.transform = "scale(1)";   // 4초 날숨
  }, 4000);
}

⑤ 원칙·정합

단일 HTML·외부 통신 0. 학생 이름 칸 없음, 다짐 텍스트는 8초 후 화면에서 사라지고 어디에도 저장되지 않음 — 감성 루틴이면서 가장 엄격한 프라이버시 보호를 동시에 지킵니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(명언 테마, 호흡 시간, 화면 톤)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '마음챙김.html'로 저장 후 교실 태블릿에 띄우기.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일로 완성한다.
2. 사운드는 Web Audio API로 직접 합성한다: 카드 뒤집기 소리('사각'), 다짐 등장 부드러운 피아노톤('사라라'), 숨 고르기 부드러운 sine파 숨소리('쉬으으', '하아아').
3. 모바일 터치 대응: 뷰포트 메타 태그 필수, 다짐 입력 필드 font-size 18px 이상, 360px 가로 스크롤 금지.
4. 파일 상단 QUOTES 상수에 명언 세트를 심는다: text(명언), src(출처). 데이터는 학내망 외부 호출 0.
5. 플래시 카드는 CSS transform(rotateY, perspective)으로 3D 뒤집기를 직접 구현한다.
6. 오늘의 다짐을 입력하면 8초간 큰 글씨로 표시했다가 부드럽게 사라지는 연출만 하고, 서버·localStorage·외부 저장소에 절대 저장하지 않는다.
7. 마음 챙김 호흡은 4초 들숨, 4초 날숨 3회 반복을 원 크기 애니메이션과 함께 보여준다.
8. // TODO, /* 생략 */ 같은 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 명언의 테마와 출처는? (옛말 / 우리 반 약속 / 유명 인물)
Q2. 숨 고르기 시간은? (기본 4초+4초, 3회 반복)
Q3. 화면 배경색 톤은? (부드러운 크림 / 학교 대표 색)

🎯 에디터 한줄평

'지시를 내리는 아침'이 '임원이 무대를 준비하는 아침'으로 바뀌었습니다. 명언을 골라 캔바로 다듬고 파일에 심는 임원의 1분이, 학급 자치의 가장 부드러운 시작이 됩니다. 다짐이 8초 후 사라지는 설계가 이 글의 꽃 — 기록되지 않아야만 진실하게 쓰는 마음이 있고, 마음 챙김 3회 호흡으로 그 진심이 아침의 첫 번째 문장이 됩니다.

📚 기술·교육 참고 링크

  • Canva 공식 사이트 : 명언 카드 디자인 도구 (디자인 제작 전용)
  • 교육과정 연계: 창의적 체험활동(학급 자치·정서 교육)과 함께 활용

[바이브 코딩] 교구·스마트패드 대여 관리자 - QR 스캔으로 미반납까지 자동 추적



교내 과학실·컴퓨터실 실습 교구 및 스마트패드 대여/반납 관리 포털

📦 전교 스마트패드 200대, 과학 실험 기구의 학급별 대여 현황·파손 여부·반납 일정을 교무실 태블릿에서 관리합니다. 기기 뒷면 QR을 비추면 브라우저 내장 바코드 감지(BarcodeDetector)가 읽어 대여·반납이 원클릭으로 기록됩니다.

Apps Script 배포와 구글 시트 연동 없이 단일 HTML 파일 공유로 시작합니다 — 기기 번호·대여 학급·타임스탬프는 세션 메모리에 쌓이고 'CSV 내보내기'로 로컬 장부가 남습니다(자동 외부 전송 없음). 미반납 목록은 자동 추출되어 분실을 원천 차단합니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
QR 스캔 원클릭 대여 기기 뒷면의 QR 코드를 태블릿 카메라로 비추면 기기 번호가 자동 입력 — 대여 학급을 누르면 기록이 끝납니다. 대여 신청이 몰리는 아침 출석 시간에도 대기 없이 빠르게 처리.
미지원 브라우저 폴백(fallback) 바코드 감지 API를 못 쓰는 브라우저에서는 기기 번호를 직접 입력하는 길을 자동으로 열어줍니다 — 도구가 멈추는 일이 없습니다. '스캔 실패 → 직접 입력' 전환 안내를 미리 경험해보기.
미반납 자동 추출 마감 시각이 지났는데도 대여 중인 기기 목록을 자동으로 정리해 진하게 경고합니다 — 분실이 대장 속에서 사라지지 않습니다. 방과 후 '미반납 확인' 버튼으로 잔여 기기를 한눈에 점검.
중복 대여 차단 대여 중인 기기를 다시 빌려주지 않습니다 — '이미 대여 중 + 대여 학급' 안내와 함께 즉시 차단되어 분쟁의 여지가 없습니다. 같은 기기 두 번 대여 시도로 차단 동작 확인. 파손 여부 체크 반납 시 파손 체크 박스를 누르면 상태가 '수리'로 전환되어 다음 대여 목록에서 자동으로 빠집니다. 파손 기기의 후속 처리(수리 신청) 연결 루틴 점검. 원칙·정합 단일 HTML·외부 통신 0·Apps Script 금지. 배포는 학내망 파일 공유(교무실 태블릿). 대여자 표기는 학급·닉네임(개인 실명 최소 수집), 기록은 세션 메모리 + 종료 CSV 내보내기. 금요일에 CSV 장부를 로컬 파일로 보관(외부 전송 없음).

2. 핵심 아키텍처 해설

① 기기 목록 상수

const DEVICES = [
  { id: "PAD-001", kind: "스마트패드", state: "재고" },
  { id: "PAD-002", kind: "스마트패드", state: "재고" },
  { id: "SCIENCE-01", kind: "현미경", state: "재고" }
];

② 바코드 감지(BarcodeDetector)

const detector = new BarcodeDetector({ formats: ["qr_code"] });

async function scanQR() {
  const codes = await detector.detect(video);
  if (codes.length > 0) return codes[0].rawValue;
  return "";   // 미감지 — 수동 입력 폴백(fallback)
}

태블릿 카메라 화면(video)에서 QR을 찾아 기기 번호를 문자열로 돌려줍니다. 카메라 접근 권한 안내 문구와 폴백 입력 칸이 함께 있어야 현장에서 멈추지 않습니다.

③ 대여·반납과 중복 차단

function borrow(id, className) {
  const d = DEVICES.find(function (x) { return x.id === id; });
  if (d.state === "대여") {
    sound("nope");
    return "이미 대여 중: " + d.who;
  }
  d.state = "대여"; d.who = className; d.at = nowStamp();
  sound("ok");
  drawChart();
}
function giveBack(id, broken) {
  const d = DEVICES.find(function (x) { return x.id === id; });
  d.state = broken ? "수리" : "재고"; d.who = "";
  drawChart();
}

④ 미반납 자동 추출

function overdueList(deadline) {
  return DEVICES.filter(function (d) {
    return d.state === "대여" && d.at < deadline;
  });
}

마감 시각(deadline)을 지나도 '대여' 상태인 기기만 골라 목록으로 보여줍니다 — 분실은 대장 속에서 사라지지 않습니다.

⑤ CSV 아카이빙과 원칙

function deviceCSV() {
  return DEVICES.map(function (d) {
    return [d.id, d.kind, d.state, d.who, d.at].join(",");
  }).join(";");
}
// 'CSV 내보내기'로 로컬 장부 저장 — 자동 외부 전송 없음

기기 번호·종류·상태·대여처·시각이 한 줄씩 누적되고, 시트 정리와 공유는 교무부의 수동 관리로 남습니다. 대여자 표기는 학급·닉네임 기본값으로 개인 실명 수집을 최소화합니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(관리 기기, 대여 단위, CSV 서식)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '대여관리.html'로 저장 후 더블클릭. 교무실 태블릿이 곧 대여 대장이 됩니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일 — 더블클릭 즉시 실행(서버·설치·회원가입·구글 시트 API·Apps Script 금지).
2. 기기 목록은 파일 상단 상수로 심기(학내망 배포용 외부 통신 0) — 새 기기 추가 시 상수 갱신 루틴을 코드에 명시.
3. QR 인식은 브라우저 내장 BarcodeDetector API로 — 미지원 브라우저는 기기 번호 직접 입력 폴백(fallback) 필수.
4. 중복 대여 즉시 차단: 대여 중 기기는 '이미 대여 중 + 대여 학급' 안내. 반납 시 파손 여부 체크 박스 필수.
5. 미반납 자동 추출: 마감 시각 지나면 미반납 목록 정리 + 진한 색 경고 화면.
6. 대여자 표기는 학급·닉네임만(개인 실명 최소 수집) — 'CSV 내보내기'로 로컬 장부 저장(자동 외부 전송 없음, 시트 정리는 교무부 수동).
7. 태블릿 터치 대응: 스캔 버튼 88px 이상, 현황 그리드 큰 글씨. 사운드는 Web Audio 합성(대여 '똑', 차단 '삑').
8. // TODO, /* 생략 */ 금지 — 끝까지 완성.

[❓ 역질문 유도]
Q1. 관리 기기는 무엇인가? (스마트패드 200대 / 과학 기구 / 방송 장비)
Q2. 대여 단위는? (학급별 / 교사별)
Q3. CSV 서식은? (기기번호,종류,상태,대여처,시각 기본)

🎯 에디터 한줄평

'누가 가져갔지?'를 쓰던 대장 한 권이 '똑·삑' 두 소리의 대여 흐름으로 바뀝니다. 바코드 한 장이 수기 대장을 은퇴시키는데, 이 글의 진짜 디테일은 폴백(fallback)입니다 — 스캔이 안 되면 직접 입력이라는 둘째 길이 항상 열려 있어야 현장 도구는 멈추지 않습니다. 미반납 자동 추출로 마감 점검이 습관이 되는 것도 물품 관리의 미학입니다.

📚 기술·교육 참고 링크

  • MDN — Barcode Detector API : 브라우저 내장 바코드 감지 공식 문서
  • 교육·행정 연계: 실험 안전 수칙·물품 관리 지침은 학내망 공개 자료 기준으로 병행 활용

[교과 연계] 문화유산·한살이 매칭 교구 - 캔바 카드를 파일에 심는 매칭 게임



문제 만드는 사람이 개념을 갖는다 — 문화유산·한살이 매칭 교구 완전 정복

🏛️ 3~4학년 사회 '우리 고장의 문화유산', 과학 '식물의 한살이' 단원. 학생들이 캔바(Canva)로 문화유산 사진 카드와 설명 문구, 씨앗-싹-꽃-열매 그림을 만들면, 그 카드를 파일 안에 심어 두 가지 게임으로 완성합니다 — 사진과 설명을 짝 맞추는 매칭(matching) 게임, 한살이 순서 정렬 게임.

역할을 둘로 나누면 장점만 남습니다 — 캔바는 디자인 도구, 제미나이는 실행 앱. 캔바에서 내려받은 카드는 Base64(베이스64) 텍스트로 파일 안에 심어 학내망 원칙(외부 호출 0)을 지키고, 전자칠판 토너먼트(tournament)까지 단일 파일에서 진행됩니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
제작자 관점 수업 문제 푸는 사람이 아니라 문제 만드는 사람 — 개념이 게임 데이터가 되는 순간 내면화됩니다. 카드 문구를 직접 고르고 다듬는 과정이 곧 단원 학습입니다. 모둠별 카드 5장 만들기 → 전체 카드 뭉치 합치기.
두 게임 엔진 ① 사진↔설명 짝 맞추기 ② 씨앗-싹-꽃-열매 순서 정렬 — 하나의 파일에서 탭으로 전환됩니다. match 판정과 checkOrder 순서 검사 코드.
캔바 이미지 심기 캔바에서 이미지 내려받기 → Base64(베이스64) 변환 → 파일 상단 상수로 심기. 외부 이미지 링크는 절대 금지 — 학내망 원칙과 저작권 걱정을 함께 끝냅니다. 심기 갱신 루틴: 이미지 변환 → 상수 붙여넣기.
전자칠판 토너먼트 모둠별 최단 기록 경쟁 — 스톱워치와 신기록 팡파르(Web Audio)로 전자칠판이 무대가 됩니다. 모둠 기록표 화면.
원칙·정합 단일 HTML·외부 통신 0. 학생 표기는 모둠 번호·닉네임만(실명 금지). 캔바의 '웹사이트로 게시' 링크는 외부 서비스라 — 학내망 배포용은 파일 심기 방식 권장(캔바 사용 자체는 학교 정책 기준). 단일 파일 배포 + 학급 공유 폴더.

2. 핵심 아키텍처 해설

① 카드 데이터 상수

const CARDS = [
  { id: "불국사", kind: "img", b64: "iVBORw0KGgo..." },
  { id: "불국사", kind: "desc", text: "신라의 대표 사찰" },
  { id: "첨성대", kind: "img", b64: "iVBORw0KGgo..." },
  { id: "첨성대", kind: "desc", text: "신라의 천문대" }
];

한 개념(문화유산)이 사진(img)과 설명(desc)의 두 카드로 나뉘어 심깁니다 — id가 짝을 잇는 열쇠입니다.

② 매칭 판정

function match(a, b) {
  return a.id === b.id && a.kind !== b.kind;
}

③ 한살이 순서 정렬

const STAGES = ["씨앗", "싹", "꽃", "열매"];

function checkOrder(picks) {
  return STAGES.every(function (s, i) {
    return picks[i] === s;
  });
}

'싹'과 '열매'를 섞어 놓고 순서를 잡는 과정 자체가 식물의 한살이 단원의 개념 학습입니다.

④ 토너먼트 기록

function recordTime(group, seconds) {
  BEST[group] = Math.min(BEST[group] || 999, seconds);
  sound("bell");   // 신기록 팡파르 — Web Audio
}

⑤ 원칙·정합

단일 HTML·외부 통신 0. 학생 표기는 모둠 번호·닉네임만(실명 금지), 기록은 세션 메모리(종료 시 소멸). 캔바의 '웹사이트로 게시' 링크는 외부 서비스에 접속하는 방식이라 학내망 배포용에는 쓰지 않고, 이미지·문구를 파일 안에 심는 방식으로 완결합니다. 사진·음악 저작물은 학생 창작물 또는 학내망 공개 자료만 사용합니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(단원 데이터, 토너먼트 방식, 카드 톤)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '매칭교구.html'로 저장 후 더블클릭. 캔바 카드를 심고 전자칠판 토너먼트로.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·프레임워크·웹폰트 없이 단일 HTML 파일로 완성한다.
2. 사운드는 Web Audio API로 직접 합성한다: 짝 성공 시 맑은 종소리('딩동'), 오답 시 둔탁한 '쿵', 신기록 달성 시 팡파르 화음. 오디오 파일·CDN 사용 금지.
3. 모바일 터치 대응: 뷰포트 메타 태그 필수, 카드 최소 60×60px, 360px 화면에서 가로 스크롤 금지.
4. 카드 데이터는 파일 상단 CARDS 상수에 심는다: id(공통 키), kind('img' 또는 'desc'), b64(Base64 텍스트) 또는 text. 외부 이미지 URL은 절대 사용하지 않는다(학내망 원칙 외부 호출 0).
5. 짝 맞추기(id 일치 && kind 불일치)와 한살이 순서 정렬(STAGES 배열 순서 일치) 두 모드를 상단 탭으로 전환할 수 있도록 만든다.
6. 학생 표기는 모둠 번호·닉네임만 취급하고, 토너먼트 기록은 세션 메모리로 관리한다(종료 시 소멸).
7. // TODO, /* 생략 */ 같은 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 사회 문화유산 카드와 과학 식물의 한살이 중 어떤 단원을 기본으로 띄울까?
Q2. 토너먼트 방식은? (A: 최단 시간 타임어택 / B: 최소 시도 횟수 경쟁)
Q3. 카드 뒷면 디자인 톤은? (파스텔 단색 / 모눈 패턴)

🎯 에디터 한줄평

개념을 외우는 가장 확실한 방법은 '이걸로 남을 헷갈리게 만들 퀴즈를 짜보는 것'입니다. 캔바에서 문화유산 사진과 설명을 골라 짝으로 엮고, 씨앗부터 열매까지의 순서를 카드 데이터로 조립하는 순간, 학생은 소비자가 아니라 설계자가 됩니다. 캔바가 만든 아름다운 시각 자료를 파일 안에 심어 학내망 원칙까지 단단히 지킨 교구 — 교실 전자칠판 토너먼트에서 환호성이 터질 수밖에 없는 구조입니다.

📚 기술·교육 참고 링크

  • Canva 공식 사이트 : 카드 템플릿 디자인 도구 (디자인 제작 전용)
  • 교육과정 연계: 사회 3~4학년(우리 고장의 문화유산), 과학 3~4학년(식물의 한살이)과 함께 활용

[행정/연구 업무] 이중언어 낱말카드 포털 - 3분 만에 만드는 다문화·기초학력 개별 교구



한국어와 모국어가 함께 열린다 — 이중언어 낱말카드 포털 완전 정복

🌏 다문화 가정 및 한글 미해득 학생을 위한 개별 맞춤 지도. 교사가 캔바(Canva)로 제작한 그림 카드와 함께, 한국어와 학생의 모국어(베트남어, 러시아어 등) 단어·음성을 한 장에 담은 이중언어 플래시 카드 포털을 3분 만에 생성합니다.

핵심 기술은 2중 음성 재생(TTS) — 한국어와 모국어 음성을 localService 로컬 음성으로만 연속 재생(외부 전송 0). 해당 언어 로컬 음성이 없을 때는 시각 발음 기호로 대체하는 폴백(fallback) 설계까지 갖췄습니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
3분 맞춤 제작 시판 이중언어 교구는 언어가 맞지 않거나 어휘가 어렵습니다. 교사가 캔바로 그림을 고르고 단어 5개만 상수에 넣으면 우리 아이 맞춤형 포털 완성. 교과 어휘 5단어 심기 → 개별 지도.
2중 음성 재생 카드를 누르면 '사과' 한국어 발음 → 0.6초 후 'Táo' 베트남어 발음이 연속으로 나옵니다. 로컬 음성만 골라 쓰므로 학생 정보가 나가지 않습니다. '두 언어로 듣기' 버튼.
음성 부재 대처 (폴백) 학교 컴퓨터에 베트남어 음성이 없을 수 있습니다. 그럴 땐 앱이 스스로 감지해 시각 발음 기호(로마자)를 크게 표시합니다 — 음성이 없어도 카드는 끊기지 않습니다. speak → '음성 없음' → 발음 기호 표시.
가정 학습 연계 단일 HTML 파일을 USB나 학급 공유 폴더로 집에 보내면, 부모님과 함께 카드를 넘기며 학습할 수 있습니다. 외부 링크·로그인·앱 설치가 전혀 없습니다. 공유 폴더 파일 배포.
원칙·정합 단일 HTML·외부 통신 0. 학생 개인 데이터는 일절 취급하지 않습니다(카드 자체만). 모국어 표기는 화자 가정 확인 루틴으로 오류를 잡습니다. EMBED_CARDS 이중언어 상수.

2. 핵심 아키텍처 해설

① 이중언어 카드 상수

const CARDS = [
  { ko: "물", vi: "nước", lang: "vi" },
  { ko: "학교", vi: "trường học", lang: "vi" }
];

② 2중 음성 재생 (localService 로컬 음성 전용)

function speak(word, lang) {
  const voices = speechSynthesis.getVoices()
    .filter(function (v) { return v.localService; });
  const v = voices.find(function (x) {
    return x.lang.indexOf(lang) === 0;
  });
  if (!v) { showNoVoice(); return; }
  const u = new SpeechSynthesisUtterance(word);
  u.voice = v;
  speechSynthesis.speak(u);
}

localService 필터가 학내망 원칙의 심장 — 단어가 외부 서버로 절대 나가지 않습니다.

③ 음성 없을 때 폴백(fallback)

function showNoVoice() {
  label.textContent = card.ko + " / " + card.vi;   // 시각 발음 기호로 대체
  sound("soft");
}

기기에 모국어 음성이 없어도 카드는 사라지지 않고 시각 정보로 계속됩니다.

④ 그림 심기 (Base64)

const CARD_IMG = {
  "물": "iVBORw0KGgo...",
  "학교": "iVBORw0KGgo..."
};

학생이 직접 그린 그림을 스캔·내려받아 Base64(베이스64)로 심으면 외부 이미지 링크가 원천 금지됩니다.

⑤ 원칙·정합

단일 HTML·외부 통신 0. 학생 개인 데이터 일절 없음, 가정 연계는 외부 링크 대신 파일 배포(공유 폴더·USB), 모국어 표기는 화자 가정·협력자 확인 루틴으로 교정합니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(모국어 종류, 단어 선정, 그림 출처)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '이중언어카드.html'로 저장 후 더블클릭. USB로 가정 학습 연계.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일로 완성한다.
2. 사운드는 Web Audio API로 직접 합성한다: 카드 넘기기 부드러운 '사라라', 정답 맞힘 '딩동', 잘 들지 못했을 때 '삑'. 오디오 파일·CDN 금지.
3. 모바일 터치 대응: 뷰포트 메타 태그 필수, 카드 터치 영역 80px 이상, 360px 가로 스크롤 금지.
4. 파일 상단 CARDS 상수에 이중언어 데이터를 심는다: ko(한국어 단어), vi(모국어 단어), lang(모국어 코드). 외부 단어장 API는 절대 사용하지 않는다.
5. 음성은 speechSynthesis의 localService(로컬 음성)만 사용한다 — 온라인 음성·외부 전송 완전 금지.
6. 카드를 누르면 한국어 발음 → 0.6초 후 모국어 발음이 연속 재생되도록 만든다.
7. 모국어 로컬 음성이 기기에 없으면 스스로 감지해 시각 발음 기호(로마자)를 크게 표시하는 폴백(fallback)을 구현한다.
8. 학생 이름·정보 칸은 일절 만들지 않는다(카드 자체만 존재).
9. // TODO, /* 생략 */ 같은 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 학생의 모국어는 무엇인가? (베트남어 / 러시아어 / 기타)
Q2. 첫 단어 세트는 어떤 주제로? (교실 낱말 / 식탁 위 낱말 / 학교 생활 낱말)
Q3. 그림은 어떻게 준비할까? (학생 직접 그린 그림 / 교사 캔바 제작)

🎯 에디터 한줄평

새 학생에게 가장 먼저 건네야 할 것은 환영이 아니라 '내 말이 교실에 등장했다'는 신호입니다. 그림 카드에 모국어가 함께 나오고, 그 모국어가 학생의 눈앞에서 소리로 되살아나는 순간, 한글 해득의 문이 열립니다. 음성이 없는 기기에서도 시각 발음 기호로 계속되는 폴백(fallback) 설계 — '모든 환경에서 포기하지 않는다'는 개별화 지도의 정신이 코드로 옮겨진 최고의 사례입니다.

📚 기술·교육 참고 링크

  • Canva 공식 사이트 : 그림 카드 디자인 도구 (디자인 제작 전용)
  • 교육·행정 연계: 다문화 이해 교육·기초학력 지도 자료는 학내망 공개 자료 기준으로 활용

[교과 연계] 나만의 퀴즈 웹앱 & 오답노트 - 출제자 관점으로 개념을 다시 세우다



출제자가 개념을 갖는다 — 웹 개념 퀴즈 배틀 & 오답노트 웹앱 완전 정복

🧠 5~6학년 실과 SW, 국어 어휘·사회 역사 단원. 학생들이 배운 개념을 4지선다 문제와 해설로 직접 쓰고 JSON(자바스크립트 객체 표기법, JavaScript Object Notation) 데이터로 탑재하면 — 친구들이 퀴즈 배틀을 풀고, 틀린 문제만 모아 맞춤형 오답노트가 완성됩니다.

오답노트는 브라우저 인쇄 대화상자(print dialog)의 'PDF로 저장'으로 출력 — 서버·설치·외부 호출 없이 문서가 완성됩니다. 출제자 관점에서 개념을 다시 세우는 과정이 메타인지(meta-cognition)의 정점입니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
출제자 관점 수업 개념을 문제로 재구조화 — '이 보기가 왜 틀린가'를 설명할 수 없으면 문제도 통과하지 못합니다(해설 필수!). 보기 4개의 미묘한 차이를 만드는 과정이 곧 개념 학습입니다. 모둠별 문제 5개 작성 → 합본.
JSON 문제은행 문제·보기·정답·해설을 JSON(자바스크립트 객체 표기법) 상수로 탑재 — 심기 모드(데이터 임베딩)로 외부 통신 0. QUIZ 상수에 모둠 문제 이어 붙이기.
퀴즈 배틀 문항별 시간 제한(15초), 즉시 판정, Web Audio 합성음(정답 '똑'·오답 '삑') — 배틀은 모둠 대표 지명 방식. judge 함수로 즉시 판정.
오답노트 자동 수집 틀린 문제만 모아 해설과 함께 오답 화면을 만들고, 인쇄 대화상자(print dialog)의 'PDF로 저장'으로 개인 오답노트가 완성됩니다. @media print 서식 → PDF 출력.
원칙·정합 단일 HTML·외부 통신 0. 학생 표기는 번호·닉네임만(실명 저장 금지), 배틀 기록은 세션 메모리 + CSV 내보내기(로컬 장부). EMBED_QUIZ 문제은행 상수.

2. 핵심 아키텍처 해설

① JSON 문제은행 (학생 작성 → 심기)

const QUIZ = [
  { q: "웹페이지의 뼈대를 만드는 언어는?",
    a: ["HTML", "CSS", "JS", "JSON"], c: 0,
    why: "뼈대=HTML, 옷=CSS, 행동=JS — 세 역할이 나뉜다" }
];

② 배틀 판정 엔진

function judge(i, pick) {
  if (pick === QUIZ[i].c) {
    scores[cur] += 10; sound("ding"); next();
  } else {
    WRONGS.push(QUIZ[i]); sound("nope"); showWhy(QUIZ[i]);
  }
}

틀린 문항은 오답 목록(WRONGS)에 자동 수집 — '다시 볼 문제'가 배틀의 결과물이 됩니다.

③ 오답노트 인쇄 서식

@media print { button { display: none; } .card { border: 1px solid #999; } }
// 인쇄 대화상자에서 'PDF로 저장' — 서버 없이 문서 완성

④ CSV 배틀 기록

function battleCSV() {
  return RESULTS.map(function (r) {
    return [r.group, r.score, r.wrong.length].join(",");
  }).join(";");
}

⑤ 원칙·정합

단일 HTML·외부 통신 0. 표기 번호·닉네임, 기록은 세션 메모리에서 시작해 CSV로 보존 — 문제은행·기록 모두 학내망 안에서 완결됩니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트' 전체를 복사해 Gemini에 붙여넣습니다.
  2. 역질문 답변 — Gemini의 질문 3가지(단원 주제, 문항 수, 오답노트 서식)에 답하면 설계가 확정됩니다.
  3. HTML 파일 실행 — 완성 코드를 '퀴즈배틀.html'로 저장 후 더블클릭. 모둠 문제를 QUIZ 상수에 붙여 배틀 시작.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일로 완성한다.
2. 사운드는 Web Audio API로 직접 합성한다: 정답 '똑', 오답 '삑', 배틀 시작 '시작음'. 오디오 파일·CDN 금지.
3. 모바일 터치 대응: 뷰포트 메타 태그 필수, 보기 버튼 최소 44px, 360px 가로 스크롤 금지.
4. 파일 상단 QUIZ 상수에 문제은행을 심는다: q(문제), a(보기 4개 배열), c(정답 번호), why(해설). 외부 퀴즈 API 금지.
5. 배틀은 문항별 15초 시간 제한 + 즉시 판정으로 진행하고, 틀린 문항은 WRONGS 목록에 자동 수집한다.
6. 오답노트 화면: 틀린 문항만 해설(why)과 함께 나열 + @media print 인쇄 서식 — 인쇄 대화상자의 'PDF로 저장'으로 문서 완성(서버·외부 발행 금지).
7. 학생·모둠 표기는 번호·닉네임만(실명 저장 금지), 점수는 세션 메모리 + CSV 내보내기 버튼(로컬 파일).
8. // TODO, /* 생략 */ 같은 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 어떤 단원 문제은행으로 시작할까? (웹 개발 6대 개념 / 국어 어휘 / 사회 역사)
Q2. 문항 수와 시간 제한은? (기본 10문항·15초)
Q3. 오답노트 서식은? (문제+해설+내 답 기본)

🎯 에디터 한줄평

문제를 만드는 순간 개념이 뼈대를 갖습니다 — '왜 이 보기는 틀린가'를 말로 설명할 수 없으면, 그 문제는 통과하지 못하는 해설 필수 규칙이 개념 학습의 안전장치입니다. 오답노트가 인쇄 대화상자에서 나오는 설계 — 설치 없는 문서 발급이 현장 도구의 기본값입니다. 오답이 있는 자리에서 배틀은 끝나지 않습니다.

📚 기술·교육 참고 링크

  • MDN — JSON : 문제은행 데이터 표기법
  • 교육과정 연계: 실과 SW(웹 개념), 국어(어휘 정확성), 사회(역사 연표) 단원과 함께 확장