쌤랩
← 작품 올리기로

🗳️ 실시간 방 만들기 가이드

쌤보드에 올리는 앱(HTML)에 "실시간 방"을 켜면, 교사가 방을 만들고 학생들이 6자리 코드로 접속해 같은 화면 상태를 실시간으로 공유할 수 있어요(퀴즈·투표·협동 활동 등). 이 글의 코드를 AI에게 그대로 주면 방을 쓰는 앱을 만들어 줘요.

업로드할 때 "실시간 방 사용(학생 접속)"을 체크해야 방 API를 쓸 수 있어요. 안 켜면 외부 통신이 전부 차단돼요.

준비된 것들

방 API

POST/api/room/create

본문 {tool_id}{code, host_token}. 교사가 방을 만들어요. tool_id는 window.__SSAMLAB_TOOL_ID를 넣으세요.

POST/api/room/join

본문 {code, nick}{member_token, snapshot}. 학생이 코드로 입장해요.

GET/api/room/poll?code=&since=&member_token=

{version, state, events}. 2~3초마다 불러 최신 상태·이벤트를 받아요. 토큰(member_token 또는 host_token)을 꼭 붙이세요.

POST/api/room/state

본문 {code, host_token, state}. 교사가 공유 상태(문제·화면 등, 32KB 이하)를 바꿔요.

POST/api/room/event

본문 {code, member_token, payload}. 학생이 이벤트(답·손들기 등, 2KB 이하)를 보내요.

복붙용 최소 코드

아래를 앱에 넣으면 방을 만들고/입장하고/동기화할 수 있어요. AI에게 "이 방 API로 ○○ 앱 만들어줘" 하면서 같이 주세요.

var API = "https://ssamlab.kr/api/room/";
var code = "", hostToken = "", memberToken = "", since = 0;

function api(action, body) {
  return fetch(API + action, { method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify(body) }).then(function (r) { return r.json(); });
}

// 교사: 방 만들기
function createRoom() {
  return api("create", { tool_id: window.__SSAMLAB_TOOL_ID || "" })
    .then(function (j) { if (j.ok) { code = j.code; hostToken = j.host_token; } return j; });
}
// 학생: 코드로 입장
function joinRoom(inputCode, nick) {
  return api("join", { code: inputCode, nick: nick || "학생" })
    .then(function (j) { if (j.ok) { code = inputCode; memberToken = j.member_token; } return j; });
}
// 교사: 공유 상태 바꾸기 (모든 참여자에게 반영)
function setState(state) { return api("state", { code: code, host_token: hostToken, state: state }); }
// 학생: 이벤트 보내기 (교사가 받음)
function sendEvent(payload) { return api("event", { code: code, member_token: memberToken, payload: payload }); }

// 2.5초마다 최신 상태·이벤트 받기 (토큰 꼭 포함!)
function poll(onState, onEvent) {
  if (!code) return;
  var u = API + "poll?code=" + encodeURIComponent(code) + "&since=" + since;
  if (memberToken) u += "&member_token=" + encodeURIComponent(memberToken);
  else if (hostToken) u += "&host_token=" + encodeURIComponent(hostToken);
  fetch(u).then(function (r) { return r.json(); }).then(function (j) {
    if (j && j.ok) {
      if (j.state && onState) onState(j.state);
      (j.events || []).forEach(function (ev) {
        since = Math.max(since, Number(ev.seq || 0));
        if (onEvent) onEvent(ev);
      });
    }
  }).catch(function () {}).then(function () { setTimeout(function () { poll(onState, onEvent); }, 2500); });
}
💡학생에게는 방 코드만 알려주면 돼요(같은 앱을 열고 코드 입력). 실제로 작동하는 예시는 쌤보드/자체제작의 "실시간 투표" 앱을 열어 보세요.