이 페이지는 본인 강의용으로 비슷한 사이트를 직접 만들어보려는 강사를 위한 작업 기록입니다. 광고가 아니라 작업 순서입니다. Claude Code 라는 CLI 와 몇 개의 마크다운 파일을 사용했고, 아래 6단계로 진행했습니다.
터미널에서 다음 한 줄을 실행합니다. Node.js 18 이상이 필요합니다.
npm install -g @anthropic-ai/claude-code
설치 후 작업할 디렉토리로 이동해서 claude 명령으로 시작합니다. 첫 실행 때 브라우저로 로그인 창이 한 번 뜹니다.
$ mkdir my-course
$ cd my-course
$ claude
Claude Code 는 프로젝트 루트의 CLAUDE.md 와 .claude/agents/*.md 를 자동으로 읽습니다.
이 파일들이 「어떤 톤·구조·금기 사항」으로 작업할지 결정하므로, 비어 있으면 Claude 가 멋대로 「상품화된 광고 페이지」 같은 걸 만들어버립니다.
이 사이트에서 사용한 시작용 파일을 그대로 받아서 본인 주제로 수정하세요. 이 저장소는 public 입니다 — 강사 누구나 GitHub 에서 클론해 본인 강의 사이트를 만들 수 있도록 준비됐습니다.
받는 방법은 5 가지 — 모두 같은 파일을 받아오는 다른 경로일 뿐입니다. 본인 환경과 의도에 맞는 탭을 골라 그 명령만 따라하세요. 강의 사이트로 발전시킬 거면 E (권장) 또는 C 가 자연스럽습니다 — 자기 GitHub 계정에 자기 repo 가 생기므로 받은 그대로 push 해서 본인 강의 사이트로 키울 수 있습니다.
GitHub 페이지에서 초록색 "Use this template" 버튼 → "Create a new repository" → 본인 계정에 깨끗한 히스토리의 새 repo 가 생성됩니다 (이 저장소와 connection 없는 분리된 새 repo).
git clone https://github.com/<본인>/<새-repo-이름>.git
cd <새-repo-이름>
GitHub 페이지의 Fork 버튼 → 본인 계정에 fork (이 저장소와 upstream 연결).
git clone https://github.com/<본인>/course-template.git
cd course-template
E 와의 차이 — E 는 완전히 분리된 새 repo (강의 사이트 시작용), C 는 upstream 으로 묶인 fork (본 저장소에 개선 PR 보내고 싶을 때).
git clone https://github.com/icom009/course-template.git
cd course-template
자기 GitHub 계정이 없거나 push 할 곳이 따로 있을 때.
git clone --depth 1 https://github.com/icom009/course-template.git
cd course-template
A 와 동일하지만 커밋 히스토리 없이 받음 (용량 절약, 첫 시도에 가장 빠름).
git 안 깔린 환경용. 압축 풀면 course-template-main/ 폴더 생성 — .git 디렉토리 없으니 나중에 push 하려면 git init 다시 필요.
받은 다음 (5 가지 모두 공통) — 받은 그 폴더 안에 들어가서 (예: cd course-template) 다음 세 줄을 차례로 실행하세요. 각 줄이 뭘 하는지는 아래 설명을 참고하세요.
# 1. 본인 강의용 폴더를 새로 만들기
mkdir ~/<자기강의명>
# 2. starter 안의 내용물을 (숨김 파일까지) 그 폴더로 복사하기
cp -r starter/. ~/<자기강의명>/
# 3. 새로 만들어진 폴더로 이동해서 작업 시작
cd ~/<자기강의명>
위 명령이 각각 뭘 하는지
mkdir — make directory 의 줄임말. 새 폴더를 만든다 는 명령입니다. 파인더/탐색기에서 "새 폴더 만들기" 우클릭하는 것과 같은 일을 터미널에서 한 줄로 해요.
~ (틸드) — 본인 컴퓨터의 홈 디렉토리 약자입니다. macOS 면 /Users/이름, Linux/WSL 이면 /home/이름 자리. ~/spring-basic 이라고 쓰면 "내 홈 폴더 안의 spring-basic" 이라는 뜻.
<자기강의명> — 이 자리는 본인이 직접 채워넣는 placeholder 예요. 꺽쇠(< >) 는 표시용일 뿐이고 실제로는 빼고 적습니다.
mkdir ~/spring-basic · mkdir ~/react-intro · mkdir ~/data-eng-2026?, !, & 등) 는 이후 명령이 꼬일 수 있어 피하세요.cp -r 출처/. 대상/ — copy recursive. 출처 폴더 안의 파일·폴더 전부 를 대상으로 통째로 복사합니다.
-r 옵션이 없으면 하위 폴더는 못 따라갑니다 (recursive = 재귀적, 안의 안의 안까지)./. 가 약간 까다로운데, "이 폴더 안의 숨김 파일까지 포함한 모든 내용물" 이라는 뜻입니다. * 만 쓰면 .claude/ 같이 점(.) 으로 시작하는 폴더가 빠져버려서 6개 에이전트가 따라오지 않아요.cd — change directory. 그 폴더 안으로 들어간다 는 뜻이에요. 이 다음에 실행하는 명령은 모두 그 폴더 기준으로 동작합니다.
한 줄 요약 — "내 홈에 새 폴더 하나 만들고 → starter 알맹이를 거기로 옮긴 뒤 → 그리로 들어간다." 그게 끝입니다.
복사된 그 자리에 이미 6 개 에이전트가 박혀 있습니다. claude 한 번 실행하고 "커리큘럼 짜줘" 한 마디면 시작됩니다.
starter/CLAUDE.md — 프로젝트 규칙 (톤·금기·구조)starter/CODE-STANDARD.md — 코드 예제 표기 규칙starter/scripts/check-overflow.js — 슬라이드 페이지 넘침 검사.claude/agents/content-author.md.claude/agents/visual-designer.md.claude/agents/convention-auditor.md.claude/agents/flow-verifier.md.claude/agents/documentation-curator.md.claude/agents/layout-verifier.md받은 파일을 다음 구조로 프로젝트 루트에 둡니다.
my-course/
├── CLAUDE.md
├── CODE-STANDARD.md
├── scripts/
│ └── check-overflow.js
└── .claude/
└── agents/
├── content-author.md
├── visual-designer.md
├── convention-auditor.md
├── flow-verifier.md
├── documentation-curator.md
└── layout-verifier.md
.claude/ 폴더는 점(.) 으로 시작하므로 ls 에서 안 보일 수 있습니다. ls -a 로 확인하세요.
파일을 둔 다음 claude 명령으로 다시 들어가면 자동으로 인식합니다. 이후 「커리큘럼 짜줘」 라고 하면 content-author 에이전트가 호출됩니다.
각 에이전트의 역할은 파일 상단 frontmatter 에 적혀 있습니다. 본인 도메인에 맞춰 수정하세요 — 예를 들어 「Spring 기초 과정」 부분을 「JavaScript 기초」 로 바꾸는 식입니다.
여기가 이 메뉴얼에서 가장 중요한 단계입니다. 「커리큘럼 짜줘」 라고 한 번에 던지지 말고, 티키타카로 좁혀가야 학생이 풀 수 있는 산출물에 도달합니다. 처음부터 완벽한 프롬프트를 쓰려고 하지 말고, 그냥 평소 말하듯이 시작하세요.
실제로 다른 강사가 JavaScript 기초 강의를 만들 때의 대화를 그대로 옮긴 것입니다.
JavaScript 기초 강의를 만들고 싶어. 4주 정도 분량이고, 프로그래밍 처음 배우는 사람들이 대상이야.
좋아요. 4주 / 처음 배우는 사람 기준이면 보통 다음 정도가 무난합니다:
이게 너무 좁거나 넓다고 느껴지나요? 하루에 몇 시간씩 진행하나요?
하루 3시간씩, 주 2회. DOM 조작은 좀 어려울 것 같은데. 이전 학기에 비슷하게 했더니 학생들이 3주차에 다 떨어져나갔어.
그러면 DOM 을 줄이고 「언어 자체로 할 수 있는 일」 에 더 시간을 주는 게 맞겠습니다. 두 가지 방향이 가능해요:
textContent, onclick) 만 익히고, 4주차에 버튼 클릭으로 동작하는 미니게임 만들기이전 학기에 떨어져나간 이유가 「화면 조작이 안 떠올라서」 였는지, 「이벤트 개념을 못 따라와서」 였는지에 따라 답이 달라집니다.
이벤트 쪽이 문제였어. addEventListener 만 나오면 다들 멍해져.
그러면 B안에서 addEventListener 를 빼고 onclick 속성만 쓰는 형태로 가는 게 안전합니다. 마무리 산출물을 「숫자 맞히기 게임」 으로 잡고 v0 → v∞ 로 진화시키면:
prompt() 로 입력받아 비교onclick 으로 화면 위에서 동작이 진화 지도에 동의하시면 5단계 (Part 분할) 로 넘어가서 차시 수까지 견적 내겠습니다.
좋아 그렇게 가자.
위에서 본 것처럼, 좋은 결과는 「한 번에 받는 것」 이 아니라 「강사가 자기 학생을 알기 때문에 좁혀가는 것」 입니다. Claude 는 일반론을 줄 뿐이고, 「3주차에 다 떨어져나갔어」 같은 정보를 넣어주는 게 강사의 몫입니다.
이 단계의 산출물은 다음 한 줄입니다 — 한 줄로 정리되지 않으면 아직 5단계로 넘어가면 안 됩니다.
4주 / 입문 / 마무리 산출물 = 숫자 맞히기 게임 (v0→v3)
이벤트는 onclick 만, addEventListener 는 후속 과정으로 분리
4단계의 한 줄 정리를 Claude 에 다시 던지면, 받아둔 content-author 에이전트가 표를 그려줍니다. 이 표는 본인이 검토해서 직접 줄이거나 늘려야 합니다.
예시 — 위 JavaScript 강의의 진화 지도:
| 버전 | 마일스톤 | 위치 | 예상 차시 수 |
|---|---|---|---|
| v0 | 콘솔에 숫자 출력 | 1주차 전반 | 3 |
| v1 | prompt 입력 + 비교 | 1주차 후반 ~ 2주차 | 4 |
| v2 | 버튼 클릭으로 동작 | 3주차 | 4 |
| v3 | 시도 기록 + 힌트 | 4주차 | 3 |
| v∞ | 디버깅 워크숍 | 4주차 마지막 | 1 |
이 단계에서 자주 하는 실수는 v 단계를 너무 잘게 쪼개는 것 입니다. v 가 늘어날수록 「이번 시간 우리가 어디로 진화하는가」 의 변화 폭이 작아져서 학생이 「지난 시간이랑 똑같은데?」 라고 느낍니다. 한 v 안에서는 눈에 띄는 변화 — 화면이 달라지거나 새 입력이 추가되거나 — 가 일어나야 합니다.
Part 분할은 CLAUDE.md 의 Part 약어 표 에 기록합니다. 본인 강의에 맞춰 약어와 색상을 바꾸세요. 이 표가 곧 index.html 의 카드 색상이 됩니다.
중간 점검 — 6단계로 넘어가기 전: 본인 코스의 1~2 차시 가 만들어진 시점에 making/spring/ 의 같은 위치 (예: Part 1 의 첫 차시 4종 자료 — 슬라이드·예제·실습·핸드아웃) 를 한 번 열어 톤·구조·흐름도를 비교하세요.
"같은 4단계 구조가 내 코스에서도 잘 흐르는가?" 만 확인하고 전체 차시를 이어가면 후반부 재작업이 크게 줄어듭니다.
4·5단계에서 정한 「마무리 산출물」 의 도메인 모델을 한 번 정해두지 않으면, Claude 가 슬라이드마다 다른 변수명·다른 클래스명을 쓰게 됩니다. 받은 CODE-STANDARD.md 를 본인 강의에 맞춰 수정합니다.
# CODE-STANDARD.md 예시 (JavaScript 강의)
## 도메인
- 게임 객체 변수명은 `game`
- 답 변수명은 `answer` (`target`, `secret` 금지)
- 사용자 입력 변수명은 `guess`
## 표기
- 셸 입력: `$ ` 접두사
- 콘솔 출력: 접두사 없음
- 함수명: camelCase
슬라이드 안의 빈 블록은 누락이 아닙니다 — 슬라이드 템플릿(starter/slides/template.html) 안에 보이는 <div data-infographic="..."> 빈 블록은 본문 작성 단계에서는 의도적으로 비워 둔 자리입니다.
content-author 가 본문을 채운 뒤 visual-designer 에이전트 가 이 자리를 인포그래픽 SVG 또는 실사 이미지로 자동으로 채워 넣습니다 (js/infographics.js 에 등록).
"내용이 빠졌나?" 싶은 칸이 보이면 거의 다 이 자리표시입니다.
슬라이드와 예제에 들어갈 다이어그램은 가능하면 HTML/CSS 로 그리는 텍스트 다이어그램 으로 처리하는 게 안전합니다 — 외부 이미지를 쓰면 라이선스·해상도·다크모드 호환을 매번 확인해야 합니다.
그래도 외부 이미지가 필요하면 다음 출처가 비교적 안전합니다.
| 출처 | 라이선스 | 비고 |
|---|---|---|
| Unsplash | Unsplash License | 상업적 사용 가능, 출처 표기 권장 |
| Wikimedia Commons | 이미지마다 다름 | 각 파일 페이지 라이선스 확인 필수 |
| 본인이 직접 캡처 | 본인 소유 | 가장 안전. IDE 스크린샷 등 |
이 사이트에서는 외부 이미지를 거의 쓰지 않았고, 대부분 .flow-diagram / .box 같은 텍스트 다이어그램으로 처리했습니다.
이 Spring 기초 사이트가 실제로 어떻게 만들어졌는지 — 어떤 대화를 했고, 어디서 삽질했고, 토큰을 얼마나 썼는지 → behind-the-scenes 페이지
위 6단계가 이론이라면, 저 페이지는 그 이론대로 (또는 거꾸로) 진행한 실제 기록입니다.