ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
aiCourseList.edu 페이지 기준 목록 데이터를 조회합니다.
Translation pending
EducationJavaScript · CSSGitHub @jinwookseaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
연수·이벤트 통합 모니터링
Translation pending
Taken from the repository README
Loading the full README.
Read the full 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 하드코딩