2026년 9월 6일 일요일

[실과·사회·체육] 기상청 실시간 날씨 & 미세먼지 알리미 - 체육 신호등 판정



지금 우리 동네는 체육 수업 OK? — 기상청 API 실시간 날씨 & 미세먼지 알리미 대시보드

🌤️ 초등 5~6학년 실과 및 사회 '우리 고장의 기후와 생활' 단원 — 기상청 공식 OpenAPI를 불러와 지금 우리 동네의 실시간 기온, 강수 확률, 미세먼지 수치를 전자칠판 대시보드에 한눈에 보여주고, 오늘 야외 체육 수업이 가능한지를 체육 신호등(빨강/노랑/초록)으로 자동 판정합니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
기상청 공식 OpenAPI 연동 기상청 단기예보 공공데이터 API를 호출하여 현재 기온·강수 확률·풍속·습도를 30분 단위로 자동 갱신하는 대시보드입니다. 공공데이터포털에서 무료 키를 발급받고 파일 상단에 넣어 실행합니다.
미세먼지 수치 시각화 측정소별 실시간 미세먼지(PM10)와 초미세먼지(PM2.5) 농도를 색상 라벨로 표시합니다. '좋음(파랑)' ~ '매우나쁨(빨강)' 4단계 신호등 라벨 자동 판정.
체육 수업 신호등 자동 판정 오늘 날씨 조건을 알고리즘으로 평가해서 체육 신호등 아이콘과 안내 카드가 표시됩니다. 과학적 의사결정을 학생과 함께 토론하며 기후 문해력을 키웁니다.

2. 핵심 아키텍처 해설

① GET 요청: 기상청 단기예보 API 호출

const KEY = "발급받은인증키";

async function fetchWeather() {
  const url = "https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst"
    + "?serviceKey=" + encodeURIComponent(KEY)
    + "&pageNo=1&numOfRows=10&dataType=JSON"
    + "&base_date=20260906&base_time=0700&nx=62&ny=124";
  const json = await (await fetch(url)).json();
  return json.response.body.items.item;
}

공공데이터포털에서 발급받은 키와 우리 동네 격자 좌표(nx, ny)를 넣으면 30분 전 실황 데이터가 JSON 배열로 돌아옵니다.

② 미세먼지 신호등 자동 판정 알고리즘

function trafficLight(pm10, pm25) {
  const worst = Math.max(pm10, pm25);
  if (worst >= 151) return { color: "빨강", label: "매우 나쁨", icon: "🔴", outdoor: "실내 체육" };
  if (worst >= 81)  return { color: "주황", label: "나쁨", icon: "🟠", outdoor: "마스크 착용 체육" };
  if (worst >= 31)  return { color: "노랑", label: "보통", icon: "🟡", outdoor: "일반 체육" };
  return { color: "초록", label: "좋음", icon: "🟢", outdoor: "야외 체육 추천" };
}

PM10과 PM2.5 중 더 나쁜 쪽을 기준으로 4단계 신호등을 판정하고, 오늘 체육 수업 권장 방식을 안내 문구로 출력합니다.

③ EMBED 폴백 이중 모드

const EMBED_WEATHER = null; // 심기 모드 데이터를 넣으면 오프라인 폴백

async function getData() {
  if (EMBED_WEATHER) return EMBED_WEATHER;
  try {
    return await fetchWeather();
  } catch (e) {
    return EMBED_LAST; // 키 만료·장애 시 심기 데이터 자동 전환
  }
}

원칙 정정에 따라 실시간 fetch를 기본으로 하되, 키 만료나 네트워크 장애가 발생하면 EMBED_LAST 상수에 심어둔 어제 데이터로 자동 폴백하여 수업이 멈추지 않습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 격자 좌표(동네 위치)와 대시보드 스타일에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 체육신호등.html로 저장하여 전자칠판에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN) 없이 순수 바닐라 HTML/CSS/JS로 완성한다. 기상청 공공데이터 API fetch는 유일한 외부 통신이다.
2. EMBED 폴백 필수: const EMBED_LAST = {...} 상수에 어제 실측 데이터를 심어두고, 키 만료·장애 시 자동 전환하여 수업이 멈추지 않게 한다.
3. 체육 신호등 알고리즘: PM10과 PM2.5 중 더 나쁜 값을 기준으로 4단계(좋음/보통/나쁨/매우나쁨) 신호등 아이콘 + 체육 수업 권장 방식을 자동 판정한다.
4. 학생 개인정보 0: 학생 이름·의견 등은 일절 다루지 않으며, 동네 기상 데이터만 취급한다.
5. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 격자 좌표(nx, ny)는 우리 학교 동네 기준으로 어떤 값을 사용할까요?
2. 화면 대시보드 색상 톤은 블루 스카이와 그린 포레스트 중 어느 것으로 갈까요?
3. 갱신 주기는 30분마다 자동 폴링으로 할까요?

🎯 에디터 한줄평

"기상청 앱을 켜보는 것은 데이터를 '구경'하는 것이고, 기상청 API를 브라우저에서 직접 호출해보는 것은 데이터를 '소유'하는 것입니다. 오늘 아이들에게 가장 먼저 알려주어야 할 것은 지식이 아니라, 지금 이 교실의 공기를 과학적으로 읽고 안전한 선택을 스스로 내리는 힘입니다."

📚 기술·교육 참고 링크

  • 기상청 공공데이터포털 및 교육부 에어컨/미세먼지 학생 건강 안내
  • 교육과정 연계: 초등 5~6학년 실과 및 사회(우리 고장의 기후와 생활), 체육(건강 증진), 과학(기후 변화)

[수학·미술] 평면도형의 이동 테트리스 - 7가지 블록 회전과 바닥 안착으로 배우는 공간감각



도형을 돌리고 뒤집어 빈틈없이 채운다 — '테트로미노 블록 퍼즐 & 수학 공간감각 교구'

🧩 초등 4학년 수학 '평면도형의 이동(밀기·뒤집기·돌리기)' 단원 — 7가지 테트로미노(Tetromino) 블록이 떨어질 때 90도 회전, 좌우 이동, 바닥 안착 원리를 직접 조작하며 공간 감각을 기릅니다. 블록 색상과 점수 규칙을 상수로 커스터마이징하여 나만의 수학 아케이드 교구를 완성합니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
7대 테트로미노 회전 행렬 I, O, T, S, Z, J, L 블록의 4×4 좌표 배열을 90도씩 회전시키는 2차원 배열 회전 수식을 체득합니다. 화살표 위(↑) 키 클릭 시 시계방향 90도 회전 시각화.
바닥 안착 & 줄 삭제 수학 10×20 격자판의 가로 한 줄이 빈틈없이 '1'로 채워지면 100점을 획득하고 아래로 밀려 내려옵니다. 완성된 줄 삭제 시 Web Audio API 코인 사운드 합성.
나만의 교구 커스터마이징 블록 크기(24px/32px)와 테마 색상(네온/파스텔/우드)을 상수로 바꿔 학급 전용 교구로 개조합니다. 수학 시간에 '2줄 동시 삭제 미션' 챌린지 운영.

2. 핵심 아키텍처 해설

① 7대 테트로미노 형상 상수: SHAPES

const SHAPES = {
  I: [[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]],
  O: [[1,1],[1,1]],
  T: [[0,1,0],[1,1,1],[0,0,0]],
  L: [[0,0,1],[1,1,1],[0,0,0]],
  J: [[1,0,0],[1,1,1],[0,0,0]],
  S: [[0,1,1],[1,1,0],[0,0,0]],
  Z: [[1,1,0],[0,1,1],[0,0,0]]
};

정사각형 4개로 만들어지는 7가지 모양을 2차원 0/1 배열로 정의합니다. 이 데이터가 곧 평면도형의 기본 블록입니다.

② 시계방향 90도 회전 알고리즘

function rotate(matrix) {
  const N = matrix.length;
  return matrix.map((row, i) =>
    row.map((val, j) => matrix[N - 1 - j][i])
  );
}

행과 열을 뒤바꾸고 행 순서를 반전시키는 단 3줄의 회전 수식으로 교과서의 '시계방향으로 90도 돌리기'를 완벽히 구현합니다.

③ 충돌 감지 및 줄 삭제 로직

function clearLines(grid) {
  let cleared = 0;
  for (let r = grid.length - 1; r >= 0; r--) {
    if (grid[r].every(cell => cell !== 0)) {
      grid.splice(r, 1);
      grid.unshift(new Array(10).fill(0));
      cleared++;
      r++; // 같은 줄 재검사
    }
  }
  return cleared;
}

배열의 every 메소드로 가로 한 줄이 모두 채워졌는지를 검사하고, 꽉 찬 행을 잘라내어 상단에 빈 행을 추가합니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 격자 크기(10×20)와 블록 낙하 속도에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 수학테트리스.html로 저장하여 전자칠판에서 플레이합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 외부 이미지 없이 순수 HTML5 Canvas와 바닐라 JS로 완성한다.
2. 7가지 테트로미노 블록: I, O, T, S, Z, J, L 형상을 2차원 배열 상수로 정의하고, 상(↑) 키로 90도 회전, 좌우(←→) 이동, 하(↓) 소프트드롭, 스페이스바 하드드롭을 지원한다.
3. 바닥 안착 & 줄 삭제: 10×20 격자판에서 가로 한 줄이 모두 채워지면 삭제되고 점수(줄당 100점)가 올라간다.
4. 효과음 합성: Web Audio API로 블록 회전 시 '틱', 줄 삭제 시 맑은 '딩동', 게임오버 시 '삑' 사운드를 합성한다.
5. 학생 개인정보 0: 점수 기록은 세션 메모리로만 유지하며 실명을 수집하지 않는다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 캔버스 블록 크기를 24px(노트북용)과 32px(전자칠판 대형) 중 무엇으로 할까요?
Q2. 블록 색상 테마를 클래식 원색과 모던 파스텔 중 어느 것으로 갈까요?
Q3. 다음 블록(Next Piece) 미리보기 창을 화면 오른쪽에 배치할까요?

🎯 에디터 한줄평

"'도형을 돌린다'는 말을 문제집에서 보면 어렵지만, 테트리스 게임 안에서는 손가락이 먼저 반응합니다. 2차원 배열의 회전 수식을 직접 들여다보는 순간, 게임은 단순한 오락이 아니라 가장 명쾌한 공간 좌표의 수학 교구가 됩니다."

📚 기술·교육 참고 링크

  • 테트로미노(Tetromino) 기하학 정의 및 평면도형 분할 이론
  • 교육과정 연계: 초등 4학년 수학(평면도형의 이동: 밀기, 뒤집기, 돌리기), 실과(소프트웨어와 프로그래밍)

[창체·자치] 아침 등교 브레인 마스터 - 두뇌 깨우기 퍼즐 & 학급 랭킹존



등교 후 5분, 잠든 두뇌를 깨운다 — '학급 브레인 랭킹 게임존 웹앱'

🧠 초등 창체·학급자치 — 아침 등교 시간과 비 오는 날 쉬는 시간, 스마트폰 대신 교실 전자칠판이나 공용 태블릿에서 건전한 두뇌 퍼즐을 풀고 당일 최고 득점자가 '오늘의 브레인 마스터' 뱃지를 획득하는 자율 활동존입니다. 브라우저 로컬 저장소로 하루 랭킹을 안전하게 관리합니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
3분 두뇌 스피드 퀴즈 숫자 연산, 색상 일치(스트룹 효과), 기억력 패턴 등 3가지 미니 퍼즐이 60초간 빠르게 이어집니다. 등교 직후 1회 도전으로 아침 집중력을 높입니다.
오늘의 랭킹 & 브레인 마스터 닉네임과 번호로 당일 상위 5명을 명예의 전당에 올리고 1등에게 황금 뱃지를 수여합니다. 매일 아침 9시 자동으로 당일 랭킹이 리셋되는 로컬 루틴.
서버 없는 로컬 완결 외부 서버나 로그인 없이 전자칠판 브라우저 LocalStorage에만 기록되어 개인정보 유출 걱정이 없습니다. 교실 키오스크 전체화면(F11)으로 띄워두고 상시 운영.

2. 핵심 아키텍처 해설

① 미니 두뇌 게임 생성 엔진

function nextQuiz() {
  const types = ["math", "color", "pattern"];
  const t = types[Math.floor(Math.random() * types.length)];
  if (t === "math") {
    const a = Math.floor(Math.random() * 20) + 1;
    const b = Math.floor(Math.random() * 20) + 1;
    return { q: `${a} + ${b} = ?`, ans: a + b, type: "math" };
  }
  // 스트룹 효과 색상 퀴즈 및 패턴 추가
}

외부 API 호출 없이 클라이언트 자바스크립트 난수 엔진이 무제한으로 두뇌 퀴즈를 생성합니다.

② 로컬 랭킹 저장 및 당일 리셋

function saveScore(nick, score) {
  const today = new Date().toISOString().slice(0, 10);
  let data = JSON.parse(localStorage.getItem("brain_rank") || "{}");
  if (data.date !== today) data = { date: today, list: [] };
  data.list.push({ nick, score, time: new Date().toLocaleTimeString() });
  data.list.sort((a, b) => b.score - a.score);
  data.list = data.list.slice(0, 5); // 5등까지
  localStorage.setItem("brain_rank", JSON.stringify(data));
}

날짜가 바뀌면 이전 기록은 자동으로 갱신되고, 당일 상위 5명의 닉네임과 점수만 안전하게 보관합니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 게임 제한 시간과 미니 게임 종류에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 브레인존.html로 저장하여 전자칠판에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 CDN, 백엔드 없이 순수 HTML/CSS/JS로 완성한다.
2. 60초 두뇌 챌린지: 연산, 색상 맞추기 등 가벼운 퀴즈를 맞힐 때마다 점수가 올라가며, 콤보 성공 시 보너스 점수를 부여한다.
3. 로컬 랭킹 보드: LocalStorage에 당일 상위 5명(닉네임/점수)을 저장하고 1등에게 황금관 뱃지 아이콘을 띄운다.
4. 사운드 효과: Web Audio API로 정답 시 경쾌한 '퐁', 오답 시 '뚝', 타임오버 시 팡파르음을 합성한다.
5. 학생 개인정보 0: 학생 실명 대신 동물 닉네임이나 번호만 입력받는다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 1판당 플레이 시간을 60초와 90초 중 어느 것으로 할까요?
Q2. 전자칠판 터치 조작을 위해 선택지 버튼 크기를 가로 200px 이상 대형으로 키울까요?
Q3. 게임 화면 배경 테마를 다크 네이비와 밝은 스카이블루 중 무엇으로 할까요?

🎯 에디터 한줄평

"아침 교실에 스마트폰 대신 스스로 두뇌를 깨우는 작은 게임존을 열어주는 것만으로 교실의 공기가 차분하게 정돈됩니다. 순위를 다투는 경쟁이 아니라, 어제보다 발전한 나를 기록하는 기분 좋은 성취가 하루를 시작하는 에너지가 됩니다."

📚 기술·교육 참고 링크

  • 스트룹 효과(Stroop Effect) 인지 심리학 원리 및 초등 주의집중력 훈련 자료
  • 교육과정 연계: 초등 창체(자율활동, 학급자치), 체육·보건(정신건강 및 두뇌 건강)

[정보·창체] AI 해커톤 창작물 전시 포털 - 학생 웹앱 카드 갤러리 & 응원 투표



우리 학생들의 창작물을 온라인 전시관에 — 'AI 해커톤 클라우드 전시 포털 & 응원 투표'

🎪 교내 SW·AI 동아리 및 메이커 축제 행사 — 학생들이 직접 만든 창작 웹앱과 게임 링크를 카드 그리드 형태의 디지털 갤러리에 모아 전시합니다. 학부모와 전교생이 QR코드로 접속하여 체험하고 응원 투표를 남기는 미래형 행사 포털입니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
작품 카드 그리드 전시 학생들의 창작 웹앱 주소를 앨범형 카드로 정리해 QR코드로 학부모·전교생에게 공개합니다. 모둠 코드 + 작품 제목 + 썸네일 아이콘으로 카드 구성.
응원 투표 시스템 마음에 드는 작품에 하트 이모지를 눌러 응원 점수를 올립니다. '최고 인기상' 자동 산정 기능으로 행사 마무리 연출.
학생 개인정보 완전 비식별 학생 실명 대신 모둠 코드(3반-1팀-탐험가)만 표기하므로 학부모가 봐도 안전합니다. 관리자 비밀번호로 투표 수치만 교사가 확인 가능.

2. 핵심 아키텍처 해설

① 작품 데이터: ENTRIES 상수

const ENTRIES = [
  {
    code: "3-1-탐험가",
    title: "우리 동네 안전 지도 앱",
    desc: "모둠별 위험 지역을 지도에 표시하는 게임",
    url: "https://학생웹앱주소1",
    icon: "🗺️",
    votes: 0
  },
  {
    code: "3-2-발명가",
    title: "창작 수학 퀴즈",
    desc: "테트리스로 도형 이동을 배우는 게임",
    url: "https://학생웹앱주소2",
    icon: "🧩",
    votes: 0
  }
];

모둠 코드, 작품명, 소개, 링크 주소, 이모지 아이콘을 미리 상수로 심으면 행사 당일 갤러리가 즉시 렌더링됩니다.

② 카드 그리드 렌더링 & QR 연결

function renderGallery() {
  const grid = document.getElementById("grid");
  ENTRIES.forEach((e, i) => {
    const card = document.createElement("div");
    card.className = "card";
    card.innerHTML = `
      ${e.icon}
      

${e.title}

${e.desc}

${e.code}

`; grid.appendChild(card); }); } function openApp(i) { window.open(ENTRIES[i].url, "_blank"); }

행사 전 날 교사가 학생들의 완성 URL을 상수에 붙여넣으면 행사 당일 1초 만에 전시관이 완성됩니다.

③ 응원 투표 시스템

function vote(i) {
  ENTRIES[i].votes++;
  sound("pop");
  renderGallery(); // 실시간 투표 수 반영
}

투표 데이터는 세션 메모리에만 존재하며 외부 서버로 전송되지 않으므로 개인정보 유출 우려가 전혀 없습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 출품작 수와 카드 색상 테마에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 축제포털.html로 저장하여 학교 홈페이지나 행사 안내 QR코드에 연결합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 서버, 데이터베이스, CDN 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 작품 데이터 심기 모드: const ENTRIES = [...] 상수에 학생 작품명, 소개, 링크 주소, 이모지 아이콘을 미리 넣어둔다.
3. 카드 그리드 레이아웃: 화면 크기에 따라 2~4열로 자동 배치되는 CSS Grid 반응형 카드 목록을 제공한다.
4. 학생 실명 금지: 작품 표기는 '학년-모둠-역할명' 조합의 닉네임만 허용한다.
5. 응원 투표 버튼: 클릭 시 세션 메모리에 투표 수를 누적하고 실시간으로 카드에 반영한다. 외부 서버 저장 금지.
6. 효과음 합성: Web Audio API로 투표 클릭 시 톡! 소리를 합성한다.
7. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 출품작(모둠) 개수는 몇 개인가요?
Q2. 카드 배경 테마를 판타지 크림슨과 스페이스 다크 중 어느 것으로 할까요?
Q3. 투표 상위 3개 작품에 별도 왕관 아이콘을 표시할까요?

🎯 에디터 한줄평

"학생들이 만든 게임과 웹앱을 복도 게시판이 아닌 클라우드 전시관에 올리는 순간, 창작의 관객은 반 30명을 넘어 전교생과 학부모 수천 명으로 확장됩니다. QR코드 하나로 연결되는 이 무한 갤러리가 아이들에게 창조의 뿌듯함을 가르쳐 줄 것입니다."

📚 기술·교육 참고 링크

  • 학교 SW·AI 교육 및 창의융합 축전 운영 가이드
  • 교육과정 연계: 초등 실과(소프트웨어 활용), 창의적 체험활동(동아리 활동 및 행사 운영)

[수학·정보] 확률과 통계 시뮬레이터 - 주사위·동전 100회 대량 실험으로 배우는 데이터 리터러시



이론이 아니라 숫자로 직접 확인한다 — '확률과 통계 시뮬레이터 & 수학 룰렛'

🎲 초등 5~6학년 수학 '가능성(확률)' 단원 — 주사위를 100번 던지는 실험을 브라우저에서 1초 만에 수행하고, 이론적 확률과 실험적 확률이 서로 다른 값에서 수렴해가는 과정을 막대 그래프로 시각화합니다. 대규모 반복 데이터가 무엇을 말해주는지 배우는 통계 탐구 웹앱입니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
100회 난수 대량 실험 버튼 한 번 누르면 주사위 100번 던지기, 동전 뒤집기 실험이 1초 만에 완료되어 각 눈이 몇 번 나왔는지 카운트됩니다. 1,000회·10,000회 버튼으로 데이터가 더 골고루 분포해지는 것을 체감합니다.
이론 vs 실험 확률 수렴 이론적 확률(각 면 1/6 = 약 16.7%)과 실험적 확률(실제 관측 비율)이 회수가 늘어날수록 가까워지는 과정을 시각화합니다. 두 값의 차이(오차)가 줄어드는 막대 그래프를 직접 관찰합니다.
실물 주사위·동전 모드 전환 동전 던지기(앞/뒤), 주사위(1~6), 룰렛(8분할) 세 가지 도구를 전환하며 다양한 실험을 수행합니다. 실제 주사위를 굴려보고 앱 실험 결과와 비교하는 융합 활동.

2. 핵심 아키텍처 해설

① 난수 생성 & 통계 집계 엔진

const counts = [0, 0, 0, 0, 0, 0];
function simulateRoll(n) {
  for (let i = 0; i < n; i++) {
    const face = Math.floor(Math.random() * 6); // 0~5
    counts[face]++;
  }
  renderChart();
}

자바스크립트 내장 난수 엔진을 100회·1,000회 반복하면서 각 면이 나온 횟수를 누적 집계합니다.

② 이론 확률과 실험 확률의 수렴 그래프

function renderChart() {
  const total = counts.reduce((a, b) => a + b, 0);
  const theory = 100 / 6;
  counts.forEach((c, i) => {
    const experimental = (c / total) * 100;
    drawBar(i, c, experimentPercent = experimentPercent, theoreticalPercent = theory);
  });
}

Canvas 2D로 6개의 막대를 그리고, 이론값(1/6)을 기준선으로 표시해 차이가 줄어드는 것을 눈으로 확인합니다.

③ EMBED 폴백 이중 모드

const EMBED_LAST = null;
// 교사가 미리 받아둔 실험 결과를 심으면 오프라인에서도 비교 가능

오프라인 환경에서도 마지막 실험 결과를 상수로 심어두면 수업이 끊기지 않습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 실험 도구(주사위·동전)와 회수(100회)에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 확률탐구.html로 저장하여 수학 탐구 수업에 활용합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 서버 통신 없이 순수 HTML5 Canvas와 바닐라 JS로 완성한다.
2. 100회·1,000회·10,000회 버튼: Math.random()으로 주사위 눈(1~6)을 생성하고 각 눈별 카운트를 집계한다.
3. 이론 확률 vs 실험 확률 수렴: 실험을 반복할수록 각 눈의 비율이 이론값(1/6 = 16.7%)에 가까워지는 막대 그래프를 렌더링한다.
4. 동전 모드: 앞(50%)/뒤(50%) 실험도 별도 탭으로 지원한다.
5. 학생 개인정보 0: 학생 데이터를 수집하지 않으며 결과는 세션 메모리로만 유지한다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 기본 실험 도구로 주사위와 동전 중 무엇을 사용할까요?
Q2. 막대 그래프 색상을 컬러풀한 무지개 6색과 다크 모드 중 어느 것으로 할까요?
Q3. 실험 기록을 CSV로 다운로드하여 수학 통계 수업에 활용할까요?

🎯 에디터 한줄평

"주사위 100번을 실제로 던지면 손목이 아프지만, 알고리즘에게는 1초짜리 일입니다. 10,000번 반복하면 사실 다른 숫자가 나온다는 것을 눈으로 볼 때 '확률'은 공식이 아닌 데이터의 냄새를 가진 살아있는 개념으로 자리 잡습니다."

📚 기술·교육 참고 링크

  • 대수의 법칙(Law of Large Numbers) 이론 및 초등 통계 교육 가이드
  • 교육과정 연계: 초등 5~6학년 수학(가능성, 통계와 확률), 정보(데이터와 정보처리)

[창체·자치] 발표 순서 룰렛 웹앱 - 공정한 번호 추첨으로 배우는 투명한 교실 문화



"다음 차례는...!" — '교실 발표 순서 & 모둠 번호 공정 추첨 룰렛 웹앱'

🎯 초등 창체·학급자치 활동 — 발표 차례나 조편성을 정할 때 눈치 보지 않아도 되도록, 1~25번 학생 번호를 중복 없이 5명씩 추첨하고 모둠 발표 순서를 공정하게 섞어주는 경량 룰렛 웹앱을 제작합니다. 복잡한 설정 없이 단일 HTML 파일로 전자칠판에 띄우기만 하면 됩니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
중복 없는 번호 추첨 1~25번 학생 번호 중 이미 뽑힌 번호는 제외하고 남은 번호에서만 다음 번호를 추첨합니다. "이미 나온 번호"는 회색으로 표시되어 투명하게 확인됩니다.
모둠 발표 순서 셔플 1~6모둠 중 어느 모둠이 먼저 발표할지 무작위로 섞어서 공정하게 정합니다. 긴장감 넘치는 효과음과 함께 당첨 번호가 팝업으로 띄워집니다.
학생 개인정보 0 학생 실명이 아니라 번호(1~25)만 사용하므로 결과가 외부로 전송되지 않고 안전합니다. 로컬 세션 메모리로만 관리되어 창을 닫으면 소멸됩니다.

2. 핵심 아키텍처 해설

① 중복 없는 번호 추첨 알고리즘

let pool = [];

function initPool(maxNum) {
  pool = [];
  for (let i = 1; i <= maxNum; i++) pool.push(i);
}

function drawNumber() {
  if (pool.length === 0) return null;
  const idx = Math.floor(Math.random() * pool.length);
  const num = pool[idx];
  pool.splice(idx, 1); // 중복 제거
  return num;
}

추첨 가능한 번호 풀에서 무작위로 하나를 꺼내면 풀에서 제거되어 중복이 발생하지 않습니다.

② 당첨 번호 팝업 & 효과음

function showResult(num) {
  const popup = document.getElementById("result");
  popup.textContent = num + "번!";
  popup.classList.add("show");
  sound("drum");
  setTimeout(() => popup.classList.remove("show"), 3000);
}

드럼 사운드가 재생되며 당첨 번호가 크게 팝업되어 학급이 실시간으로 확인합니다.

③ 모둠 순서 셔플 알고리즘

function shuffleGroups(n) {
  const arr = [];
  for (let i = 1; i <= n; i++) arr.push(i);
  for (let i = arr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  return arr;
}

피셔-에이츠(Fisher-Yates) 셔플 알고리즘으로 모둠 순서를 완전히 무작위로 배치합니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학생 수와 모둠 수에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 추첨기.html로 저장하여 교실 전자칠판에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 서버, CDN 없이 순수 HTML/CSS/JS로 완성한다.
2. 중복 없는 번호 추첨: 1~25번 학생 번호에서 이미 뽑힌 번호는 제외하고 남은 풀에서만 무작위 추출한다.
3. 모둠 순서 셔플: 피셔-에이츠(Fisher-Yates) 알고리즘으로 1~6모둠 순서를 무작위 배치한다.
4. 긴장감 연출: 추첨 버튼 클릭 시 짧은 북소리(더비비빅) 후 당첨 번호가 크게 팝업으로 떠오른다.
5. 학생 개인정보 0: 학생 실명이 아닌 번호만 사용하고 결과는 세션 메모리로만 유지한다.
6. 효과음 합성: Web Audio API로 추첨 시 드럼, 당첨 시 팡파르 소리를 합성한다.
7. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 학생 수는 몇 명(최대 번호)으로 할까요? (기본: 25)
Q2. 모둠 수는 몇 개로 할까요? (기본: 6)
Q3. 당첨 번호 색상을 골드 골드와 파스텔 핑크 중 어느 것으로 할까요?

🎯 에디터 한줄평

"누가 먼저 발표할까?"라는 질문에 손을 들어주는 친구가 늘 먼저 나오는 것은 자연스러운 일입니다. 하지만 교실에서 공정함이 코드로 보여지는 순간, 선생님은 정의의 수호자가 아니라 학생들과 같은 참여자가 됩니다. 불만 없이 시작하는 발표 수업, 그것이 코드가 교실 문화를 바꾸는 방식입니다."

📚 기술·교육 참고 링크

  • 피셔-에이츠(Fisher-Yates) 셔플 알고리즘 및 순열 이론
  • 교육과정 연계: 초등 창체(자율활동, 학급자치), 수학(가능성과 경우의 수)

[행정·홍보] 학교 축제 디지털 팜플렛 - 인쇄비 0원, 반응형 행사 안내 웹사이트



인쇄비 0원으로 축제를 열자 — '학교 축제 & 방과후학교 전시회 모바일 디지털 팜플렛'

🎪 초등 행사 행정 — 학교 축제, 방과후학교 전시회, 체육대회 등 학부모가 참여하는 행사 안내장을 종이에서 반응형 디지털 웹사이트로 전환합니다. 학급별 공연 순서, 부스 위치, 전시 작품 소개, 화장실 위치까지 한 화면에서 확인할 수 있으며, 행사 당일 실시간으로 일정 변경도 반영할 수 있습니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
인쇄비 100% 절감 매년 수십만 원이 드는 종이 안내장을 디지털 웹사이트로 대체합니다. 학부모 스마트폰에서 QR코드 스캔으로 즉시 접속.
실시간 일정 수정 비가 와서 실내로 옮기거나 공연 시간이 늦춰지면, 파일의 상수를 바꿔 다시 배포하면 즉시 반영됩니다. "3반 공연 → 실내 체육관으로 이동" 알림 배너 상단 고정.
모바일 최적화 반응형 360px 화면에서도 가로 스크롤 없이 세로 카드 그리드로 자동 배치되어 학부모가 편하게 확인합니다. 부스 위치는 SVG 약도 위 핀 마커로 시각화.

2. 핵심 아키텍처 해설

① 행사 일정 상수: EVENT 상수

const EVENT = {
  name: "제 42회 교육의 날 축제",
  date: "2026-09-06",
  notice: "비 예보 — 실내 체육관에서 진행됩니다.",
  stages: [
    { time: "10:00", act: "개회식 — 체육관", emoji: "🎤" },
    { time: "10:30", act: "3반 합창단 — 체육관 무대", emoji: "🎵" },
    { time: "11:00", act: "미술 전시 — 도서관 1층", emoji: "🎨" },
    { time: "12:00", act: "방과후 무용 발표 — 체육관", emoji: "💃" }
  ],
  booths: [
    { name: "과학 실험 부스", loc: "과학실", emoji: "🔬" },
    { name: "독서 감상 부스", loc: "도서관", emoji: "📖" },
    { name: "만들기 워크숍", loc: "실과실", emoji: "✂️" }
  ]
};

행사 전 일정과 부스 정보를 상수에 정리하면 파일 하나만 수정해도 즉시 전체 팜플렛이 갱신됩니다.

② 반응형 카드 그리드 & 부스 약도 핀

function renderStages() {
  const list = document.getElementById("stages");
  EVENT.stages.forEach((s) => {
    const card = document.createElement("div");
    card.className = "stage-card";
    card.innerHTML = `${s.time} ${s.emoji} ${s.act}`;
    list.appendChild(card);
  });
}

행사 순서는 세로 타임라인 카드로, 부스 위치는 SVG 약도 위 핀 마커로 렌더링되어 학부모가 스마트폰으로 한눈에 찾아갈 수 있습니다.

③ QR코드 배포 루틴

팜플렛 HTML을 교사 PC에서 로컬로 열거나 학내망 링크로 배포하는 것만으로 QR코드(무료 생성기 사용)를 인쇄하여 학부모 안내장에 첨부할 수 있습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 행사 종류(축제/전시회/체육대회)와 공연 개수에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 축제팜플렛.html로 저장하여 QR코드를 인쇄합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 서버, CDN 없이 순수 HTML/CSS/JS로 완성한다. 학부모 스마트폰에서 열면 즉시 확인 가능.
2. 행사 정보 심기 모드: const EVENT = {...} 상수에 행사명, 날짜, 공연 일정, 부스 위치, 알림 배너를 미리 넣어둔다.
3. 반응형 카드 그리드: 360px 화면에서도 가로 스크롤 없이 세로 카드 뷰로 배치되어 학부모가 편하게 읽는다.
4. 부스 위치 표시: 학교 건물 SVG 약도 위에 핀(마커) 이모지를 배치하여 위치를 시각화한다.
5. 학생 개인정보 0: 학생 실명 대신 '학급명 + 출품작명'만 표기하며 얼굴 사진은 일절 사용하지 않는다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 행사 종류는 무엇인가요? (축제 / 전시회 / 체육대회 / 방과후 발표회)
Q2. 공연 및 부스 총 개수는 몇 개인가요?
Q3. 상단 배너 색상 톤을 판타지 핑크와 우드 브라운 중 어느 것으로 할까요?

🎯 에디터 한줄평

"수십만 원의 인쇄비와 몇 시간의 전단지 배포 노동력을 학부모 휴대폰 화면으로 대체하는 것은 단순한 절약이 아닙니다. 비가 와도 공연이 옮겨졌다는 것을 순간적으로 알려주는 시스템이 학부모 신뢰를 만들고, 교사에게는 행사 당일 소통 피로를 획기적으로 줄여줍니다."

📚 기술·교육 참고 링크

  • 학교 행사 전산화 및 디지털 홍보 가이드
  • 교육과정 연계: 초등 창체(행사 운영 참여), 실과(정보통신기기 활용)

[보건·체육·수학] 학생 신체발달 백분위 계산 - 질병청 성장 곡선 기반 건강 성장 트래커



키와 몸무게, 숫자가 아닌 성장 그래프로 본다 — '학생 신체발달 표준 백분위 계산기'

📏 초등 4~6학년 보건·체육·수학 융합 — 신체 측정 주간에 학생들이 자신의 키와 몸무게를 입력하면, 질병관리청 표준 성장 곡선(LMS 파라미터)과 대조하여 백분위수(Percentile)를 시각화합니다. 균형 잡힌 식습관과 수면 시간의 중요성을 수학 통계 데이터로 스스로 탐구하는 융합 건강 웹앱입니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
질병청 표준 성장 곡선 심기 성별·연령별 평균 키·몸무게 표준 백분위 표(3th~97th)를 파일 상단 상수로 심어 외부 통신 없이 즉시 계산합니다. 나이와 성별을 고르고 내 측정값을 입력하여 내 위치를 확인합니다.
순수 캔버스 백분위 시각화 외부 차트 라이브러리(Chart.js 등) 없이 순수 Canvas로 정규분포 곡선 위에 내 위치 핀(마커)을 그립니다. "또래 100명 중 45번째"와 같은 백분위수를 직관적으로 확인합니다.
학생 민감 정보 세션 메모리 키·몸무게 등 민감한 신체 정보는 파일이나 서버에 저장되지 않고 창을 닫으면 즉시 소멸됩니다. 이름 칸이 없어 옆 친구가 봐도 누구 것인지 모르는 안전한 프라이버시.

2. 핵심 아키텍처 해설

① 표준 성장 곡선 상수: GROWTH_CHART

const GROWTH_CHART = {
  male_11y: {
    height: [136.2, 140.5, 145.2, 149.8, 154.5], // 3th, 15th, 50th, 85th, 97th
    weight: [29.8, 34.5, 41.2, 49.5, 58.2]
  },
  female_11y: {
    height: [136.8, 141.2, 146.0, 151.1, 156.2],
    weight: [29.5, 34.1, 40.8, 48.9, 57.5]
  }
};

질병관리청 표준 성장 곡선의 핵심 분기점을 상수로 심어두어 인터넷이 끊긴 보건실에서도 백분위를 즉시 계산합니다.

② 백분위수(Percentile) 보간 계산 알고리즘

function calcPercentile(val, arr) {
  const percentiles = [3, 15, 50, 85, 97];
  if (val <= arr[0]) return 3;
  if (val >= arr[4]) return 97;
  for (let i = 0; i < 4; i++) {
    if (val >= arr[i] && val <= arr[i+1]) {
      const ratio = (val - arr[i]) / (arr[i+1] - arr[i]);
      return Math.round(percentiles[i] + ratio * (percentiles[i+1] - percentiles[i]));
    }
  }
  return 50;
}

선형 보간(linear interpolation) 공식으로 내 측정값이 표준 곡선의 몇 퍼센타일에 해당하는지 정밀하게 산출합니다.

③ 순수 캔버스 정규분포 곡선 렌더링

function drawBellCurve(ctx, percentile) {
  ctx.clearRect(0, 0, 400, 200);
  ctx.beginPath();
  // 가우시안 정규분포 곡선 그리기
  for (let x = 0; x <= 400; x++) {
    const norm = (x - 200) / 60;
    const y = 180 - 150 * Math.exp(-0.5 * norm * norm);
    if (x === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y);
  }
  ctx.stroke();
  // 내 위치 빨간 핀 그리기
  const markerX = (percentile / 100) * 400;
  ctx.fillStyle = "red";
  ctx.fillRect(markerX - 2, 20, 4, 160);
}

차트 라이브러리 없이 순수 수학 수식으로 종 모양 정규분포 곡선을 그리고, 내 위치를 빨간 선으로 명확히 짚어줍니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 대상 학년(4~6학년)과 표시할 건강 조언에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 성장계산기.html로 저장하여 보건 수업에 활용합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(Chart.js 등), 외부 CDN 없이 순수 HTML5 Canvas와 바닐라 JS로 완성한다.
2. 질병청 성장 곡선 데이터 심기: 초등 4~6학년 남녀 표준 키·몸무게 백분위수(3, 15, 50, 85, 97th)를 상수로 내장한다.
3. 캔버스 정규분포 곡선: 가우시안 수식으로 종 모양 곡선을 그리고 학생의 백분위 위치에 빨간색 세로 핀을 렌더링한다.
4. 학생 개인정보 0: 학생 실명 입력 칸은 없으며, 성별·연령·키·몸무게는 세션 메모리로만 유지되고 창을 닫으면 소멸한다.
5. 건강 피드백 카드: 백분위에 맞춰 '충분한 수면(9시간)과 단백질 섭취를 추천해요' 등 긍정적 성장 조언을 출력한다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 대상 연령 범위를 10~12세(초4~6)로 맞출까요?
Q2. 비만도(BMI) 계산 카드도 함께 표시할까요?
Q3. 화면 테마를 보건실 민트 그린과 파스텔 블루 중 어느 것으로 갈까요?

🎯 에디터 한줄평

"키와 몸무게는 단순한 숫자가 아니라 성장하고 있는 내 몸의 이야기입니다. 백분위 그래프 위에서 내 위치를 확인하는 순간, 비교의 불안은 사라지고 건강하게 잘 먹고 푹 자야겠다는 생활의 결심이 수학적 통계로부터 자연스럽게 피어납니다."

📚 기술·교육 참고 링크

  • 질병관리청 소아청소년 표준 성장도표 및 LMS 통계 방법론
  • 교육과정 연계: 초등 5~6학년 보건(성장과 발달), 체육(신체 발달과 건강), 수학(통계와 평균)

[창체·자치] 초경량 학급 알림판 - 로딩 0초, 1인 1역 & 일일 시간표 오프라인 대시보드



부팅 렉 0초, 저사양 태블릿에서도 쌩쌩 — '초경량 학급 1인 1역 & 일일 알림판'

📋 초등 창체·학급자치 — 교실 TV나 구형 크롬북에 띄울 오늘의 시간표, 1인 1역 당번, 준비물 알림판을 무거운 프레임워크 없이 순수 단일 HTML과 LocalStorage로 초경량화했습니다. 인터넷이 끊겨도 1초 만에 켜지는 완전 오프라인 학급 알림 보드입니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
용량 50KB 미만 초경량 외부 폰트, 무거운 자바스크립트 라이브러리가 전혀 없어 구형 기기에서도 더블클릭 1초 만에 켜집니다. 아침 등교 시간 교실 전면 TV에 상시 고정.
1인 1역 체크리스트 토글 칠판 닦기, 우유 급식, 환기 담당 학생이 실천 완료를 터치하면 초록색 체크와 함께 완료 표시됩니다. 오늘의 실천 완료율(%)이 게이지 바에 실시간 반영.
LocalStorage 로컬 영구 보존 담임교사가 입력한 오늘의 준비물과 알림장이 브라우저 로컬에 저장되어 내일 켜도 유지됩니다. 인터넷 선을 뽑아도 완벽하게 구동되는 100% 오프라인.

2. 핵심 아키텍처 해설

① 알림 데이터 구조: NOTICE 상수

const NOTICE = {
  date: "2026-09-07 (월)",
  schedule: ["국어(글 요약)", "수학(각도)", "체육(뜀틀)", "음악(리코더)", "실과(코딩)"],
  supplies: ["수학 익힘책 42쪽", "리코더", "개인 물병"],
  roles: [
    { role: "칠판 닦기", nick: "토끼대장", done: false },
    { role: "우유 당번", nick: "치타선수", done: false },
    { role: "환기 대장", nick: "바람요정", done: false }
  ]
};

시간표, 준비물, 1인 1역을 단일 상수에 정리해 두어 코드 한 곳만 수정하면 전체 보드가 정돈됩니다.

② 로컬스토리지 실천 상태 동기화

function toggleRole(idx) {
  const data = JSON.parse(localStorage.getItem("board_data") || JSON.stringify(NOTICE));
  data.roles[idx].done = !data.roles[idx].done;
  localStorage.setItem("board_data", JSON.stringify(data));
  renderBoard();
}

학생이 화면을 터치할 때마다 LocalStorage에 실천 여부가 즉시 저장되어 브라우저를 새로고침해도 상태가 풀리지 않습니다.

③ 초경량 CSS 다이어트

body { font-family: system-ui, sans-serif; margin: 0; padding: 20px; background: #f8fafc; }
.card { background: white; border-radius: 12px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }

외부 웹폰트(웹폰트 파일 2~3MB)를 전혀 불러오지 않고 시스템 폰트만 사용하여 로딩 속도를 극대화했습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학급 시간표 교시 수(5~6교시)와 1인 1역 목록에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 학급알림판.html로 저장하여 교실 TV에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 CDN(웹폰트, CSS 라이브러리)을 일절 쓰지 말고 시스템 기본 폰트와 순수 CSS로 초경량(50KB 미만) 완성한다.
2. 3분할 대시보드 레이아웃: 좌측(오늘의 시간표 5~6교시) + 중앙(1인 1역 실천 체크리스트) + 우측(준비물 & 알림장)으로 화면을 분할한다.
3. 실천 체크 토글: 1인 1역 항목 클릭 시 LocalStorage에 저장되어 브라우저를 다시 켜도 완료 상태가 유지되도록 한다.
4. 효과음 합성: Web Audio API로 체크 클릭 시 맑은 '띵' 사운드를 합성한다.
5. 학생 개인정보 0: 학생 실명 대신 동물 닉네임이나 번호만 사용한다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 시간표 교시 수는 5교시와 6교시 중 무엇을 기본으로 할까요?
Q2. 1인 1역 항목 수는 8개와 12개 중 몇 개로 할까요?
Q3. 알림판 배경 색상을 칠판 초록색과 모던 화이트 중 어느 것으로 갈까요?

🎯 에디터 한줄평

"가장 좋은 기술은 기술이 느껴지지 않는 기술입니다. 3초 동안 로딩되는 무거운 플랫폼보다, 더블클릭하자마자 1초 만에 켜져서 오늘 하루 우리가 무엇을 해야 하는지 말해주는 가벼운 HTML 한 장이 교실의 일상을 훨씬 단단하게 지탱해 줍니다."

📚 기술·교육 참고 링크

  • 웹 성능 최적화(Web Performance Optimization) 및 브라우저 로컬스토리지 활용법
  • 교육과정 연계: 초등 창체(자율활동, 학급자치, 일과 운영)

[체육·보건·행정] PAPS 체력 등급 자동 산출기 - 며칠 걸리던 전교생 등급 판정을 1초 만에



교육부 기준 100% 반영, 수기 계산 끝 — 'PAPS 학생건강체력평가 등급 자동 산출 & 가정통신문 생성기'

🏃 초등 체육·보건 행정 업무 — 전교생 PAPS 측정 데이터 CSV를 드래그 앤 드롭하면, 교육부 공식 점수 환산 기준표에 따라 5대 영역(심폐지구력·유연성·근력·순발력·체지방) 점수와 종합 1~5등급을 1초 만에 자동 판정합니다. 맞춤형 운동 처방전이 담긴 학부모용 건강 리포트를 일괄 출력할 수 있습니다.

📖 한 줄 정의

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

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
교육부 공식 환산표 내장 왕복오래달리기, 앉아윗몸앞으로굽히기, 악력 등 종목별 점수 변환 기준표를 파일 상수로 완벽히 심었습니다. 측정값 입력 즉시 100점 만점 환산 점수 자동 산출.
종합 1~5등급 자동 판정 5개 영역 총점을 합산하여 1등급(80점 이상)부터 5등급(20점 미만)까지의 체력 등급을 자동 판정합니다. 4~5등급 학생에게 건강체력교실 참가 권장 안내 자동 부착.
가정통신문 리포트 일괄 인쇄 브라우저 인쇄(@media print) 한 번으로 전교생 개별 건강 리포트를 A4 용지에 맞추어 일괄 출력합니다. 나이스(NEIS) 등록용 검증 완료 CSV 내보내기 지원.

2. 핵심 아키텍처 해설

① 교육부 PAPS 점수 환산표 상수: PAPS_TABLE

const PAPS_TABLE = {
  shuttle_run_boy12: [
    { score: 20, min: 65 }, { score: 16, min: 50 },
    { score: 12, min: 38 }, { score: 8, min: 25 }, { score: 4, min: 0 }
  ]
  // 좌전굴, 악력, 제자리멀리뛰기, BMI 기준표 내장
};

교육부 공식 편람의 성별·연령별 기준표를 100% 내장하여 인터넷 없이도 오차 없는 등급 계산을 보장합니다.

② 종합 등급 판정 알고리즘

function calcGrade(totalScore) {
  if (totalScore >= 80) return { grade: "1등급", text: "매우 우수한 체력입니다.", badge: "🥇" };
  if (totalScore >= 60) return { grade: "2등급", text: "우수한 체력 수준입니다.", badge: "🥈" };
  if (totalScore >= 40) return { grade: "3등급", text: "보통 체력입니다.", badge: "🥉" };
  if (totalScore >= 20) return { grade: "4등급", text: "건강 증진 활동이 필요합니다.", badge: "⚠️" };
  return { grade: "5등급", text: "맞춤형 체력교실 참여를 권장합니다.", badge: "🚨" };
}

영역별 20점 만점(총 100점) 기준에 따라 1~5등급을 자동 산출하고, 맞춤형 운동 처방 조언을 연결합니다.

③ CSV 업로드 & A4 리포트 인쇄

측정 엑셀(CSV)을 드래그 앤 드롭하면 브라우저 메모리 안에서만 계산되고 어떤 외부 서버로도 전송되지 않습니다. 계산 완료 후 '리포트 인쇄' 버튼을 누르면 브라우저 기본 인쇄창에서 A4 용지 규격으로 깔끔하게 출력됩니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 대상 학년(5~6학년)과 측정 종목 5가지에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 PAPS계산기.html로 저장하여 체육 행정에 활용합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 서버, CDN 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. PAPS 공식 환산표 심기: 초등 5~6학년 남녀 심폐지구력, 유연성, 근력, 순발력, BMI 점수표(100점 만점)를 상수로 내장한다.
3. CSV 드래그 앤 드롭: 학급별 측정치 CSV 파일을 업로드하면 1초 만에 학생별 총점과 1~5등급을 자동 계산한다.
4. @media print A4 가정통신문: 인쇄 시 학생 1명당 A4 1장(또는 2명당 1장)으로 규격화된 체력 리포트 카드를 출력한다.
5. 학생 개인정보 0: 학생 실명은 화면에만 임시 렌더링되며 로컬 파일이나 외부 서버로 절대 저장되지 않는다(세션 휘발).
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 기본 종목 구성을 왕복오래달리기/앉아윗몸앞으로굽히기/악력/제자리멀리뛰기/BMI 5종으로 할까요?
Q2. A4 1장에 학생 리포트를 1명씩 크게 출력할까요, 2명씩 절약형으로 배치할까요?
Q3. 나이스(NEIS) 일괄 업로드용 결과 CSV 다운로드 버튼을 추가할까요?

🎯 에디터 한줄평

"며칠 밤을 새우며 기준표 책자를 뒤적이던 체육부장 선생님의 수고를 1초 만에 덜어내는 것, 그것이 교육 행정 전산화의 가장 아름다운 쓸모입니다. 아낀 행정 시간은 고스란히 운동장에서 아이들의 뜀박질을 한 번 더 응원하는 시간으로 돌아갑니다."

📚 기술·교육 참고 링크

  • 교육부 학생건강체력평가제(PAPS) 운영 매뉴얼 및 공식 평가 기준표
  • 교육과정 연계: 초등 5~6학년 체육(건강 체력 평가 및 관리), 보건 행정