815 / 837
한두 시간이면 베끼는 시대, 교사 개발자는 무엇을 쌓아야 하는가?
교사 개발자들이 모인 자리에서 이런 조언이 나왔다. 서비스는 이제 웬만하면 한두 시간에 베낀다. 그러니 서비스만 내놓지 말고 교사로서 쌓은 경험과 이름을 묶어서 내놓아라. 이것저것 조금씩 하지 말고 하나를 오래 파고, 하고 있다는 사실을 알려라. 이슈를 올리고 브랜치를 파고 커밋하고 PR을 보내 머지하는 일도 직접 겪어 보라. 그 예로 나온 것이 오픈소스 교육과정 편성 프로그램이었다.
이 글은 그 조언의 근거를 확인한 다음, 마지막 예시를 한 사람이 겨울방학 전에 시작할 수 있는 크기로 줄여 본다.
코드는 싸졌고 남는 것은 따로 있다
2026년 2월 Cloudflare는 Next.js를 Vite 위에서 다시 구현한 vinext를 공개했다. 엔지니어 한 명이 AI에게 일을 시켜 일주일이 안 걸렸고, 들어간 Claude API 토큰 값은 약 1,100달러였다고 한다. 회사 스스로 실험 단계이며 대규모 트래픽으로 검증하지 않았다고 밝혔지만, 수년 동안 쌓인 프레임워크의 겉면을 한 주에 따라 만들 수 있다는 점은 보여 주었다.
같은 달 분산 데이터베이스 rqlite를 만든 Philip O’Toole은 자기 프로젝트를 두고 비슷한 말을 했다. rqlite는 MIT 라이선스라 누구나 코드를 읽을 수 있었다. 그래도 따라오기 어려웠던 까닭은 작동하는 시스템에 쌓인 투자량이었는데, 새 시스템을 그 지점까지 끌어올리는 비용이 급격히 내려갔다는 것이다. 그는 사람들이 원하는 기능을 목록에 오래 묵혀 두면 다른 누군가가 자기 시스템에 먼저 넣을 것이라고 썼다.
그러면 무엇이 남는가. 오픈코어 기업에 투자하는 Open Core Ventures는 코드가 해자였던 적은 없다고 쓴다. 해자는 커뮤니티, 전문성, 관계, 신뢰이고, 한 영역만 파는 쪽이 범용 사업자보다 예외 사례를 더 깊이 안다는 것이다. 투자사의 글이니 자기 사업 모델을 변호하는 면이 있다. 그래도 코드를 처음부터 공개하고 일하는 사람들이 내린 결론이라는 점에서 참고할 만하다.
vinext 사례에는 눈여겨볼 조건이 하나 있다. Cloudflare는 이 일이 가능했던 이유로 Next.js의 문서가 잘 돼 있고 방대한 테스트 모음이 있어 결과를 기계적으로 대조할 수 있었다는 점을 들었다. 명세와 정답지가 공개돼 있으면 베끼기 쉽다. 뒤집어 보면 명세가 여러 문서에 흩어져 있고 정답지를 현장 사람만 아는 영역은 코드를 만들기도, 베끼기도 어렵다. 학교의 교육과정 편성이 그런 영역이다.
시간표 도구는 많은데 편성표를 검산하는 도구는 없다
교육 분야에 오픈소스가 없는 것은 아니다. 직접 열어 확인한 것만 정리하면 다음과 같다.
| 도구 | 성격 | 확인한 사실 | 한계 |
|---|---|---|---|
| FET | 오픈소스(GNU AGPL v3) | 학교와 대학의 시간표를 자동으로 짜는 무료 소프트웨어. 공식 페이지에 2026년 11월 11일자 7.12.1판이 올라와 있다 | 푸는 문제가 수업 배치다. 한국 고시의 기준 시수 검산은 소개된 기능이 아니다 |
| UniTime | 오픈소스 | 대학의 강좌와 시험 시간표, 수강 배정을 다룬다. 2015년 3월부터 Apereo 재단 후원 프로젝트 | 대상이 대학이다 |
| aSc TimeTables | 상용 | 슬로바키아 회사 제품. 30년 경력과 20만 개 학교 사용을 내세운다. 무료 체험판은 내보내기가 빠진다 | 누리집 언어 선택 목록에 한국어가 없다 |
| 컴시간알리미 | 상용 프로그램의 조회 앱 | 컴시간 일과진행 프로그램을 쓰는 학교의 시간표만 조회된다 | 공식 API가 없어 비공식 파서에 기대야 한다 |
| NEIS 교육정보 개방 포털 | 공공 Open API | 누구나 쓸 수 있고, 학사일정 API는 학교별 학사일자와 행사명, 학년별 행사 여부를 준다 | 인증키가 필요하다. 샘플 키는 한 번에 5건으로 묶인다 |
컴시간 쪽에는 오픈소스가 겪는 한계가 그대로 드러난다. Node.js용 비공식 파서 comcigan-parser는 MIT 라이선스로 공개돼 있지만 README에 “컴시간측의 소스코드 변경으로 인해 시간표 데이터 파싱이 불가능 할 수 있습니다”라고 적어 두었다. 코드를 열어도 기대는 데이터가 남의 것이면 언제든 멈춘다.
이 도구들은 모두 누가 언제 어디서 수업하는지를 다룬다. 시간표를 짜기 전 단계, 곧 우리 학교가 정한 교과별 시수가 국가 기준 안에 있는지 따지는 일을 맡는 도구는 찾지 못했다. 그 일은 지금도 엑셀이 한다.
교육과정 편성은 엑셀로 하는 검산이다
초등학교에서 이 일은 대개 연구부장이나 교무부장이 맡고, 12월부터 2월 사이에 몰린다. 기준은 교육부 고시 제2022-33호 총론이다. 초등학교 시간 배당 기준(표 1)은 다음과 같다.
| 구분 | 1~2학년 | 3~4학년 | 5~6학년 |
|---|---|---|---|
| 국어 | 482 | 408 | 408 |
| 사회/도덕 | 해당 없음 | 272 | 272 |
| 수학 | 256 | 272 | 272 |
| 과학/실과 | 해당 없음 | 204 | 340 |
| 체육 | 해당 없음 | 204 | 204 |
| 예술(음악/미술) | 해당 없음 | 272 | 272 |
| 영어 | 해당 없음 | 136 | 204 |
| 바른 생활, 슬기로운 생활, 즐거운 생활 | 144, 224, 400 | 해당 없음 | 해당 없음 |
| 교과 소계 | 1,506 | 1,768 | 1,972 |
| 창의적 체험활동 | 238 | 204 | 204 |
| 학년군별 총 수업 시간 수 | 1,744 | 1,972 | 2,176 |
1~2학년의 교과는 국어, 수학과 통합교과 셋이다. 표의 숫자는 연간 34주를 기준으로 한 2년 치 기준 시수이고, 총 수업 시간 수는 최소 시수다. 표 밑에 규칙이 붙는다.
- 학교는 교과(군)별, 창의적 체험활동의 20% 범위 안에서 시수를 늘리거나 줄일 수 있다. 체육과 예술(음악/미술)은 기준 시수보다 줄일 수 없다.
- 3~6학년은 학교자율시간을 편성한다. 34주 기준 수업 시간의 학기별 1주 분량을 확보한다.
- 1~2학년 안전교육은 통합교과의 64시간을 포함해 편성한다.
- 정보교육은 실과의 정보 영역과 학교자율시간 등을 써서 34시간 이상 편성한다.
- 범교과 학습 주제 열 가지는 교과와 창의적 체험활동 전반에서 다룬다.
중학교는 3년간 3,366시간(교과 3,060, 창의적 체험활동 306)이고 한 학기를 자유학기로 운영한다. 고등학교는 192학점으로, 교과(군) 174학점과 창의적 체험활동 18학점(288시간)이다. 수업일수는 초·중등교육법 시행령 제45조에 따라 매 학년 190일 이상이다.
교사가 엑셀로 하는 일은 이 규칙을 순서대로 맞추는 것이다. 학사일정에서 휴업일을 빼고 수업일이 190일을 넘는지 센다. 요일마다 실제 수업할 수 있는 날이 다르므로 요일별 일수를 따로 센다. 주당 시간표에 요일별 일수를 곱해 교과별 연간 시수를 구하고, 2년 치를 더해 기준 시수와 견준다. 여기에 범교과 주제와 안전교육 시수를 어느 교과에서 확보했는지 표로 붙이고, 마지막에 나이스의 학교교육과정 편제 및 시간배당 메뉴에 옮겨 적는다. 수식 하나가 틀리면 학년 전체 표가 어긋난다.
시도 지침이 끼어들면 한 번 더 복잡해진다. 경기도교육청 안내자료는 3~4학년 국어 408시간의 증감 범위를 ±81로 적는다. 408의 20%는 81.6이니 소수점을 버린 것이다. 같은 자료는 학교자율시간을 3학년 986시간 나누기 34로 계산해 학기별 29시간, 5학년은 1,088 나누기 34로 32시간이라고 안내한다. 고시에는 없고 지침과 관행에만 있는 이런 세부가 실제 검산을 좌우한다.
어디서부터 만들 것인가
교육과정 편성 프로그램을 통째로 만들겠다고 하면 시작하지 못한다. 후보를 셋으로 나눠 본다.
| 후보 | 하는 일 | 필요한 데이터 | 난도 | 한 학교에서 바로 쓸 수 있는가 |
|---|---|---|---|---|
| 가. 시수 편성표 검증기 | 학년별 교과 시수를 붙여넣으면 기준 시수 대비 증감, 체육과 예술 감축 여부, 총 시수, 학교자율시간 분량을 검산한다 | 총론 표 1, 시도 지침의 계산 규칙 | 낮음 | 그렇다 |
| 나. 학사일정 요일 계산기 | 휴업일을 넣으면 수업일수와 요일별 수업 가능 일수를 세고, 주당 시간표를 곱해 연간 시수를 낸다 | 학교 학사일정 | 낮음 | 그렇다 |
| 다. 시간표 자동 배치 | 교사와 교실, 전담 시간을 넣어 주간 시간표를 짠다 | 교원 배정, 교실, 제약 조건 | 높음 | FET가 이미 한다 |
추천은 가 후보다. 규칙이 고시에 숫자로 적혀 있어 정답을 확인할 수 있고, 지난해 승인된 우리 학교 편성표가 곧 첫 테스트 사례가 된다. 나 후보는 가 후보의 입력을 만들어 주는 기능이라 두 번째 판에 붙인다. 엑셀로 내보내기는 세 번째다. 다 후보는 만들지 않는다. FET가 있는 영역에서 경쟁할 이유가 없다.
기술과 원칙
설치가 필요 없는 정적 웹앱으로 만든다. 학교 업무용 PC에는 프로그램을 깔기 어렵고, 서버가 없으면 운영비도 없다. GitHub Pages에 올리면 주소 하나로 끝난다.
입력한 편성표는 브라우저 안에만 둔다. 서버로 보내지 않으니 유출될 것도 없다. 학생 정보는 다루지 않는다는 문장을 README 첫 화면에 적는다. 이 도구가 받는 것은 교과명과 숫자, 날짜뿐이다. 나이스와 직접 연동하지도 않는다. 사람이 옮겨 적기 좋은 순서로 표를 내보내는 데서 멈춘다.
기준 시수는 코드에 넣지 않고 JSON 파일로 분리한다. 이 설계가 프로젝트의 중심이다.
{
"source": "교육부 고시 제2022-33호 [별책 1] 표 1",
"grades": "3-4",
"weeks": 34,
"subjects": {
"국어": 408, "사회/도덕": 272, "수학": 272, "과학/실과": 204,
"체육": 204, "예술(음악/미술)": 272, "영어": 136
},
"creative": 204,
"total_min": 1972,
"adjust_ratio": 0.2,
"no_reduce": ["체육", "예술(음악/미술)"]
}
코드를 모르는 교사도 이 파일은 읽고 고칠 수 있다. 모든 값에 출처 필드를 강제하면 리뷰하는 사람이 고시 쪽수와 대조할 수 있다.
라이선스는 코드에 MIT나 Apache-2.0을 붙인다. 특허 조항이 필요 없는 작은 도구라면 MIT로 충분하다. FET의 코드를 가져다 쓰면 AGPL을 따라야 하니 처음부터 섞지 않는다.
저장소와 기여 흐름
curriculum-check/
index.html
src/ 검산 로직
data/national/ 고시 기준 (학교급별 JSON)
data/regions/ 시도교육청 지침의 계산 규칙
tests/cases/ 익명화한 실제 편성표와 기대 결과
docs/ 사용법, 용어, 나이스 입력 순서
.github/ISSUE_TEMPLATE/ 기준 불일치 신고, 버그, 기능 제안
CONTRIBUTING.md
LICENSE
기여는 다음 순서로 흐른다.
- 이슈를 올린다. 템플릿은 세 가지다. 기준 불일치(“○○교육청 지침의 시수 기준이 다릅니다”), 버그, 기능 제안. 기준 불일치 템플릿은 근거 문서 이름과 쪽수를 필수로 받는다.
- 이슈 번호를 붙여 브랜치를 판다.
data/12-gyeonggi-rounding같은 식이다. - 한 커밋에 한 가지 변경만 담는다. 데이터 수정과 코드 수정을 섞지 않는다.
- PR을 보낸다. 본문에 닫을 이슈 번호와 근거 쪽수를 적는다.
- 리뷰한다. 데이터 PR은 리뷰어가 원문을 열어 숫자를 대조했다는 말을 남긴다. 테스트가 자동으로 돌아 기존 사례가 깨지지 않았는지 본다.
- 머지하고, 변경 기록에 기여자 이름을 적는다.
코드를 몰라도 할 수 있는 기여가 이 프로젝트에서는 더 많다.
| 기여 | 하는 일 | 필요한 것 |
|---|---|---|
| 기준 데이터 교정 | 고시 원문과 JSON 값을 대조해 틀린 숫자를 고친다 | 고시 원문, GitHub 웹 편집 |
| 시도 지침 추가 | 소속 교육청 편성 지침의 계산 규칙을 data/regions/에 넣는다 |
지침 문서와 쪽수 |
| 테스트 사례 | 승인받은 편성표를 학교명 없이 올리고 기대 결과를 적는다 | 지난해 편성표 |
| 문서 | 용어 풀이, 나이스 입력 순서, 자주 틀리는 지점을 쓴다 | 편성 경험 |
| 오류 신고 | 검산 결과가 교육청 점검 결과와 달랐던 경우를 이슈로 남긴다 | 화면 갈무리 |
베끼기 어려운 것은 교정 이력이다
검산 로직은 몇백 줄이다. AI에게 시키면 한두 시간에 나온다. 조언이 말한 그대로다. 저장소를 통째로 복제하는 데는 1분도 안 걸린다.
그런데 복제한 쪽은 다음 고시 개정 때 숫자를 고쳐 줄 사람을 데려가지 못한다. 어느 교육청이 소수점을 버리는지, 그 값을 누가 어느 문서 몇 쪽을 보고 넣었는지는 커밋 이력에 남고, 그 이력을 믿고 쓰는 학교가 생긴다. 틀린 값이 있을 때 이슈를 올려 주는 교사들도 원래 저장소로 온다. vinext가 가능했던 이유가 공개된 테스트 모음이었다면, 이 프로젝트에서 그 테스트 모음을 만드는 사람이 현장 교사다.
조언이 경험과 이름을 묶으라고 한 뜻도 이쯤에서 구체적으로 보인다. 연구부장으로 편성표를 몇 해 맞춰 본 교사가 관리하는 저장소라는 사실이 곧 신뢰의 근거다. 그 사실은 써 두지 않으면 아무도 모른다. README에 관리자가 누구이고 어떤 학교급을 맡아 왔는지 적고, 달마다 무엇을 고쳤는지 짧게 알리는 것으로 충분하다.
가상 사례, 연구부장 박 교사의 열 주
아래는 가상 사례다. 여섯 학급 초등학교의 연구부장 박 교사가 12월 첫 주에 시작해 2월 둘째 주까지 간다.
| 주차 | 누가 무엇을 하는가 | 이슈와 PR |
|---|---|---|
| 1주 | 박 교사가 저장소를 만들고 총론 표 1을 JSON으로 옮긴다. README에는 한 문장만 쓴다. 학년별 시수 편성표가 기준 안에 있는지 검산한다 | 이슈 #1 “3~4학년군 증감 범위를 자동으로 검산한다” |
| 2주 | 브랜치 feat/1-range-check에서 검산 화면을 만들고 스스로 PR을 올려 머지한다. 지난해 승인된 자기 학교 편성표를 넣어 결과가 같은지 본다 |
PR #2 “교과(군)별 20% 증감 검산 추가” |
| 3주 | 같은 학교 교무부장에게 주소를 보낸다. 체육을 줄여도 경고가 없다는 말을 듣고 박 교사가 대신 이슈로 적는다. 고친 뒤 그 편성표를 테스트 사례로 넣는다 | 이슈 #3 “체육 시수를 줄였는데 경고가 뜨지 않습니다”, PR #4 |
| 4주 | 학교자율시간 분량 계산을 넣는다. 블로그에 만들고 있는 것과 주소를 알리는 글을 한 편 쓴다 | PR #6 “학교자율시간 학기별 시수 계산 추가” |
| 5주 | 글을 본 다른 시도 교사가 첫 외부 이슈를 올린다. 박 교사는 근거 쪽수를 묻고 이슈 템플릿에 그 항목을 필수로 넣는다 | 이슈 #7 “○○교육청 지침의 학교자율시간 시수 기준이 다릅니다” |
| 6주 | 중학교 교사가 첫 외부 PR을 보낸다. 박 교사는 고시 표 2를 열어 합계 3,366을 대조하고 출처 필드가 빠진 한 줄을 고쳐 달라고 한 뒤 머지한다 | PR #9 “data: 중학교 시간 배당 기준 추가” |
| 7주 | 학사일정 요일 계산기를 붙인다. 휴업일을 붙여넣으면 수업일수와 요일별 일수가 나온다 | PR #11 “수업일수와 요일별 수업 가능 일수 계산” |
| 8주 | 경기도의 한 교사가 20% 계산에서 소수점을 버리는 규칙을 안내자료 쪽수와 함께 데이터로 보낸다. 코드는 한 줄도 건드리지 않은 PR이다 | PR #13 “data: 경기도 증감 범위 소수점 버림 규칙 추가” |
| 9주 | 엑셀 내보내기를 넣는다. 열 순서는 나이스에 옮겨 적는 순서를 따른다. 문서 기여자가 입력 순서 안내를 쓴다 | PR #15, PR #16 “docs: 나이스 입력 순서 안내” |
| 10주 | 박 교사가 학교 교육과정위원회 제출 전에 실제 편성표를 검산한다. 1.0 판에 태그를 달고 기여자 목록과 회고 글을 올린다 | 릴리스 v1.0 |
열 주 동안 박 교사가 쓴 코드는 많지 않다. 대신 이슈와 PR 열여섯 건의 이력이 남았고, 다른 학교 교사 세 사람이 데이터와 문서를 고쳤다.
중등으로 넓히는 길은 데이터 파일을 더하는 일이다. 중학교는 3년 총량과 자유학기 학기 지정을 본다. 고등학교는 시수가 학점으로 바뀌므로 192학점, 교과 174학점, 국어와 수학과 영어 합계 81학점 이하 같은 규칙을 검산하는 별도 화면이 필요하다. 수강신청과 선택 과목 배정은 범위 밖에 둔다.
지금 할 세 가지
첫째, 지난해 우리 학교 시수 편성표를 열어 한 학년군만 손으로 검산해 본다. 기준 시수, 20% 범위, 체육과 예술, 학교자율시간까지 따져 보면 어떤 규칙을 코드로 옮길지가 정해진다.
둘째, 공개 저장소를 만들고 README에 문제를 한 문장으로 적은 다음, 자기에게 이슈 하나를 올린다. 코드보다 이슈가 먼저다.
셋째, 그 이슈를 브랜치에서 풀어 PR로 머지하고, 무엇을 만들고 있는지 한 문단으로 알린다. 받는 사람은 옆 반 교사 한 명이면 된다. 두 번째 이슈는 그 사람에게서 나온다.
출처
- 교육부(2022). 초·중등학교 교육과정 총론. 교육부 고시 제2022-33호 [별책 1]. https://ezentextbook.co.kr/data/skin/respon_default/doc/2022_edu_pdf01.pdf
- 경기도교육청. 초등 학교자율시간 이해와 실제 안내자료. https://www.goe.go.kr/resource/goe/na/bbs_2675/2025/10/d57c08a1-82ff-4dfc-850a-300808142bc4.pdf
- 초등학교 2022 개정 교육과정 학교자율시간 과목 및 활동 개설 예시자료(경기도교육청 누리집 게시). https://www.goe.go.kr/resource/old/BBSMSTR_000000030136/BBS_202407240501133081.pdf
- 2022 개정 고등학교 교육과정 톺아보기(경기도교육청 누리집 게시). https://www.goe.go.kr/resource/old/BBSMSTR_000000030136/BBS_202403140548103972.pdf
- NEIS 교육정보 개방 포털, Open API 소개. https://open.neis.go.kr/portal/guide/apiIntroPage.do
- NEIS 교육정보 개방 포털, 학사일정 Open API. https://open.neis.go.kr/portal/data/service/selectServicePage.do?infId=OPEN17220190722175038389180&infSeq=2
- Cloudflare(2026-02-24). How we rebuilt Next.js with AI in one week. https://blog.cloudflare.com/vinext/
- O’Toole, P.(2026-02-07). The source code was the moat. But not anymore. https://philipotoole.com/the-source-code-was-the-moat-no-longer/
- Ma, B.(2026-02-27). The Open Core Paradox. Open Core Ventures. https://www.opencoreventures.com/blog/the-open-core-paradox
- FET Free Timetabling Software 공식 페이지. https://www.lalescu.ro/liviu/fet/
- UniTime 공식 페이지. https://www.unitime.org/
- aSc TimeTables 공식 페이지. https://www.asctimetables.com/
- 컴시간알리미 App Store 소개. https://apps.apple.com/kr/app/id6478664393
- leegeunhyeok/comcigan-parser. https://github.com/leegeunhyeok/comcigan-parser










