2026년 9월 7일 월요일

[창체·환경] 잔반 제로 & 분리수거 - 실천할수록 자라는 학급 에코 트리 대시보드



우리 반이 밥을 다 먹을 때마다 나무가 자란다 — '잔반 제로 & 분리수거 실시간 에코 뱃지 보드'

🌱 초등 창체·환경 자치 — 급식 잔반 제로를 실천하거나 분리수거를 완료한 학생이 교실 태블릿을 터치하면, 학급 전체의 '지구 살리기 에코 나무'가 새싹에서 거목으로 자라나는 게이미피케이션 환경 자치 대시보드입니다. 잔소리 대신 시각적인 나무 성장 애니메이션과 레벨별 에코 뱃지로 자율적인 친환경 학급 문화를 만듭니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
5단계 에코 나무 성장 캔버스 씨앗(0점) → 새싹(20점) → 묘목(50점) → 꽃나무(80점) → 거목(120점)으로 캔버스 애니메이션이 펼쳐집니다. 점심시간 후 교실 전면 TV에 띄워두고 전교생 터치 참여.
실천별 가중치 포인트 잔반 제로(+2점), 분리수거 정돈(+1점), 우유갑 씻기(+1점)를 터치하여 환경 포인트를 적립합니다. 하루 1인 1회 원터치 기록으로 과도한 경쟁을 방지.
학급 전체 협동 뱃지 개인별 순위 대신 '우리 반 전체가 줄인 음식물 쓰레기(kg)' 환산 수치를 함께 표시하여 연대감을 키웁니다. 100점 달성 시 금빛 팡파르와 함께 '초록 지구 지킴이' 인증 뱃지 획득.

2. 핵심 아키텍처 해설

① 나무 성장 단계 및 탄소 저감 환산

const TREE_STAGES = [
  { lv: 1, min: 0, label: "씨앗", icon: "🌱", scale: 0.3 },
  { lv: 2, min: 20, label: "새싹", icon: "🌿", scale: 0.5 },
  { lv: 3, min: 50, label: "묘목", icon: "🪴", scale: 0.75 },
  { lv: 4, min: 80, label: "풍성한 나무", icon: "🌳", scale: 1.0 },
  { lv: 5, min: 120, label: "꽃 핀 거목", icon: "🌸", scale: 1.3 }
];

function calcCO2(points) {
  // 잔반 제로 1점당 음식물 쓰레기 약 0.15kg, 탄소 0.2kg 저감 환산
  return (points * 0.2).toFixed(1);
}

포인트에 따라 성장 단계가 자동 판정되고, 과학 교과와 연계된 탄소 저감 수치(kg)가 함께 계산됩니다.

② 순수 캔버스 가지 뻗기 알고리즘

function drawBranch(ctx, startX, startY, len, angle, branchWidth) {
  ctx.beginPath();
  ctx.save();
  ctx.strokeStyle = "#8b5a2b";
  ctx.lineWidth = branchWidth;
  ctx.translate(startX, startY);
  ctx.rotate(angle * Math.PI / 180);
  ctx.moveTo(0, 0);
  ctx.lineTo(0, -len);
  ctx.stroke();

  if (len < 12) {
    // 나뭇잎 그리기
    ctx.beginPath();
    ctx.arc(0, -len, 4, 0, Math.PI * 2);
    ctx.fillStyle = "#48bb78";
    ctx.fill();
    ctx.restore();
    return;
  }
  drawBranch(ctx, 0, -len, len * 0.75, -25, branchWidth * 0.7);
  drawBranch(ctx, 0, -len, len * 0.75, 25, branchWidth * 0.7);
  ctx.restore();
}

재귀(recursive) 수식으로 프랙탈 나뭇가지를 그려 외부 이미지 없이도 생명력 넘치는 나무를 브라우저가 직접 그려냅니다.

③ 세션 메모리 보관 및 주간 리셋

실시간 터치 데이터는 브라우저 세션 메모리에 보관되며, 주말 자치 시간 후 '이번 주 기록 저장(CSV)' 버튼으로 내려받아 학급 문집에 기록할 수 있습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 실천 항목(잔반, 분리수거, 우유갑)과 목표 점수에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 에코트리.html로 저장하여 교실 태블릿에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 백엔드 서버 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 캔버스 프랙탈 나무: HTML5 Canvas의 재귀 함수로 단계별로 잎이 무성해지는 에코 트리를 직접 렌더링한다.
3. Web Audio 사운드 합성: 실천 버튼 터치 시 청량한 새소리('삐립') 효과음을 내장 오디오 합성으로 출력한다.
4. 개인정보 0: 학생 개인 이름 대신 모둠명과 학급 누적치만 표기하며, 학내망 원칙을 철저히 준수한다.
5. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 실천 항목 3가지(잔반 제로, 분리수거, 우유갑)의 점수 가중치를 어떻게 정할까요?
2. 거목 달성 목표 점수를 100점과 150점 중 어느 것으로 잡을까요?
3. 배경 테마를 교실 느낌의 우드 톤과 자연 느낌의 스카이 톤 중 어느 것으로 갈까요?

🎯 에디터 한줄평

"'음식 남기지 마라'는 백 번의 잔소리보다, 내가 식판을 비우고 터치할 때 화면 속 나무에 초록 잎사귀 하나가 돋아나는 순간이 아이들의 행동을 바꿉니다. 개인을 감시하는 대신 학급 전체가 하나의 나무를 키워가는 연대의 경험, 그것이 환경 교육이 지향해야 할 가장 따뜻한 모습입니다."

📚 기술·교육 참고 링크

  • 환경부 국가환경교육 통합플랫폼 및 초등 에코스쿨 가이드라인
  • 교육과정 연계: 초등 3~6학년 창체(환경·생태 자치), 실과(지속가능한 생활), 도덕(지구공동체)

[환경행정] 교내 에너지 절약 & 탄소 배출 실시간 절감 리포트 생성기



전기·수도 사용량을 넣으면 탄소 저감 리포트가 나온다 — '교내 에너지 절약 & 탄소 배출 절감 리포트 생성기'

💡 환경행정 및 학교 시설 관리 — 월별 전기·수도·가스 사용량을 입력하면 CO2 저감량(kg)과 예산 절감액(원)이 자동 계산되어 가정통신문 및 환경 보고서 양식으로 원클릭 출력되는 학교 행정 도구입니다. 환경 보고서 작성 시간을 80% 이상 단축하고, 데이터 기반의 투명한 에코 스쿨 행정을 실현합니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
전기·수도·가스 3원 입력 전년 동월 대비 사용량을 입력하면 즉각적인 절감 백분율과 실비 차감액이 자동 산출됩니다. 관리자가 매월 말일 인터넷에서 검계 조회 후 원클릭 계산.
탄소(CO2) 저감량 자동 환산 전기 1kWh당 약 0.45kg의 CO2가 발생하는 표준 배출계수를 적용하여 절감 효과를 계산합니다. 나무 감수 환산(1그루 나무가 1년간 흡수하는 CO2량)까지 자동 출력.
가정통신문·보고서 양식 출력 브라우저 인쇄 대화상자에서 'PDF로 저장'을 누르면 A4 규격의 깔끔한 가정통신문이 완성됩니다. 교장 결재용 환경 보고서 서식 및 학부모 홍보 통문 자동 조판.

2. 핵심 아키텍처 해설

① 에너지 유형별 탄소 배출계수 상수

const EMISSION_FACTOR = {
  electricity: 0.4576, // 전기(kWh)당 CO2 kg — 한국 전력 표준 배출계수
  water: 0.383,        // 상수도(m3)당 CO2 kg — 하수처리 및 조수 에너지 반영
  gas: 2.268           // 도시가스(m3)당 CO2 kg — 액화 LNG 기준
};

const UTILITY_PRICE = {
  electricity: 153.5,  // 전기(kWh)당 원
  water: 672,          // 수도(m3)당 원
  gas: 20.1            // 도시가스(m3)당 원
};

한국 전력공사와 상수도 표준 배출계수(공식 지침 기준)를 상수에 심어두면, 월 사용량만 입력하면 즉시 CO2 및 금액이 계산됩니다.

② 절감량 및 저감 CO2 계산기

function calculate(lastYear, thisYear, type) {
  const saved = lastYear - thisYear;
  const co2Saved = saved * EMISSION_FACTOR[type];
  const moneySaved = saved * UTILITY_PRICE[type];
  return {
    saved: saved,
    co2Saved: co2Saved.toFixed(2),
    moneySaved: Math.round(moneySaved).toLocaleString(),
    treeEquiv: Math.round(co2Saved / 20) // 1그루 나무 = 연 20kg CO2 흡수
  };
}

전년 대비 절감량을 기준으로 CO2 저감량, 원화 절감액, 그리고 나무 환산 개수(시각적 감동 포인트)까지 동시에 산출합니다.

③ 브라우저 인쇄용 가정통신문 서식

@media print 쿼리를 활용하여 화면을 A4 규격의 학교 공식 가정통신문 서식으로 재조합합니다. 교장 서명 칸, 절약 요약 대시보드, 학생 권고사항 3줄이 포함됩니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학교 학급 수(교실 수)와 주요 전기 소비 주력 설비에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 에너지리포트.html로 저장하여 총무 담당 교사 PC에서 엽니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN) 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 배출계수 및 요금 상수: const EMISSION_FACTOR = {...} 상수에 전기·수도·가스의 공식 표준 배출계수 및 요금을 심어두어 정확한 계산이 이루어지도록 한다.
3. 인쇄용 서식 (@media print): 화면용 대시보드와 별도로 A4 인쇄 시 '학교 가정통신문(절약 실천 안내)' 서식으로 자동 전환되도록 설계한다.
4. 나무 환산 지표: 절감 CO2량을 나무 환산 개수로 표기하여 환경 행정의 설득력을 시각적으로 높인다.
5. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 우리 학교의 주요 에너지 절감 목표 항목이 무엇인가요? (전기, 수도, 가스 중 우선순위)
2. 가정통신문에 포함할 학생·학부모 권고사항 3가지를 지정할까요?
3. 대시보드 색상 톤은 공식적인 블루 톤과 따뜻한 그린 톤 중 어느 것으로 갈까요?

🎯 에디터 한줄평

"올해 우리 학교가 줄인 전력량이 나무 12그루가 한 해 동안 마신 공기만큼이나 깨끗해졌다는 사실은, 숫자와 단어가 아닌 '이해할 수 있는 생명'의 언어로 학생들과 학부모의 마음을 움직입니다. 환경 보고서는 종이에만 있던 지루한 표가 아니라 학교 공동체가 실천한 흔적의 증명서입니다."

📚 기술·교육 참고 링크

  • 환경부 온실가스 배출계수 표준 및 한국전력공사 전력 절약 지침
  • 교육과정 연계: 환경행정, 사회(에너지 자원 활용), 과학(에너지 이동 및 전환), 초등 생태 교육

[음악·체육] 다면 제약 기반 모둠 협동학습 & 악기 파트 최적 편성기



사이 안 좋은 친구끼리 모이지 않게 — '다면 제약 조건 기반 모둠 협동학습 & 악기 파트 최적 편성기'

🎵 초등 음악·체육 융합 및 협동학습 — 리코더·단소 앙상블이나 체육 기계체조 모둠 활동 시, 학생들의 연주·신체 역량(상/중/하)을 모둠마다 골고루 1명씩 분배하고, 사이가 좋지 않은 학생은 서로 다른 모둠으로 자동 분리하는 융합 편성 도구입니다. 교사의 주관적 편향 없이 공정하고 균형 잡힌 협동학습 모둠을 1초 만에 만듭니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
역량 상/중/하 균형 배분 연주력이 '상'인 학생, '중'인 학생, '하'인 학생을 각 모둠마다 1명씩 골고루 분배하여 앙상블 역량이 평균화되도록 만듭니다. 연주 역량 분포표를 상수에 넣고 1클릭 자동 배분.
모둠 분리 조건(Separate Constraint) 사이가 좋지 않아 함께하기 어려운 학생 2인을 서로 다른 모둠에 자동 배치합니다. 분리 대상 닉네임 목록을 상수에 넣으면 알고리즘으로 자동 처리.
악기 파트 최적 배분 리코더, 단소, 우치, 타악 4개 파트를 각 모둠에 고르게 분배하여 앙상블 밸런스를 자동 맞춥니다. 파트 정보를 입력하면 학생별 악기 부여가 알고리즘으로 자동 결정.

2. 핵심 아키텍처 해설

① 학생 데이터 및 분리 조건 상수

const STUDENTS = [
  { no: 1, nick: "코알라", skill: "상", part: "리코더" },
  { no: 2, nick: "돌고래", skill: "중", part: "단소" },
  { no: 3, nick: "여우", skill: "하", part: "타악" },
  { no: 4, nick: "토끼", skill: "중", part: "우치" }
];

const SEPARATE_PAIRS = [
  [1, 3], // 번호 1과 3은 서로 다른 모둠으로
  [2, 4]
];

학생별 역량(상/중/하)과 악기 파트 정보, 그리고 분리 대상 조합을 상수로 심어둡니다.

② 조건 만족 배분(Constraint Satisfaction) 알고리즘

function assignGroups(students, separatePairs, groupCount) {
  const groups = [];
  for (let i = 0; i < groupCount; i++) groups.push([]);
  const sorted = students.slice().sort((a, b) => rank(b.skill) - rank(a.skill));

  sorted.forEach(stu => {
    for (let gi = 0; gi < groupCount; gi++) {
      const g = groups[gi];
      const hasSeparate = g.some(m =>
        separatePairs.some(([a, b]) =>
          (a === stu.no && b === m.no) || (b === stu.no && a === m.no)
        )
      );
      if (!hasSeparate && !g.some(m => m.skill === stu.skill)) {
        g.push(stu);
        return;
      }
    }
    // 모든 모둠이 제약에 걸리면 마지막으로 넣음
    groups[sorted.length % groupCount].push(stu);
  });
  return groups;
}

function rank(skill) {
  return { "상": 3, "중": 2, "하": 1 }[skill] || 0;
}

역량이 높은 학생부터 순서대로, 각 모둠에 같은 역량이 없고 분리 조건에 걸리지 않는 모둠을 탐색하여 배정합니다.

③ 편성 결과 시각화 테이블

편성 완료 후 모둠 1~4개 테이블이 색상 라벨 카드로 표시되며, 학생별 닉네임·역량 뱃지·악기 파트가 함께 표시됩니다. 관찰 후 'CSV 내보내기' 버튼으로 결과를 학급 문집에 기록할 수 있습니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 모둠 수(4개)와 역량 분포에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 모둠편성기.html로 저장하여 음악실 태블릿에서 엽니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 백엔드 서버 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const STUDENTS = [...] 상수에 학생 닉네임·역량·악기 파트 정보를 내장하고, 별도 fetch 없이 브라우저에서 즉시 실행되도록 한다.
3. 제약 만족 알고리즘: 역량(상/중/하) 균형 배분 + 분리 조건(사이가 나쁜 조합) 자동 분리 + 악기 파트 고르게 분배를 동시에 만족하는 조건 만족(Constraint Satisfaction) 알고리즘을 구현한다.
4. 개인정보 최소 수집: 학생 실명을 사용하지 않고 닉네임과 번호만 취급하며, 브라우저 세션 메모리로만 유지한다.
5. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 모둠은 몇 개로 나눌까요? (4개 기본)
2. 악기 파트는 리코더·단소·우치·타악 4종으로 할까요?
3. 편성 결과를 화면에 색상 라벨 카드로 띄울까요, 아니면 표 형태로 갈까요?

🎯 에디터 한줄평

"'왜 내가 이 모둠인데요?'라는 질문을 소리치던 교실에서, 알고리즘이 내준 결과는 오해가 아니라 논리로 승부합니다. 분리 조건을 코드로 명시하는 순간, 교사는 편향이 아닌 과학적 배려로 학생의 배움 환경을 설계하는 전문가가 됩니다."

📚 기술·교육 참고 링크

  • 교육부 협동학습 모둠 편성 가이드라인 및 초등 음악 앙상블 지도법
  • 교육과정 연계: 초등 3~6학년 음악(합주·기악 연주), 체육(기계체조 협동 활동), 수학(조합 문제)

[창체·학급자치] 시력·청력 배려 및 짝꿍 연속 배정 방지 스마트 좌석 관리기



지난달에 같이 앉았는데 또? '시력·청력 배려 및 짝꿍 연속 배정 방지 스마트 좌석 관리기'

🪑 초등 창체·학급자치 — 안경을 착용하거나 청력 배려가 필요한 학생의 앞자리 고정 옵션과 함께, 지난달에 이미 짝꿍을 했던 학생과는 다음 달에 자동으로 짝꿍이 되지 않도록 과거 짝꿍 이력을 기억하는 고도화된 학급 경영 시스템입니다. 학생들의 건강권과 배려 요소를 세밀하게 보장하고 1년 동안 다양한 친구들과 골고루 교류하는 포용적 학급 문화를 조성합니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
시력·청력 앞자리 고정 배려 안경을 쓰거나 청력 배려가 필요한 학생은 앞 2열(앞자리 배려 코드)에 고정 배정됩니다. '앞자리 배려' 코드를 닉네임 옆에 입력하면 알고리즘이 자동 앞좌석 배치.
짝꿍 연속 배정 방지 (짝꿍 이력 기억) 최근 2개월간의 짝꿍 조합을 로컬 저장소에 기억하고, 다음 달에 자동으로 중복 배정을 배제합니다. 매월 초 자리 추첨 시 '지난달에 같이 했으니 다른 친구와!' 자동 배제.
CSV 이력 저장 & 편성 기록 매달의 짝꿍 조합을 CSV로 내보내서 1년간 다양한 조합을 시각적으로 확인할 수 있습니다. 월별 좌석도를 기록하여 학년말 학급 자치 자료로 아카이빙.

2. 핵심 아키텍처 해설

① 학생 배려 코드 및 짝꿍 이력 상수

const STUDENTS = [
  { no: 1, nick: "코알라", front: true }, // 앞자리 배려
  { no: 2, nick: "돌고래", front: false },
  { no: 3, nick: "여우", front: false },
  { no: 4, nick: "토끼", front: true } // 청력 배려
];

const PAIR_HISTORY = [
  { month: 8, pairs: [[1, 2], [3, 4]] },
  { month: 9, pairs: [[1, 3], [2, 4]] }
]; // 지난 2개월 짝꿍 조합 이력

학생별 앞자리 배려 코드와 최근 2개월간의 짝꿍 조합을 상수로 관리합니다.

② 짝꿍 이력 중복 방지 로직

function isRepeatPair(a, b, history, currentMonth) {
  return history.some(h => {
    // 현재 월 포함 최근 2개월 내 같은 조합이 있는지 검사
    if (h.month >= currentMonth - 2) {
      return h.pairs.some(([x, y]) =>
        (x === a && y === b) || (y === a && x === b)
      );
    }
    return false;
  });
}

한 학생이 짝꿍 후보로 추천될 때마다 과거 2개월 이력에서 이미 짝꿍이었던 조합인지 검사하여 자동 배제합니다.

③ 앞자리 고정 배려 알고리즘

function placeStudents(students, columns, pairHistory, month) {
  const seats = [];
  const frontFix = students.filter(s => s.front); // 앞자리 배려 대상
  const normal = students.filter(s => !s.front);
  // front 학생은 앞 2행에 고정 배치, 나머지는 셔플 후 순환 배분
  ...
}

'앞자리 배려' 코드를 가진 학생을 앞 2열에 우선 배치하고, 나머지 학생들은 셔플 알고리즘으로 배정합니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학급 인원수(예: 26명)와 앞자리 배려 인원에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 좌석관리기.html로 저장하여 월초 자리 추첨 시 전자칠판에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 백엔드 서버 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const STUDENTS = [...] 상수에 학생 닉네임·앞자리 배려 코드와 const PAIR_HISTORY = [...] 상수에 최근 2개월 짝꿍 조합을 내장한다.
3. 앞자리 배려 알고리즘: 'front: true'인 학생을 앞 2행에 우선 고정 배치한다.
4. 짝꿍 중복 배정 방지: 최근 2개월간의 짝꿍 조합 이력을 상수에서 읽어 중복 배정을 자동 배제하는 가중치 로직을 구현한다.
5. 개인정보 최소 수집: 학생 실명을 사용하지 않고 닉네임과 번호만 취급하며, 짝꿍 이력은 로컬 CSV로 관리한다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 학급 전체 인원수와 앞자리 배려가 필요한 학생은 몇 명인가요?
2. 짝꿍 이력을 몇 개월 동안 기억할까요? (2개월 기본 / 3개월 확장)
3. 좌석도를 화면에 격자 배치도로 띄울까요, 아니면 표 형태로 갈까요?

🎯 에디터 한줄평

"월초 자리 추첨에서 두려움에 떨던 것이 무엇이었을까요? ① '또 그 애랑 나랑 안되었으면 좋겠는데'라는 예민한 불안감과 ② '내가 눈이 안 좋은데 뒤에 앉으면 안 볼 텐데'라는 학습권의 소리였습니다. 이 알고리즘은 코드 안에서 그 두 속삭임을 동시에 접수해냅니다. 배려는 감정이 아니라 설계로 구현되는 것입니다."

📚 기술·교육 참고 링크

  • 학생 건강안전사업단 '학생 시력 보호 및 안내 지침' 및 협동학습 그룹 배정 표준안
  • 교육과정 연계: 초등 3~6학년 창체(학급자치), 도덕(친구 존중), 실과(데이터 정리)

[교사·고사관리] 학년 연합 정기고사 지그재그 분반 좌석표 생성기 - 1분 만에 완성



지그재그로 부정행위를 원천 차단하는 '학년 연합 정기고사 & 학업성취도 평가 분반 좌석표 생성기'

🪄 교사·고사관리 — 1학기 지필평가나 국가수준 학업성취도 평가 시 1반과 2반 학생들을 1열씩 번갈아 지그재그(1반-2반-1반-2반)로 교차 배치하여 부정행위를 원천 차단하고, 교실 부착용 좌석표와 감독관용 명단을 즉시 출력합니다. 수작업으로 며칠씩 걸리던 시험 분반 좌석 배치 업무를 1분 만에 완료합니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
지그재그 교차 알고리즘 1번(1반), 1번(2반), 2번(1반), 2번(2반)처럼 각 행에 두 학급의 번호가 번갈아 배치되어 인접 학생이 같은 반 학생이 되지 않게 합니다. 두 학급 명단 CSV를 업로드하면 지그재그 교차 자동 조판.
수험번호 자동 부여 좌석 배치가 끝나면 좌측 상단부터 일련번호(수험 번호)가 자동으로 부여되어 감독관용 명단에 표기됩니다. 행(row) × 열(column) 좌표를 수험번호로 변환.
교실 부착용 & 감독관용 이중 출력 교실 벽에 붙일 대형 좌석도와 감독관이 챙겨 가는 명단 목록을 각각의 레이아웃으로 자동 생성합니다. @media print 서식으로 A4 가로 2장 출력.

2. 핵심 아키텍처 해설

① 학생 명단 CSV 업로드 및 파싱

const CLASS_A = ["김하늘", "이지원", "박민준", ...]; // 1반 명단
const CLASS_B = ["정서윤", "최도현", "강소현", ...]; // 2반 명단

function interleave(a, b) {
  const result = [];
  const maxLen = Math.max(a.length, b.length);
  for (let i = 0; i < maxLen; i++) {
    if (a[i]) result.push({ name: a[i], class: "1반" });
    if (b[i]) result.push({ name: b[i], class: "2반" });
  }
  return result;
}

두 학급 명단을 순서대로 번갈아 끼워 넣는(교차 배치) 순수 알고리즘입니다.

② 행·열 좌표 기반 수험번호 부여

function seatNumber(row, col, colsPerRow) {
  return row * colsPerRow + col + 1;
}
// 예: 6열 × 5행 좌석에서 3행 4열 = 19번
// 1행 1열부터 왼쪽→오른쪽, 위에서 아래로 순차 부여

좌석 배치가 완료되면 좌표 좌상단부터 1번, 2번... 순차적으로 수험번호가 부여되어 감독관용 명단에 연결됩니다.

③ @media print 이중 서식 (교실 부착용 + 감독관용)

@media print를 적용하여 화면 표시 모드와 별도로 A4 가로 방향 인쇄 시 교실 벽에 부착할 대형 좌석 격자표와 감독관용 학생 목록이 2장으로 분리되어 출력됩니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학급 인원수(각 반 20~28명), 좌석 열 수, 시험 과목명에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 고사좌석표.html로 저장하여 고사계에서 인쇄합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN) 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const CLASS_A = [...] 및 const CLASS_B = [...] 상수에 각 학급 학생 닉네임(또는 실명)을 심어두고 즉시 실행되도록 한다.
3. 지그재그 교차 배치 알고리즘: 1반과 2반을 행(row) 단위로 번갈아 교차 배치하여 인접 학생이 같은 반 학생이 되지 않도록 한다.
4. 수험번호 자동 부여: 좌석 행·열 좌표 기준으로 좌측 상단부터 1번, 2번 순차 부여.
5. @media print 서식: 교실 부착용(대형 격자표)과 감독관용(명단 목록) 2장으로 분리 출력.
6. 학생 개인정보: 학급 내부 관리용이므로 학생 실명 사용을 허용하되, 외부로 전송하지 않는다(단일 HTML 오프라인).
7. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 학년 연합 시험에서 몇 개 학급(1반, 2반 외에도?)을 섞을까요?
2. 좌석 행(rows)과 열(columns)은 몇 줄씩 배치할까요? (예: 5행 × 6열)
3. 교실 부착용 좌석표를 가로 방향(A4 landscape)으로 출력할까요?

🎯 에디터 한줄평

"시험지에 다른 학생 답을 엿보려는 눈은, 인접 좌석이 같은 반 학생이 아닐 때 가장 먼저 포기합니다. 지그재그 알고리즘은 단순한 교차 배치이지만, 그것을 누가 어떤 순서로 배치했는지가 아닌 '규칙 그 자체'로 무결성을 증명할 때 고사계 교사는 진짜 투명성을 확보하게 됩니다."

📚 기술·교육 참고 링크

  • 교육부 학업성취도 평가 표준 관리지침 및 학급별 좌석표 표준 양식
  • 교육과정 연계: 교무 고사 관리, 초등 6학년 학업성취도 평가(수학, 국어, 과학)

[사회·도덕] 우리 동네 안전 취약점 지도 & 모둠별 개선 제안 포털



학교 주변 위험 구역을 지도에 핀으로 찍는다 — '우리 동네 안전 취약점 지도 & 모둠별 개선 제안 포털'

🗺️ 초등 4~6학년 사회·도덕 융합 — 학생들이 학교 주변 통학로를 탐사하며 발견한 안전 취약점(신호등 없는 횡단보도, 파손된 보도블록) 사진을 지도에 핀으로 등록하고, 학급 전체가 투표를 통해 개선안을 도출하는 참여형 웹앱입니다. 교과서 속 지리 학습을 실생활 참여형 지역사회 문제 해결 프로젝트로 확장하여 능동적 시민성을 함양합니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
SVG 약도 지도 + 핀 마커 학교 주변 통학로 약도를 SVG 도형으로 그려두고, 학생이 터치한 위치에 주의 등급(빨강/노랑) 핀이 찍힙니다. 터치 시 핀을 클릭하면 현장 메모 팝업이 열립니다.
투표 기반 개선안 도출 등록된 위험 구역마다 '개선 제안' 버튼으로 의견을 모으고, 투표 수가 가장 많은 개선안이 상단에 표시됩니다. "신호등 설치" vs "횡단보도 재도색" 투표수 비교 그래프 자동 렌더링.
모둠별 제안 카드 모둠별로 제안한 개선 방안을 카드 블록으로 정리하면 전교생이 보는 안전 지도를 함께 완성합니다. CSV 내보내기로 교육청 안전신고용 목록 아카이빙.

2. 핵심 아키텍처 해설

① 위험 구역 데이터 구조: HAZARDS 상수

const HAZARDS = [
  { id: 1, x: 140, y: 90, level: "빨강", desc: "신호등 없는 횡단보도 — 출입 차량 많음", proposals: ["신호등 설치", "과속방지턱"] },
  { id: 2, x: 220, y: 130, level: "노랑", desc: "보도블록 파손 — 보행자 미끄럼 위험", proposals: ["보도블록 교체"] }
];

학생들이 조사한 위험 구역을 좌표(x, y), 주의 등급, 설명, 개선 제안 목록으로 상수에 심어둡니다.

② 투표 알고리즘 및 랭킹 렌더링

function voteProposal(hazardId, proposalText) {
  const h = HAZARDS.find(h => h.id === hazardId);
  if (!h.proposals.includes(proposalText)) h.proposals.push(proposalText);
  h.votes = h.proposals.map(p => ({
    text: p,
    count: HAZARDS.reduce((sum, x) =>
      sum + (x.id === hazardId ? 1 : 0), 0)
  }));
  renderProposals(h);
}

각 핀에 연결된 개선 제안 목록에 투표 수를 합산하고, 가장 많이 표를 받은 제안이 자동으로 상단에 표시됩니다.

③ SVG 지도 핀 마커 렌더링

function renderPins(svg) {
  HAZARDS.forEach(h => {
    const pin = document.createElementNS("http://www.w3.org/2000/svg", "circle");
    pin.setAttribute("cx", h.x);
    pin.setAttribute("cy", h.y);
    pin.setAttribute("r", h.level === "빨강" ? 8 : 6);
    pin.setAttribute("fill", h.level === "빨강" ? "#e53e3e" : "#ecc94b");
    svg.appendChild(pin);
  });
}

SVG 문서 모델(SVG namespace)에 원(circle)을 추가하여 학생이 등록한 위치에 빨강/노랑 핀이 렌더링됩니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학교 주변 통학로 지도 형식과 위험 구역 유형(신호등 부재, 도로 파손 등)에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 안전지도.html로 저장하여 학급 태블릿에서 투표합니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 백엔드 서버 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const HAZARDS = [...] 상수에 학생이 발견한 위험 구역 3건 이상의 좌표·등급·설명·개선안을 내장하고 브라우저에서 즉시 렌더링되도록 한다.
3. SVG 지도 핀 마커: 학교 주변 약도를 SVG 도형으로 직접 그리고, 상수에 심어둔 좌표(x, y)에 빨강(위험)·노랑(주의) 원형 핀을 렌더링한다.
4. 투표 기반 개선안: 각 핀에 연결된 개선 제안 목록에 투표 수를 합산하고, 상위 개선안이 상단에 표시되도록 설계한다.
5. 학생 개인정보 최소 수집: 학생 실명 대신 모둠명과 닉네임만 취급하며, 세션 메모리로만 유지한다.
6. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 학교 주변 약도(SVG)를 교실 화면에서 어떻게 그릴까요? (직접 도형으로 / 교사가 미리 그려서 심기)
Q2. 투표 시스템은 학급 태블릿에서 일괄 터치할까요, 아니면 개별 스마트폰에서 할까요?
Q3. 안전 지도 테마는 지도 앱 느낌의 회색 톤과 밝은 스카이 톤 중 어느 것으로 갈까요?

🎯 에디터 한줄평

"'내가 걸어온 길이 위험하다는 걸 내가 찾았어'라는 발견이 학생의 발언권을 조기에 부여합니다. 특히 투표로 개선안을 도출하는 과정은 지역사회 문제 해결의 핵심인 '시민적 합의'를 아주 자연스럽게 몸으로 배우는 경험입니다. 나중에 교육청에 실제 안전 신고를 넣을 때 데이터를 그대로 활용하면 더 큰 시민 과학으로 확장할 수 있습니다."

📚 기술·교육 참고 링크

  • 국토교통부 지역 안전시설 통계 및 도로교통안전 학생교육 표준 가이드라인
  • 교육과정 연계: 초등 4~6학년 사회(지역 문제 해결), 도덕(공동체적 삶), 과학(지역 환경 관찰)

[창체·학급자치] 학급 자치 헌법 제정 & 실시간 모둠 안건 투표 시스템



우리 반 규칙을 우리가 만들어 찬반 투표로 통과시킨다 — '학급 자치 헌법 제정 & 실시간 모둠 안건 투표 시스템'

🗳️ 초등 창체·학급자치 — 매주 학급 다모임 회의 시 모둠별로 발제한 학급 규칙 건의사항을 실시간으로 상정하고, 학생들이 교실 태블릿으로 즉시 찬반 투표하여 결과를 시각적 막대 그래프로 확인하는 디지털 민주주의 플랫폼입니다. 학급 자치 헌법의 조항을 아이들 손으로 직접 통과시키는 체험을 통해 민주시민의 기본 자질을 몸에 새깁니다.

📖 한 줄 정의

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

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

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
헌법 제정 3단계 워크플로 1) 모둠별 발제 → 2) 전교생 찬반 투표 → 3) 통과된 규칙을 '학급 자치 헌법'에 조항 등록. 세 단계가 한 화면에서 흐르는 것처럼 이어집니다. 다모임 시간 20분 내 투표 완료하고 학급 헌법에 새 조항을 등록.
실시간 막대 그래프 투표 찬성/반대 투표 버튼을 누르는 순간 막대 그래프가 애니메이션으로 늘어나고 퍼센트가 표시됩니다. "찬성 64% vs 반대 36%"를 즉시 시각화 — 투표의 무게를 몸으로 체감.
헌법 조항 아카이빙 통과된 규칙은 학급 헌법 조항 목록에 자동 등록되고, 학기말 CSV 내보내기로 인쇄합니다. 1학기 마지막 날 학급 자치 헌법 전문을 인쇄하여 교실 게시판에 부착.

2. 핵심 아키텍처 해설

① 안건 및 헌법 조항 상수

const AGENDAS = [
  { id: 1, text: "교실 뒷줄 정리당번 확대", proposer: "모둠 1", yes: 0, no: 0 },
  { id: 2, text: "화요일마다 칭찬 스탬프 교환", proposer: "모둠 3", yes: 0, no: 0 }
];

const CONSTITUTION = [
  { no: 1, text: "사이 좋게 지내며 서로 존중한다", date: "2026-03-15" }
];

상정된 안건과 통과되어 학급 헌법에 등록된 조항을 각각 배열로 관리합니다.

② 찬반 투표 및 막대 그래프 실시간 렌더링

function vote(agendaId, isYes) {
  const a = AGENDAS.find(x => x.id === agendaId);
  if (isYes) a.yes++; else a.no++;
  const total = a.yes + a.no;
  const yesPct = total > 0 ? Math.round(a.yes / total * 100) : 0;

  document.getElementById("yes-bar").style.width = yesPct + "%";
  document.getElementById("no-bar").style.width = (100 - yesPct) + "%";
  document.getElementById("result").textContent =
    "찬성 " + a.yes + "표 (" + yesPct + "%) / 반대 " + a.no + "표";
  sound("ding");
}

투표 버튼이 눌릴 때마다 막대 그래프가 애니메이션으로 갱신되며, 과반수를 넘으면 자동으로 '통과!' 녹색 뱃지가 표시됩니다.

③ 헌법 등록 및 CSV 내보내기

function passToConstitution(agendaId) {
  const a = AGENDAS.find(x => x.id === agendaId);
  const today = new Date().toISOString().slice(0, 10);
  CONSTITUTION.push({
    no: CONSTITUTION.length + 1,
    text: a.text,
    date: today
  });
  sound("fanfare");
}

과반수를 넘은 안건은 '헌법 등록' 버튼으로 자치 헌법 조항에 자동 등록되며, 학기말 CSV 내보내기로 인쇄합니다.

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

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 모둠 개수(4개)와 기존 자치 규칙 수에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 자치헌법투표.html로 저장하여 학급 다모임 시간에 전자칠판에 띄웁니다.

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

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN), 백엔드 서버 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const AGENDAS = [...] 상수에 발제 안건 2건 이상과 const CONSTITUTION = [...] 상수에 기존 자치 헌법 1건 이상을 내장한다.
3. 실시간 투표 및 막대 그래프: 찬성/반대 투표 버튼을 누르면 즉시 막대 그래프가 애니메이션으로 늘어나고 퍼센트가 표시된다. 과반수 초과 시 '통과!' 뱃지가 표시된다.
4. 학생 개인정보 0: 투표는 익명으로 하고 발제자는 모둠명만 표기하며, 학생 실명을 저장하지 않는다.
5. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지를 먼저 나에게 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 과반수 기준을 과반(50% 초과)으로 할까요, 2/3(66% 초과)으로 할까요?
Q2. 투표 화면 배경을 학급 자치 느낌의 파랑 톤과 민주주의 느낌의 빨강 톤 중 어느 것으로 갈까요?
Q3. 학기말 헌법 전문 인쇄 시 A4 세로 방향으로 갈까요?

🎯 에디터 한줄평

"'그 규칙 마음에 안 들어요'라고 소리치는 것이 아니라, 내 의견을 주문서에 적어 상정하고 누군가의 찬성표를 받아 통과시키는 과정 — 그것이 초등학교 교실에서 가장 초기 단계의 민주주의 실습입니다. 투표 막대가 오르내릴 때 아이들은 '내 의견은 무게가 있다'는 것을 몸으로 배우게 됩니다."

📚 기술·교육 참고 링크

  • 교육부 학생 자치활동 활성화 가이드라인 및 초등 학급 회의 표준안
  • 교육과정 연계: 초등 3~6학년 창체(학급 자치 회의), 도덕(민주적 의사 결정), 사회(지역 사회 참여)

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) 인지 심리학 원리 및 초등 주의집중력 훈련 자료
  • 교육과정 연계: 초등 창체(자율활동, 학급자치), 체육·보건(정신건강 및 두뇌 건강)