ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기연수·이벤트 통합 모니터링
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗교원 연수·이벤트 통합 모니터링 시스템.
티처빌(JSON API)·한국교원연수원(HTML+AJAX)·중앙교육연수원(HTML)·YBM의 공개 연수·이벤트 목록을 수집하고
브라우저에서 검색·필터·정렬하는 내부 테스트용 프로젝트.
⚠️ 비로그인 공개 데이터만 사용합니다. 운영 전 각 사이트의 이용약관 및 robots.txt를 반드시 확인하세요.
| 기관 | 연수 | 이벤트 |
|---|---|---|
| 티처빌 (teacherville) | ✅ | ✅ |
| 한국교원연수원 (hstudy) | ✅ | ✅ |
| 중앙교육연수원 (neti) | ✅ | — |
| YBM (ybm) | — | ✅ |
ice-planner-project/
├── course-api/ # Express.js REST API 서버 (보조)
└── course-next-api/ # Next.js 15 App Router (메인 앱)
외부 API(티처빌)를 래핑하는 보조 서버.
메인 애플리케이션.
디렉터리 구조:
course-next-api/
├── app/
│ ├── page.js # 컨트롤러 (상태·필터·정렬, UI 마크업 금지)
│ ├── globals.css
│ └── api/ # App Router API Routes (연수)
├── pages/api/ # 레거시 API Routes (이벤트)
├── components/ # UI 컴포넌트
└── lib/ # 수집·캐시·필터 로직
cd course-api
npm run dev # 개발 서버 (포트 3000)
npm start # 프로덕션
cd course-next-api
npm run dev # 개발 서버
npm run build # 빌드
npm start # 프로덕션
npm start -- -p 3010 # 포트 지정 실행
환경변수는 course-next-api/.env.local에 설정합니다.
| 변수명 | 설명 |
|---|---|
TEACHERVILLE_BASE_URL | 티처빌 베이스 URL |
LIST_CACHE_TTL_MS | 목록 캐시 유지 시간 (ms) |
DETAIL_CACHE_TTL_MS | 상세 캐시 유지 시간 (ms) |
REQUEST_DELAY_MS | 외부 요청 간격 (ms) |
PAGE_SIZE | 페이지당 수집 수 |
MAX_PAGES | 최대 수집 페이지 수 |
MAX_COURSE_COUNT | 최대 수집 강의 수 |
MAX_EXTERNAL_REQUESTS | 최대 외부 요청 횟수 |
app/api/)| 경로 | 설명 |
|---|---|
/api/all-courses | 티처빌 전체 목록 |
/api/ai-courses | 티처빌 AI 연수 목록 |
/api/hstudy-courses | 한국교원연수원 목록 |
/api/neti-courses | 중앙교육연수원 목록 |
/api/course/[goodsCode] | 티처빌 단건 상세 |
/api/recommend-ids | 추천 강의 ID 목록 |
pages/api/)| 경로 | 설명 |
|---|---|
/api/teacherville-events | 티처빌 이벤트 |
/api/hstudy-events | 한국교원연수원 이벤트 |
/api/ybm-events | YBM 이벤트 |
App Router 마이그레이션 전 구버전입니다.
app/api/내_*_backup/디렉터리는 비활성 백업본입니다.
components/)| 파일 | 역할 |
|---|---|
CourseCard.jsx | 연수 카드 · 검색어 하이라이트 · 즐겨찾기 별표 · 무료 배지 |
CourseList.jsx | 연수 목록 렌더링 |
CourseCardSkeleton.jsx | 연수 카드 로딩 스켈레톤 |
EventCard.jsx | 이벤트 카드 · 즐겨찾기 별표 · 마감 임박 배지 |
EventList.jsx | 이벤트 목록 렌더링 |
EventCardSkeleton.jsx | 이벤트 카드 로딩 스켈레톤 |
DetailPanel.jsx | 우측 연수 상세 패널 |
EmptyResult.jsx | 검색·필터 0건 빈 상태 UI |
CacheStatusPanel.jsx | 캐시 상태(meta) 표시 패널 |
UI 마크업은 반드시
components/에 둡니다.app/page.js는 컨트롤러 역할만 합니다.
localStorage(iceRecentSearches) 최신 8개, 입력창 포커스 시 드롭다운localStorage(iceFavorites, ID 배열). 연수·이벤트 공용, "★ 즐겨찾기만" 토글로 필터q · provider · sort · category · credit · price · type · tab · favURLSearchParams 복원, 상태 변경 시 window.history.replaceStatemarkNewCourses)price === 0| Provider | 방식 | 비고 |
|---|---|---|
| 티처빌 | JSON API (POST) | totalCount 기반 페이지 계산 |
| 한국교원연수원 | HTML + cheerio | sub2.asp → sub2_ajax.asp, loopCnt 반복 |
| 중앙교육연수원 | HTML + cheerio | pageIndex 기반 페이지네이션 |
| YBM | HTML + cheerio | 이벤트 전용 |
s / neti = n| 기능 | 티처빌 | 한국교원연수원 | 중앙교육연수원 | YBM |
|---|---|---|---|---|
| 연수 목록 | 가능 | 가능 | 가능 | 미지원 |
| 이벤트 목록 | 가능 | 가능 | 미지원 | 가능 |
| 상세 API | 가능 | 불가 | 불가 | — |
| 외부 상세 링크 | 가능 | 가능 | 가능 | 가능 |
| 패키지 연수 | 있음 | 없음 | 없음 | — |
| 리뷰/찜 수 | 있음 | 없음 | 없음 | — |
없는 데이터는 생성하지 않으며, provider별 기능 차이를 UI에 그대로 반영합니다.
상세는 티처빌만 내부 API를 사용하고, 나머지는 외부 페이지로 이동합니다 (detailUrl우선).
| 대상 | 유지 시간 |
|---|---|
| 목록 | 24시간 |
| 상세 | 1시간 |
| 추천 | 12시간 |
| 정렬 | 기준 |
|---|---|
| 최신순 | sortDate 내림차순 (없으면 뒤로) |
| 인기순 | reviewCount × 2 + wishCount |
| 추천순 | isRecommended × 100 + reviewCount × 3 + wishCount + (패키지 ? 10 : 0) |
icn1, 설정은 course-next-api/vercel.json)totalCount 하드코딩