외솔 DB가 하는 일
챗GPT에게 "칭찬 포인트 앱 만들어 줘"라고 하면 예쁜 HTML 한 장은 금방 나옵니다. 그런데 기록이 저장되지 않습니다. 새로고침하면 사라지고, 다른 컴퓨터에서는 보이지 않습니다. 저장하려면 구글 시트에 앱스 스크립트를 붙이거나 Firebase 콘솔을 거쳐야 했고, 그 단계에서 많은 선생님이 멈췄습니다.
외솔 DB는 그 과정을 버튼 하나 → 복사 → 붙여 넣기로 줄입니다. 선생님은 코드를 보지 않고, 챗GPT가 안내문을 읽고 연동 코드를 알아서 씁니다.
- 준비물: 외솔.한국 계정(선생님 로그인), 챗GPT·클로드·제미나이 중 하나, 컴퓨터.
- 넣을 수 있는 것: 번호·별명·선택값·점수 같은 학급 활동 기록. 연락처·생년월일·건강·가정 정보는 넣지 않습니다. 표를 처음 만들 때 한 번 동의합니다.
외솔.한국에 로그인하고 「외솔 DB」 탭을 엽니다
주소창에 외솔.한국을 입력하고 오른쪽 위 선생님 로그인을 누릅니다. 첫 화면을 아래로 내리면 바이브 코딩 w 외솔 카드가 있고, 그 안에 외솔 드롭 | 외솔 DB 탭이 있습니다. 외솔 DB를 누릅니다.
바이브 코딩 w 외솔 카드의 탭. 외솔.한국/#db 로 들어오면 바로 이 탭이 열립니다
표 이름을 적고 「표 만들기」를 누릅니다
예: 5학년 1반 칭찬 포인트. 컬럼(열)은 정하지 않습니다. 챗GPT가 만드는 앱마다 기록 모양이 다르고, 선생님이 미리 설계할 수 없기 때문입니다. 첫 기록이 들어오면 그 모양대로 열이 자동으로 생깁니다.
처음 한 번은 "연락처·생년월일·건강·가정 정보는 넣지 않습니다"에 동의하는 확인란이 나옵니다. 계정당 한 번만 체크하면 됩니다.
「챗GPT용 복사」를 누릅니다
표가 만들어지면 세 가지가 보입니다. 표 주소, 교사 키, 그리고 파란 「챗GPT용 복사」 버튼. 이 버튼 하나로 주소·키·연동 안내문이 한꺼번에 복사됩니다.
https://oesol.dev/v1/t/k7m2p9x4q1wz복사••••••••••••••••••••보기 복사표 세부 화면. 큰 파란 버튼 하나면 됩니다
복사되는 안내문은 15줄짜리 문단입니다. 선생님이 읽을 필요는 없지만, 궁금하면 개발자용 요약에 내용이 있습니다. 안내문에는 버전(v1)이 붙어 있어 서비스가 바뀌어도 책과 연수 자료가 낡지 않습니다.
챗GPT 대화창에 붙여 넣고 한 줄을 덧붙입니다
이미 만들어 둔 HTML 앱이 있다면 그 대화에 이어서 붙여 넣고 이렇게 씁니다.
(붙여 넣은 안내문)
위 안내대로 기록이 외솔 DB 표에 저장되게 바꿔 줘. 저장되면 "저장됨"이라고 표시해 줘.
처음부터 만든다면 안내문 뒤에 원하는 앱을 설명합니다.
(붙여 넣은 안내문)
우리 반 칭찬 포인트 앱을 HTML 한 장으로 만들어 줘.
번호(1~30)와 이유(배려·노력·발표·정리)를 고르고 「주기」를 누르면 위 표에 저장되고,
아래에 번호별 합계가 보이게 해 줘.
챗GPT가 HTML 파일을 줍니다. 파일로 내려받거나, 코드 전체를 복사해 둡니다.
받은 HTML을 「외솔 드롭」 탭에 올립니다
같은 카드의 외솔 드롭 탭으로 가서 HTML 파일을 끌어다 놓고(또는 코드 붙여 넣기), 배포 주소를 정하고 배포하기를 누릅니다. 외솔.한국/우리반칭찬 같은 주소가 나옵니다. 자세한 방법은 외솔 드롭 사용 안내에 있습니다.
이 주소를 학생에게 알려 주면(QR, 칠판, 클래스룸) 학생이 누르는 기록이 표에 쌓입니다. 꼭 외솔 드롭이 아니어도 됩니다. 파일로 연 HTML(file://)이나 다른 곳에 올린 HTML에서도 그대로 동작합니다.
기록을 보고, 내려받고, 관리합니다
외솔 DB 탭에서 표를 누르면 기록이 표로 보입니다. 열은 기록의 키를 모아 자동으로 만들어집니다. 최신 기록이 위에 옵니다.
- CSV 내려받기: 엑셀에서 바로 열립니다(한글 깨지지 않음).
- 행 삭제: 각 행 오른쪽 「삭제」. 장난 기록 하나를 지울 때.
- 쓰기 잠금: 투표 마감, 장난 입력 차단. 읽기는 되고 추가·수정만 막힙니다. 언제든 풉니다.
- 표 비우기: 기록만 모두 지우고 주소·키는 그대로. 새 학기 시작할 때.
- 표 삭제: 주소·키·기록이 모두 사라집니다.
- 키 다시 발급: 교사 키가 샌 것 같을 때. 이전 키는 즉시 무효가 됩니다.
- 새 주소로 바꾸기: 표 주소가 샌 것 같을 때. 기록은 그대로 두고 주소만 바뀝니다(키도 함께 바뀜).
교사 키는 언제 필요한가요?
표 주소만 알면 누구나 읽고 추가할 수 있습니다. 고치고 지우는 것만 교사 키가 필요합니다. 학생 투표 앱은 키 없이 모든 기기에서 돌아가고, 선생님이 지우는 일은 외솔.한국 화면에서 로그인한 채로 하면 되니 대부분은 키를 신경 쓸 일이 없습니다.
| 상황 | 방법 | 키 |
|---|---|---|
| 잘못 들어간 기록 하나 지우기 | 외솔.한국 외솔 DB 탭에서 행 삭제 | 불필요 |
| 선생님만 여는 앱(점수 관리, 출결 체크) | 챗GPT가 키를 HTML 안에 넣어 줍니다. 선생님의 어느 기기에서든 수정·삭제 | HTML 안에 |
| 학생과 선생님이 같은 앱을 쓰는데 선생님만 지워야 할 때 | 챗GPT에 "교사용 화면은 따로 한 장 만들어 줘". 학생용(추가만)과 교사용(키 포함) 두 장을 외솔 드롭에 올립니다 | 교사용에만 |
바이브 코딩 첫걸음: 이렇게 말해 보세요
바이브 코딩은 "코드를 짜는 것"이 아니라 "원하는 것을 정확히 말하는 것"입니다. 아래 프롬프트는 모두 안내문을 먼저 붙여 넣은 뒤에 이어서 씁니다. 화면 모양, 색, 글자 크기 같은 것은 나중에 "더 크게", "파란색으로" 식으로 고쳐 가면 됩니다.
우리 반 칭찬 포인트 앱을 HTML 한 장으로 만들어 줘. 번호(1~30)와 이유(배려·노력·발표·정리)를 고르고 「주기」를 누르면 위 표에 저장돼. 아래에 번호별 합계를 큰 숫자로 보여 주고, 10초마다 새로 읽어서 갱신해 줘.
학급 투표 앱을 만들어 줘. 위에 투표 제목과 선택지 4개를 선생님이 적을 수 있고, 학생은 번호와 선택지를 고르고 제출하면 표에 저장돼. 결과 화면은 막대그래프로, 10초마다 새로 읽어 줘. 한 번호는 한 번만 투표되게 해 줘.
현장체험학습 희망 조사 페이지를 만들어 줘. 번호, 희망 장소(3개 중 선택), 한 줄 이유를 적어 제출하면 표에 저장돼. 제출하면 "제출됐습니다"만 보이고 다른 학생 답은 보이지 않게 해 줘.
독서 기록장을 만들어 줘. 번호, 책 제목, 별점(1~5), 한 줄 느낌을 적어 저장해. 아래에 최근 기록 20개를 카드로 보여 주고, 번호를 누르면 그 학생 기록만 모아 보이게 해 줘.
모둠 점수판을 만들어 줘. 모둠 6개, 각 모둠에 +1 −1 버튼. 누를 때마다 표에 (모둠, 점수변화)가 저장되고, 화면은 표를 읽어 모둠별 합계를 크게 보여 줘. 이건 선생님만 쓰는 앱이야.
위 안내대로 이 앱의 기록이 외솔 DB 표에 저장되게 바꿔 줘. 저장되면 "저장됨"이라고 표시하고, 실패하면 "저장 실패, 다시 시도"를 보여 주되 입력은 지우지 마. 페이지를 열 때 표를 읽어 기존 기록도 보여 줘.
개발자용 요약 (안내문에 들어 있는 내용)
표 하나가 주소 하나입니다. 엔드포인트는 네 개뿐입니다. 모든 응답에 CORS가 열려 있어 file://로 연 HTML과 어느 배포 주소에서도 호출됩니다.
| 동작 | 요청 | 키 | 설명 |
|---|---|---|---|
| 읽기 | GET 표주소 | 없음 | 모든 행을 JSON 배열로. ?since={row} 그 뒤 행만. ?format=csv. ETag/304 지원 |
| 추가 | POST 표주소 | 없음 | 본문 JSON 객체 하나 → {"ok":true,"row":23,"at":"2026-10-21T09:30:12+09:00"} |
| 고치기 | PUT 표주소/{row} | X-Oesol-Key | 본문으로 행 전체를 교체 |
| 지우기 | DELETE 표주소/{row} | X-Oesol-Key | 행 하나 삭제. 표 전체 비우기는 화면에서만 |
// 추가
await fetch(표주소, { method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ 번호: 7, 이유: "배려", 점수: 1 }) });
// 읽기 (23번 이후만)
const rows = await (await fetch(표주소 + "?since=23")).json();
// [{ row: 24, at: "2026-10-21T09:31:00+09:00", 번호: 7, 이유: "배려", 점수: 1 }, ...]
- 실패 응답은 항상
{"ok":false,"error":"이유"}. 400 형식 오류, 401 키 없음, 403 키 불일치, 404 없는 표·행, 409 표 가득 참, 423 잠김, 429 속도 제한. - 컬럼은 없습니다. 객체의 키가 열 이름입니다.
row,at은 서버가 붙이는 예약어입니다. - 한도: 표당 20,000행, 행당 2KB, 교사당 50표, 표당 분당 120회 추가. 전화번호·주민번호 형식 값은 서버가 거부합니다.
- 마지막으로 쓰거나 읽은 뒤 400일이 지나면 자동 삭제됩니다. 30일 전에 메일을 보냅니다.
- 교사 키는 서버에 저장하지 않고 계산합니다. 「키 다시 발급」은 이전 키를 즉시 무효로 만듭니다.
자주 묻는 질문
구글 시트나 Firebase 대신 이걸 써야 하는 이유가 있나요?
설정 단계가 없다는 것 하나입니다. 구글 시트는 앱스 스크립트 배포 5단계를, Firebase는 콘솔과 보안 규칙을 거쳐야 합니다. 외솔 DB는 버튼 하나로 끝나고, 교육청 서비스라 책에 실어도 오래 유지됩니다. 대신 학급 규모 기록을 위한 것이라 한도가 있습니다. 한도를 넘는 일(학교 전체 설문, 수천 명 데이터)은 구글 시트나 다른 DB 서비스를 쓰세요.
학생 이름을 넣어도 되나요?
선생님 판단에 맡깁니다. 표 주소를 아는 사람은 누구나 읽을 수 있으니 번호나 별명을 권합니다. 연락처·생년월일·건강·가정 정보는 어떤 경우에도 넣지 않습니다. 전화번호·주민번호 모양의 값은 서버가 거부하지만, 이건 보조 장치일 뿐 선생님의 동의가 1차 안전장치입니다.
학생이 장난으로 아무 값이나 넣으면요?
행 삭제로 지우거나, 「쓰기 잠금」으로 잠시 막으세요. 챗GPT에게 "번호는 1~30만 받게 해 줘", "한 번호는 하루 한 번만" 처럼 앱 쪽에서 막아 달라고 할 수도 있습니다. 주소가 널리 샌 것 같으면 「새 주소로 바꾸기」를 누르면 됩니다.
교실 30명이 동시에 눌러도 괜찮나요?
괜찮습니다. 표당 분당 120회까지 추가할 수 있고, 학교 공용 IP 하나에서 많은 요청이 와도 막지 않습니다. 10초마다 결과를 새로 읽는 화면은 ?since를 쓰도록 안내문에 적혀 있어 가볍게 돌아갑니다.
휴대폰에서도 되나요?
학생이 앱을 쓰는 것은 휴대폰에서도 됩니다. 표를 만들고 관리하는 것도 휴대폰 브라우저에서 됩니다. 다만 챗GPT가 준 HTML을 외솔 드롭에 올리는 일은 컴퓨터에서 하는 것이 편합니다.
표 주소가 한글이 아니네요?
일부러 영문 주소(oesol.dev)를 씁니다. 챗GPT가 한글 도메인을 코드에 쓸 때 퓨니코드로 어긋나는 일을 피하기 위해서입니다. 이 주소는 사람이 아니라 코드가 부르는 쪽이고, 선생님이 보는 화면은 외솔.한국에 있습니다.
교사 키를 잃어버렸어요.
잃어버릴 수 없습니다. 외솔.한국 외솔 DB 탭에서 표를 열면 언제든 「보기」「복사」로 다시 볼 수 있습니다. 샌 것 같을 때만 「키 다시 발급」을 누르세요. 재발급하면 키를 넣어 둔 교사용 HTML은 새 키로 고쳐 다시 올려야 합니다.
1년 뒤에도 남아 있나요?
마지막으로 쓰거나 읽은 뒤 400일까지 남습니다. 학기 중에 쓰는 표는 계속 연장되는 셈입니다. 삭제 30일 전에 가입 메일로 안내가 가고, 그 전에 표를 한 번 열기만 해도 연장됩니다. 학년이 끝나면 CSV로 내려받아 두는 것을 권합니다.
외솔.한국 계정이 뚫리면 표도 위험한가요? 반대는요?
둘은 완전히 분리된 서버와 저장소입니다. 외솔 DB는 외솔.한국의 계정·단축 주소·학생 글에 접근할 정보를 갖고 있지 않고, 외솔.한국과 공유하는 것은 "로그인했는지 확인" 하나뿐입니다. 최악의 경우(표 주소와 교사 키가 둘 다 샘)에도 피해는 그 표 하나가 지워지거나 엉뚱한 값이 들어가는 것에 그칩니다.